//----------------------------------------------------------------------------- // FirstRealGA.cpp //----------------------------------------------------------------------------- //* // An instance of a VERY simple Real-coded Genetic Algorithm // //----------------------------------------------------------------------------- // standard includes #include // runtime_error #include // cout #include // ostrstream, istrstream // the general include for eo #include #include // REPRESENTATION //----------------------------------------------------------------------------- // define your individuals typedef eoReal Indi; // EVAL //----------------------------------------------------------------------------- // a simple fitness function that computes the euclidian norm of a real vector // @param _indi A real-valued individual double real_value(const Indi & _indi) { double sum = 0; for (unsigned i = 0; i < _indi.size(); i++) sum += _indi[i]*_indi[i]; return (-sum); // maximizing only } // GENERAL //----------------------------------------------------------------------------- void main_function(int argc, char **argv) { // PARAMETRES // all parameters are hard-coded! const unsigned int SEED = 42; // seed for random number generator const unsigned int VEC_SIZE = 8; // Number of object variables in genotypes const unsigned int POP_SIZE = 20; // Size of population const unsigned int T_SIZE = 3; // size for tournament selection const unsigned int MAX_GEN = 500; // Maximum number of generation before STOP const float CROSS_RATE = 0.8; // Crossover rate const double EPSILON = 0.01; // range for real uniform mutation const float MUT_RATE = 0.5; // mutation rate // GENERAL ////////////////////////// // Random seed ////////////////////////// //reproducible random seed: if you don't change SEED above, // you'll aways get the same result, NOT a random run rng.reseed(SEED); // EVAL ///////////////////////////// // Fitness function //////////////////////////// // Evaluation: from a plain C++ fn to an EvalFunc Object eoEvalFuncPtr eval( real_value ); // INIT //////////////////////////////// // Initilisation of population //////////////////////////////// // declare the population eoPop pop; // fill it! for (unsigned int igeno=0; igeno select(T_SIZE); // T_SIZE in [2,POP_SIZE] // REPLACE // eoSGA uses generational replacement by default // so no replacement procedure has to be given // OPERATORS ////////////////////////////////////// // The variation operators ////////////////////////////////////// // CROSSOVER // offspring(i) is a linear combination of parent(i) eoArithmeticCrossover xover; // MUTATION // offspring(i) uniformly chosen in [parent(i)-epsilon, parent(i)+epsilon] eoUniformMutation mutation(EPSILON); // STOP // CHECKPOINT ////////////////////////////////////// // termination condition ///////////////////////////////////// // stop after MAX_GEN generations eoGenContinue continuator(MAX_GEN); // GENERATION ///////////////////////////////////////// // the algorithm //////////////////////////////////////// // standard Generational GA requires // selection, evaluation, crossover and mutation, stopping criterion eoSGA gga(select, xover, CROSS_RATE, mutation, MUT_RATE, eval, continuator); // Apply algo to pop - that's it! gga(pop); // OUTPUT // Print (sorted) intial population pop.sort(); cout << "FINAL Population\n" << pop << endl; // GENERAL } // A main that catches the exceptions int main(int argc, char **argv) { #ifdef _MSC_VER // rng.reseed(42); int flag = _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF); flag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag(flag); // _CrtSetBreakAlloc(100); #endif try { main_function(argc, argv); } catch(exception& e) { cout << "Exception: " << e.what() << '\n'; } return 1; }