35 #if !defined(LIBEVOCOSM_FUZZY_MACHINE_H)
36 #define LIBEVOCOSM_FUZZY_MACHINE_H
49 #include "evocommon.h"
50 #include "fsm_tools.h"
68 template <
size_t InSize,
size_t OutSize>
82 tranout_t(
double * state_weights,
size_t num_states,
double * output_weights)
83 : m_new_state(state_weights, num_states),
84 m_output(output_weights, OutSize)
91 : m_new_state(source.m_new_state),
92 m_output(source.m_output)
118 double a_output_base,
119 double a_output_range,
121 double a_state_range);
173 void mutate(
double a_rate);
182 static void set_mutation_weight(mutation_id a_type,
double a_weight);
191 size_t transition(
size_t a_input);
213 const tranout_t & get_transition(
size_t a_state,
size_t a_input)
const;
220 size_t num_input_states()
const;
227 size_t num_output_states()
const;
234 size_t init_state()
const;
241 size_t current_state()
const;
256 return m_state_table;
260 void dump(
const char * description, ostream & a_stream = cerr)
const;
300 template <
size_t InSize,
size_t OutSize>
304 template <
size_t InSize,
size_t OutSize>
307 for (
size_t s = 0; s < m_size; ++s)
309 for (
size_t i = 0; i < InSize; ++i)
310 delete m_state_table[s][i];
312 delete [] m_state_table[s];
315 delete [] m_state_table;
319 template <
size_t InSize,
size_t OutSize>
320 void fuzzy_machine<InSize,OutSize>::deep_copy(
const fuzzy_machine<InSize,OutSize> & a_source)
323 m_state_table =
new tranout_t ** [m_size];
325 for (
size_t s = 0; s < m_size; ++s)
328 m_state_table[s] =
new tranout_t * [InSize];
331 for (
size_t i = 0; i < InSize; ++i)
332 m_state_table[s][i] =
new tranout_t(*(a_source.m_state_table[s][i]));
337 template <
size_t InSize,
size_t OutSize>
339 double a_output_base,
340 double a_output_range,
342 double a_state_range)
343 : m_state_table(NULL),
347 m_output_base(a_output_base),
348 m_output_range(a_output_range),
349 m_state_base(a_state_base),
350 m_state_range(a_state_range)
354 throw std::runtime_error(
"invalid fuzzy_machine creation parameters");
360 double * output_weights =
new double[OutSize];
361 double * state_weights =
new double[
m_size];
363 for (
size_t s = 0; s <
m_size; ++s)
368 for (
size_t i = 0; i < InSize; ++i)
373 for (n = 0; n < OutSize; ++n)
376 for (n = 0; n <
m_size; ++n)
384 delete [] output_weights;
385 delete [] state_weights;
393 template <
size_t InSize,
size_t OutSize>
395 : m_state_table(NULL),
400 m_output_range(100.0),
406 throw std::runtime_error(
"invalid fuzzy_machine creation parameters");
412 double * output_weights =
new double[OutSize];
413 double * state_weights =
new double[
m_size];
415 for (
size_t s = 0; s <
m_size; ++s)
420 for (
size_t i = 0; i < InSize; ++i)
425 for (n = 0; n < OutSize; ++n)
426 output_weights[n] = 1.0;
430 for (n = 0; n <
m_size; ++n)
431 state_weights[n] = 1.0;
440 delete [] output_weights;
441 delete [] state_weights;
449 template <
size_t InSize,
size_t OutSize>
451 : m_state_table(NULL),
452 m_size(a_parent1.m_size),
455 m_output_base(a_parent1.m_output_base),
456 m_output_range(a_parent1.m_output_range),
457 m_state_base(a_parent1.m_state_base),
458 m_state_range(a_parent1.m_state_range)
461 cerr <<
"\n<< crossover operation >>\n";
462 a_parent1.dump(
"PARENT1");
463 a_parent2.dump(
"PARENT2");
467 deep_copy(a_parent1);
470 if ((a_parent1.
m_size != a_parent2.
m_size) || (&a_parent1 == &a_parent2))
477 cerr <<
"crossover at " << x <<
"\n";
480 for (
size_t n = x; n <
m_size; ++n)
483 for (
size_t i = 0; i < InSize; ++i)
505 template <
size_t InSize,
size_t OutSize>
507 : m_state_table(NULL),
508 m_size(a_source.m_size),
509 m_init_state(a_source.m_init_state),
510 m_current_state(a_source.m_current_state),
511 m_output_base(a_source.m_output_base),
512 m_output_range(a_source.m_output_range),
513 m_state_base(a_source.m_state_base),
514 m_state_range(a_source.m_state_range)
521 template <
size_t InSize,
size_t OutSize>
528 template <
size_t InSize,
size_t OutSize>
550 template <
size_t InSize,
size_t OutSize>
553 g_selector.set_weight(a_type,a_weight);
557 template <
size_t InSize,
size_t OutSize>
563 cerr <<
"\n<< mutation operation >>\n";
567 for (
size_t n = 0; n < m_size; ++n)
569 if (g_random.get_real() < a_rate)
572 switch (g_selector.get_index())
574 case MUTATE_OUTPUT_SYMBOL:
577 size_t state = rand_index(m_size);
578 size_t input = rand_index(InSize);
579 size_t index = rand_index(OutSize);
582 cerr <<
"MUTATE_OUTPUT_SYMBOL, state " << state <<
", input " << input <<
", index " << index <<
"\n";
585 double new_weight = m_output_base + m_output_range * g_random.get_real();
586 m_state_table[state][input]->m_output.set_weight(index,new_weight);
589 case MUTATE_TRANSITION:
592 size_t state = rand_index(m_size);
593 size_t input = rand_index(InSize);
594 size_t index = rand_index(m_size);
597 cerr <<
"MUTATE_TRANSITION, state " << state <<
", input " << input <<
", index " << index <<
"\n";
600 double new_weight = m_state_base + m_state_range * g_random.get_real();
601 m_state_table[state][input]->m_new_state.set_weight(index,new_weight);
604 case MUTATE_REPLACE_STATE:
607 size_t state = rand_index(m_size);
610 cerr <<
"REPLACE_STATE, state " << state <<
"\n";
614 delete [] m_state_table[state];
615 m_state_table[state] =
new tranout_t * [InSize];
618 double * output_weights =
new double[OutSize];
619 double * state_weights =
new double[m_size];
621 for (
size_t i = 0; i < InSize; ++i)
626 for (n = 0; n < OutSize; ++n)
627 output_weights[n] = 1.0;
629 output_weights[rand_index(OutSize)] = 100.0;
631 for (n = 0; n < m_size; ++n)
632 state_weights[n] = 1.0;
634 state_weights[rand_index(m_size)] = 100.0;
637 m_state_table[state][i] =
new tranout_t(state_weights,m_size,output_weights);
640 delete [] output_weights;
641 delete [] state_weights;
645 case MUTATE_SWAP_STATES:
648 size_t state1 = rand_index(m_size);
652 state2 =
static_cast<size_t>(rand_index(m_size));
653 while (state2 == state1);
656 cerr <<
"MUTATE_SWAP_STATES, " << state1 <<
" with " << state2 <<
"\n";
659 for (
size_t i = 0; i < InSize; ++i)
661 tranout_t * temp = m_state_table[state1][i];
662 m_state_table[state1][i] = m_state_table[state2][i];
663 m_state_table[state2][i] = temp;
668 case MUTATE_INIT_STATE:
672 cerr <<
"MUTATE_INIT_STATE\n";
674 m_init_state = rand_index(m_size);
679 cerr <<
"UNKNOWN MUTATION!\n";
687 m_current_state = m_init_state;
694 template <
size_t InSize,
size_t OutSize>
698 size_t output = m_state_table[m_current_state][a_input]->m_output.get_index();
701 m_current_state = m_state_table[m_current_state][a_input]->m_new_state.get_index();
708 template <
size_t InSize,
size_t OutSize>
711 m_current_state = m_init_state;
715 template <
size_t InSize,
size_t OutSize>
722 template <
size_t InSize,
size_t OutSize>
725 return *m_state_table[a_state][a_input];
729 template <
size_t InSize,
size_t OutSize>
736 template <
size_t InSize,
size_t OutSize>
743 template <
size_t InSize,
size_t OutSize>
750 template <
size_t InSize,
size_t OutSize>
753 return m_current_state;
757 template <
size_t InSize,
size_t OutSize>
760 a_stream <<
"----------\nDumping machine " << description <<
" (" << hex <<
this
761 <<
")\ninitial state = " << m_init_state
762 <<
"\ncurrent state = " << m_current_state <<
"\n\n";
764 for (
size_t s = 0; s < m_size; ++s)
766 a_stream <<
"state " << s;
768 for (
size_t i = 0; i < InSize; ++i)
772 a_stream <<
"\n output weights:";
774 for (n = 0; n < OutSize; ++n)
775 a_stream <<
" " << m_state_table[s][i]->m_output.get_weight(n);
777 a_stream <<
"\n state weights:";
779 for (n = 0; n < m_size; ++n)
780 a_stream <<
" " << m_state_table[s][i]->m_new_state.get_weight(n);
786 a_stream <<
"----------" << endl;
double m_output_base
base value for output weights
Definition: fuzzy_machine.h:284
size_t m_current_state
Current state.
Definition: fuzzy_machine.h:281
size_t init_state() const
Get initial state.
Definition: fuzzy_machine.h:744
size_t m_size
Number of states.
Definition: fuzzy_machine.h:275
Wraps a roulette wheel for selecting mutations.
Definition: fsm_tools.h:77
void mutate(double a_rate)
Mutation.
Definition: fuzzy_machine.h:558
void reset()
Reset to start-up state.
Definition: fuzzy_machine.h:709
double m_state_base
base value for state weights
Definition: fuzzy_machine.h:290
static size_t rand_index(size_t n)
Static function to allow use of g_random function pointer in random_shuffle.
Definition: evocommon.h:119
tranout_t *** state_table()
Get current transition table.
Definition: fuzzy_machine.h:254
A set of common tools for finite state machines.
Definition: fsm_tools.h:47
roulette_wheel m_new_state
The state to be transitioned to.
Definition: fuzzy_machine.h:76
fuzzy_machine(size_t a_size, double a_output_base, double a_output_range, double a_state_base, double a_state_range)
Creation constructor.
Definition: fuzzy_machine.h:338
double m_state_range
range for state weights
Definition: fuzzy_machine.h:293
double get_real()
get the next value in the range [0,1)
Definition: evocommon.h:104
roulette_wheel m_output
The output value.
Definition: fuzzy_machine.h:79
static mutation_selector g_selector
Global mutation selector.
Definition: fuzzy_machine.h:296
const tranout_t & get_transition(size_t a_state, size_t a_input) const
Get a transition from the internal state table.
Definition: fuzzy_machine.h:723
tranout_t(double *state_weights, size_t num_states, double *output_weights)
Creation Constructor.
Definition: fuzzy_machine.h:82
static void set_mutation_weight(mutation_id a_type, double a_weight)
Set a mutation weight.
Definition: fuzzy_machine.h:551
static prng g_random
A shared random number generator.
Definition: evocommon.h:125
size_t transition(size_t a_input)
Cause state transition.
Definition: fuzzy_machine.h:695
double m_output_range
range for output weights
Definition: fuzzy_machine.h:287
size_t m_init_state
Initial state.
Definition: fuzzy_machine.h:278
virtual ~fuzzy_machine()
Virtual destructor.
Definition: fuzzy_machine.h:522
A toolkit and framework for implementing evolutionary algorithms.
Definition: evocommon.h:60
size_t current_state() const
Get current state.
Definition: fuzzy_machine.h:751
Defines a transition and output state pair.
Definition: fuzzy_machine.h:73
size_t size() const
Get size.
Definition: fuzzy_machine.h:716
Elements shared by all classes in Evocosm.
Definition: evocommon.h:115
tranout_t *** m_state_table
State table (the machine definition)
Definition: fuzzy_machine.h:272
tranout_t(const tranout_t &source)
Copy constructor.
Definition: fuzzy_machine.h:90
mutation_id
Types of mutation supported.
Definition: fsm_tools.h:51
A simulated roulette wheel for weighted selection.
Definition: roulette.h:71
size_t num_output_states() const
Get number of output states.
Definition: fuzzy_machine.h:737
fuzzy_machine & operator=(const fuzzy_machine< InSize, OutSize > &a_source)
Definition: fuzzy_machine.h:529
size_t num_input_states() const
Get number of input states.
Definition: fuzzy_machine.h:730
A finite state machine.
Definition: fuzzy_machine.h:69