53 #if !defined(LIBEVOCOSM_FUZZY_MACHINE_H) 54 #define LIBEVOCOSM_FUZZY_MACHINE_H 67 #include "evocommon.h" 68 #include "machine_tools.h" 86 template <
size_t InSize,
size_t OutSize>
100 tranout_t(
double * state_weights,
size_t num_states,
double * output_weights)
101 : m_new_state(state_weights, num_states),
102 m_output(output_weights, OutSize)
109 : m_new_state(source.m_new_state),
110 m_output(source.m_output)
136 double a_output_base,
137 double a_output_range,
139 double a_state_range);
191 void mutate(
double a_rate);
200 static void set_mutation_weight(
mutation_id a_type,
double a_weight);
209 size_t transition(
size_t a_input);
231 const tranout_t & get_transition(
size_t a_state,
size_t a_input)
const;
238 size_t num_input_states()
const;
245 size_t num_output_states()
const;
252 size_t init_state()
const;
259 size_t current_state()
const;
274 return m_state_table;
278 void dump(
const char * description, ostream & a_stream = cerr)
const;
318 template <
size_t InSize,
size_t OutSize>
322 template <
size_t InSize,
size_t OutSize>
325 for (
size_t s = 0; s < m_size; ++s)
327 for (
size_t i = 0; i < InSize; ++i)
328 delete m_state_table[s][i];
330 delete [] m_state_table[s];
333 delete [] m_state_table;
337 template <
size_t InSize,
size_t OutSize>
341 m_state_table =
new tranout_t ** [m_size];
343 for (
size_t s = 0; s < m_size; ++s)
346 m_state_table[s] =
new tranout_t * [InSize];
349 for (
size_t i = 0; i < InSize; ++i)
355 template <
size_t InSize,
size_t OutSize>
357 double a_output_base,
358 double a_output_range,
360 double a_state_range)
361 : m_state_table(NULL),
365 m_output_base(a_output_base),
366 m_output_range(a_output_range),
367 m_state_base(a_state_base),
368 m_state_range(a_state_range)
372 throw std::runtime_error(
"invalid fuzzy_machine creation parameters");
378 double * output_weights =
new double[OutSize];
379 double * state_weights =
new double[
m_size];
381 for (
size_t s = 0; s <
m_size; ++s)
386 for (
size_t i = 0; i < InSize; ++i)
391 for (n = 0; n < OutSize; ++n)
394 for (n = 0; n <
m_size; ++n)
402 delete [] output_weights;
403 delete [] state_weights;
411 template <
size_t InSize,
size_t OutSize>
424 throw std::runtime_error(
"invalid fuzzy_machine creation parameters");
430 double * output_weights =
new double[OutSize];
431 double * state_weights =
new double[
m_size];
433 for (
size_t s = 0; s <
m_size; ++s)
438 for (
size_t i = 0; i < InSize; ++i)
443 for (n = 0; n < OutSize; ++n)
444 output_weights[n] = 1.0;
448 for (n = 0; n <
m_size; ++n)
449 state_weights[n] = 1.0;
458 delete [] output_weights;
459 delete [] state_weights;
467 template <
size_t InSize,
size_t OutSize>
479 cerr <<
"\n<< crossover operation >>\n";
480 a_parent1.dump(
"PARENT1");
481 a_parent2.dump(
"PARENT2");
485 deep_copy(a_parent1);
488 if ((a_parent1.
m_size != a_parent2.
m_size) || (&a_parent1 == &a_parent2))
495 cerr <<
"crossover at " << x <<
"\n";
498 for (
size_t n = x; n <
m_size; ++n)
501 for (
size_t i = 0; i < InSize; ++i)
523 template <
size_t InSize,
size_t OutSize>
539 template <
size_t InSize,
size_t OutSize>
546 template <
size_t InSize,
size_t OutSize>
568 template <
size_t InSize,
size_t OutSize>
575 template <
size_t InSize,
size_t OutSize>
581 cerr <<
"\n<< mutation operation >>\n";
585 for (
size_t n = 0; n <
m_size; ++n)
600 cerr <<
"MUTATE_OUTPUT_SYMBOL, state " << state <<
", input " << input <<
", index " << index <<
"\n";
615 cerr <<
"MUTATE_TRANSITION, state " << state <<
", input " << input <<
", index " << index <<
"\n";
628 cerr <<
"REPLACE_STATE, state " << state <<
"\n";
636 double * output_weights =
new double[OutSize];
637 double * state_weights =
new double[
m_size];
639 for (
size_t i = 0; i < InSize; ++i)
644 for (n = 0; n < OutSize; ++n)
645 output_weights[n] = 1.0;
649 for (n = 0; n <
m_size; ++n)
650 state_weights[n] = 1.0;
658 delete [] output_weights;
659 delete [] state_weights;
670 state2 =
static_cast<size_t>(
rand_index(m_size));
671 while (state2 == state1);
674 cerr <<
"MUTATE_SWAP_STATES, " << state1 <<
" with " << state2 <<
"\n";
677 for (
size_t i = 0; i < InSize; ++i)
690 cerr <<
"MUTATE_INIT_STATE\n";
697 cerr <<
"UNKNOWN MUTATION!\n";
712 template <
size_t InSize,
size_t OutSize>
726 template <
size_t InSize,
size_t OutSize>
733 template <
size_t InSize,
size_t OutSize>
740 template <
size_t InSize,
size_t OutSize>
747 template <
size_t InSize,
size_t OutSize>
754 template <
size_t InSize,
size_t OutSize>
761 template <
size_t InSize,
size_t OutSize>
768 template <
size_t InSize,
size_t OutSize>
775 template <
size_t InSize,
size_t OutSize>
778 a_stream <<
"----------\nDumping machine " << description <<
" (" << hex <<
this 782 for (
size_t s = 0; s <
m_size; ++s)
784 a_stream <<
"state " << s;
786 for (
size_t i = 0; i < InSize; ++i)
790 a_stream <<
"\n output weights:";
792 for (n = 0; n < OutSize; ++n)
793 a_stream <<
" " <<
m_state_table[s][i]->m_output.get_weight(n);
795 a_stream <<
"\n state weights:";
797 for (n = 0; n <
m_size; ++n)
798 a_stream <<
" " <<
m_state_table[s][i]->m_new_state.get_weight(n);
804 a_stream <<
"----------" << endl;
size_t num_input_states() const
Get number of input states.
Definition: fuzzy_machine.h:748
size_t num_output_states() const
Get number of output states.
Definition: fuzzy_machine.h:755
size_t m_size
Number of states.
Definition: fuzzy_machine.h:293
roulette_wheel m_new_state
The state to be transitioned to.
Definition: fuzzy_machine.h:94
Wraps a roulette wheel for selecting mutations.
Definition: machine_tools.h:95
size_t size() const
Get size.
Definition: fuzzy_machine.h:734
double m_state_base
base value for state weights
Definition: fuzzy_machine.h:308
A toolkit and framework for implementing evolutionary algorithms.
Definition: analyzer.h:60
Mutate that initial state.
Definition: machine_tools.h:75
size_t transition(size_t a_input)
Cause state transition.
Definition: fuzzy_machine.h:713
Swap two states.
Definition: machine_tools.h:74
tranout_t(double *state_weights, size_t num_states, double *output_weights)
Creation Constructor.
Definition: fuzzy_machine.h:100
virtual ~fuzzy_machine()
Virtual destructor.
Definition: fuzzy_machine.h:540
void set_weight(mutation_id a_type, double &a_new_weight)
Change a given weight.
Definition: machine_tools.h:148
size_t m_init_state
Initial state.
Definition: fuzzy_machine.h:296
Mutate a state transition.
Definition: machine_tools.h:72
tranout_t *** state_table()
Get current transition table.
Definition: fuzzy_machine.h:272
double set_weight(size_t a_index, double a_weight)
Change the weight assigned to an entry.
size_t m_current_state
Current state.
Definition: fuzzy_machine.h:299
size_t get_index() const
Get a mutation index.
Definition: machine_tools.h:159
size_t init_state() const
Get initial state.
Definition: fuzzy_machine.h:762
mutation_id
Types of mutation supported.
Definition: machine_tools.h:69
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:741
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
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:356
fuzzy_machine & operator=(const fuzzy_machine< InSize, OutSize > &a_source)
Definition: fuzzy_machine.h:547
Defines a transition and output state pair.
Definition: fuzzy_machine.h:91
tranout_t *** m_state_table
State table (the machine definition)
Definition: fuzzy_machine.h:290
A set of common tools for finite state machines.
Definition: machine_tools.h:65
static prng g_random
A shared random number generator.
Definition: evocommon.h:127
Replace a new state with a randomly-generated one.
Definition: machine_tools.h:73
Elements shared by all classes in Evocosm.
Definition: evocommon.h:117
size_t get_index() const
Retrieve a random index.
A simulated roulette wheel for weighted selection.
Definition: roulette.h:89
size_t current_state() const
Get current state.
Definition: fuzzy_machine.h:769
tranout_t(const tranout_t &source)
Copy constructor.
Definition: fuzzy_machine.h:108
double m_state_range
range for state weights
Definition: fuzzy_machine.h:311
double m_output_range
range for output weights
Definition: fuzzy_machine.h:305
void mutate(double a_rate)
Mutation.
Definition: fuzzy_machine.h:576
roulette_wheel m_output
The output value.
Definition: fuzzy_machine.h:97
void reset()
Reset to start-up state.
Definition: fuzzy_machine.h:727
Mutate an output symbol.
Definition: machine_tools.h:71
static void set_mutation_weight(mutation_id a_type, double a_weight)
Set a mutation weight.
Definition: fuzzy_machine.h:569
A finite state machine.
Definition: fuzzy_machine.h:87
static mutation_selector g_selector
Global mutation selector.
Definition: fuzzy_machine.h:314
double m_output_base
base value for output weights
Definition: fuzzy_machine.h:302
double get_real()
get the next value in the range [0,1)
Definition: evocommon.h:106