53 #if !defined(LIBEVOCOSM_SIMPLE_FSM_H)
54 #define LIBEVOCOSM_SIMPLE_FSM_H
63 #include "evocommon.h"
64 #include "machine_tools.h"
77 template <
size_t InSize,
size_t OutSize>
141 void mutate(
double a_rate);
150 static void set_mutation_weight(
mutation_id a_type,
double a_weight);
159 size_t transition(
size_t a_input);
181 const tranout_t & get_transition(
size_t a_state,
size_t a_input)
const;
188 size_t num_input_states()
const;
195 size_t num_output_states()
const;
202 size_t init_state()
const;
209 size_t current_state()
const;
236 template <
size_t InSize,
size_t OutSize>
240 template <
size_t InSize,
size_t OutSize>
243 for (
size_t s = 0; s < m_size; ++s)
244 delete [] m_state_table[s];
246 delete [] m_state_table;
250 template <
size_t InSize,
size_t OutSize>
251 void simple_machine<InSize,OutSize>::deep_copy(
const simple_machine<InSize,OutSize> & a_source)
254 m_state_table =
new tranout_t * [m_size];
256 for (
size_t s = 0; s < m_size; ++s)
259 m_state_table[s] =
new tranout_t [InSize];
262 for (
size_t i = 0; i < InSize; ++i)
265 m_state_table[s][i].m_output = a_source.m_state_table[s][i].m_output;
271 template <
size_t InSize,
size_t OutSize>
273 : m_state_table(NULL),
280 throw std::runtime_error(
"invalid simple_machine creation parameters");
285 for (
size_t s = 0; s <
m_size; ++s)
291 for (
size_t i = 0; i < InSize; ++i)
304 template <
size_t InSize,
size_t OutSize>
306 : m_state_table(NULL),
309 m_size(a_parent1.m_size)
312 deep_copy(a_parent1);
321 for (
size_t n = x; n <
m_size; ++n)
324 for (
size_t i = 0; i < InSize; ++i)
342 template <
size_t InSize,
size_t OutSize>
344 : m_state_table(NULL),
345 m_init_state(a_source.m_init_state),
346 m_current_state(a_source.m_current_state),
347 m_size(a_source.m_size)
354 template <
size_t InSize,
size_t OutSize>
361 template <
size_t InSize,
size_t OutSize>
379 template <
size_t InSize,
size_t OutSize>
382 g_selector.set_weight(a_type,a_weight);
386 template <
size_t InSize,
size_t OutSize>
391 for (
size_t n = 0; n < m_size; ++n)
393 if (g_random.get_real() < a_rate)
396 switch (g_selector.get_index())
398 case MUTATE_OUTPUT_SYMBOL:
401 size_t state = rand_index(m_size);
402 size_t input = rand_index(InSize);
408 choice = rand_index(OutSize);
410 while (m_state_table[state][input].m_output == choice);
412 m_state_table[state][input].m_output = choice;
415 case MUTATE_TRANSITION:
418 size_t state = rand_index(m_size);
419 size_t input = rand_index(InSize);
425 choice = rand_index(m_size);
427 while (m_state_table[state][input].m_new_state == choice);
429 m_state_table[state][input].m_new_state = choice;
432 case MUTATE_REPLACE_STATE:
435 size_t state = rand_index(m_size);
438 delete [] m_state_table[state];
439 m_state_table[state] =
new tranout_t [InSize];
442 for (
size_t i = 0; i < InSize; ++i)
444 m_state_table[state][i].
m_new_state = rand_index(m_size);
445 m_state_table[state][i].m_output = rand_index(OutSize);
450 case MUTATE_SWAP_STATES:
453 size_t state1 = rand_index(m_size);
457 state2 = rand_index(m_size);
458 while (state2 == state1);
460 for (
size_t i = 0; i < InSize; ++i)
462 tranout_t temp = m_state_table[state1][i];
463 m_state_table[state1][i] = m_state_table[state2][i];
464 m_state_table[state2][i] = temp;
469 case MUTATE_INIT_STATE:
476 choice = rand_index(m_size);
478 while (m_init_state == choice);
480 m_init_state = choice;
489 m_current_state = m_init_state;
493 template <
size_t InSize,
size_t OutSize>
497 size_t output = m_state_table[m_current_state][a_input].m_output;
500 m_current_state = m_state_table[m_current_state][a_input].m_new_state;
507 template <
size_t InSize,
size_t OutSize>
510 m_current_state = m_init_state;
514 template <
size_t InSize,
size_t OutSize>
521 template <
size_t InSize,
size_t OutSize>
524 return m_state_table[a_state][a_input];
528 template <
size_t InSize,
size_t OutSize>
535 template <
size_t InSize,
size_t OutSize>
542 template <
size_t InSize,
size_t OutSize>
549 template <
size_t InSize,
size_t OutSize>
552 return m_current_state;
Wraps a roulette wheel for selecting mutations.
Definition: machine_tools.h:95
size_t size() const
Get size.
Definition: simple_machine.h:515
Defines a transition and output state pair.
Definition: simple_machine.h:82
size_t num_output_states() const
Get number of output states.
Definition: simple_machine.h:536
mutation_id
Types of mutation supported.
Definition: machine_tools.h:69
static void set_mutation_weight(mutation_id a_type, double a_weight)
Set a mutation weight.
Definition: simple_machine.h:380
A set of common tools for finite state machines.
Definition: machine_tools.h:65
size_t m_output
The output value.
Definition: simple_machine.h:88
static mutation_selector g_selector
Global mutation selector.
Definition: simple_machine.h:232
simple_machine & operator=(const simple_machine< InSize, OutSize > &a_source)
Definition: simple_machine.h:362
tranout_t ** m_state_table
State table (the machine definition)
Definition: simple_machine.h:220
A toolkit and framework for implementing evolutionary algorithms.
Definition: analyzer.h:60
simple_machine(size_t a_size)
Creation constructor.
Definition: simple_machine.h:272
void reset()
Reset to start-up state.
Definition: simple_machine.h:508
Elements shared by all classes in Evocosm.
Definition: evocommon.h:117
size_t current_state() const
Get current state.
Definition: simple_machine.h:550
static prng g_random
A shared random number generator.
Definition: evocommon.h:127
size_t m_current_state
Current state.
Definition: simple_machine.h:226
const tranout_t & get_transition(size_t a_state, size_t a_input) const
Get a transition from the internal state table.
Definition: simple_machine.h:522
size_t m_new_state
The state to be transitioned to.
Definition: simple_machine.h:85
size_t init_state() const
Get initial state.
Definition: simple_machine.h:543
static size_t rand_index(size_t n)
Static function to allow use of g_random function pointer in random_shuffle.
Definition: evocommon.h:121
size_t m_init_state
Initial state.
Definition: simple_machine.h:223
void mutate(double a_rate)
Mutation.
Definition: simple_machine.h:387
size_t num_input_states() const
Get number of input states.
Definition: simple_machine.h:529
double get_real()
get the next value in the range [0,1)
Definition: evocommon.h:106
size_t m_size
Number of states.
Definition: simple_machine.h:229
size_t transition(size_t a_input)
Cause state transition.
Definition: simple_machine.h:494
virtual ~simple_machine()
Virtual destructor.
Definition: simple_machine.h:355
A simple finite state machine with integer-indexed states.
Definition: simple_machine.h:78