Back to Lesson 5 - Tutorial main page - Top-Down page - Bottom-up page - Programming hints - EO documentation

Templates/OneMaxEA.cpp

The places where you have to put some code are on pink background.. Only the the character colors have the usual meaning.
/** -*- mode: c++; c-indent-level: 4; c++-member-init-indent: 8; comment-column: 35; -*-
The above line is usefulin Emacs-like editors
*/
/*
Template for creating a new representation in EO
================================================
This is the template main file.
It includes all other files that have been generated by the script create.sh
so it is the only file to compile.
In case you want to build up a separate library for your new Evolving Object,
you'll need some work - follow what's done in the src/ga dir, used in the
main file BitEA in tutorial/Lesson4 dir.
Or you can wait until we do it :-)
*/
// Miscilaneous include and declaration 
#include <iostream>
using namespace std;
// eo general include
#include "eo"
// the real bounds (not yet in general eo include)
#include "utils/eoRealVectorBounds.h"
// include here whatever specific files for your representation
// Basically, this should include at least the following
/** definition of representation: 
* class eoOneMax MUST derive from EO<FitT> for some fitness
*/
#include "eoOneMax.h"
/** definition of initilizqtion: 
* class eoOneMaxInit MUST derive from eoInit<eoOneMax>
*/
#include "eoOneMaxInit.h"
/** definition of evaluation: 
* class eoOneMaxEvalFunc MUST derive from eoEvalFunc<eoOneMax>
* and should test for validity before doing any computation
* see tutorial/Templates/evalFunc.tmpl
*/
#include "eoOneMaxEvalFunc.h"
// GENOTYPE    eoOneMax ***MUST*** be templatized over the fitness
// START fitness type: double or eoMaximizingFitness if you are maximizing
//                                        eoMinimizingFitness if you are minimizing
typedef eoMinimizingFitness MyFitT ; // type of fitness 
// END fitness type
// Then define your EO objects using that fitness type
typedef eoOneMax<MyFitT> Indi;           // ***MUST*** derive from EO 
// create an initializer
#include "make_genotype_OneMax.h"
eoInit<Indi> & make_genotype(eoParser& _parser, eoState&_state, Indi _eo)
{
 return do_make_genotype(_parser, _state, _eo);
// and the variation operaotrs
#include "make_op_OneMax.h"
eoGenOp<Indi>&  make_op(eoParser& _parser, eoState& _state, eoInit<Indi>& _init)
{
 return do_make_op(_parser, _state, _init);
}
// Use existing modules to define representation independent routines
// These are parser-based definitions of objects
// how to initialize the population 
// it IS representation independent if an eoInit is given
#include <do/make_pop.h>
eoPop<Indi >&  make_pop(eoParser& _parser, eoState& _state, eoInit<Indi> & _init)
{
 return do_make_pop(_parser, _state, _init);
}
// the stopping criterion
#include <do/make_continue.h>
eoContinue<Indi>& make_continue(eoParser& _parser, eoState& _state, eoEvalFuncCounter<Indi> & _eval)
{
 return do_make_continue(_parser, _state, _eval);
}
// outputs (stats, population dumps, ...)
#include <do/make_checkpoint.h>
eoCheckPoint<Indi>& make_checkpoint(eoParser& _parser, eoState& _state, eoEvalFuncCounter<Indi>& _eval, eoContinue<Indi>& _continue) 
{
 return do_make_checkpoint(_parser, _state, _eval, _continue);
}
// evolution engine (selection and replacement)
#include <do/make_algo_scalar.h>
eoAlgo<Indi>&  make_algo_scalar(eoParser& _parser, eoState& _state, eoEvalFunc<Indi>& _eval, eoContinue<Indi>& _continue, eoGenOp<Indi>& _op)
{
 return do_make_algo_scalar(_parser, _state, _eval, _continue, _op);
}
// simple call to the algo. stays there for consistency reasons 
// no template for that one
#include <do/make_run.h>
// the instanciating fitnesses
#include <eoScalarFitness.h>
void run_ea(eoAlgo<Indi>& _ga, eoPop<Indi>& _pop)
{
 do_run(_ga, _pop);
}
// checks for help demand, and writes the status file
// and make_help; in libutils
void make_help(eoParser & _parser);
// now use all of the above, + representation dependent things
int main(int argc, char* argv[])
{
 try
 {
 eoParser parser(argc, argv);   // for user-parameter reading
 eoState state;       // keeps all things allocated
      // The fitness
      //////////////
   eoOneMaxEvalFunc<Indi> plainEval /* (varType  _anyVariable) */;;
    // turn that object into an evaluation counter
   eoEvalFuncCounter<Indi> eval(plainEval);
  // the genotype - through a genotype initializer
 eoInit<Indi>& init = make_genotype(parser, state, Indi());
  // Build the variation operator (any seq/prop construct)
 eoGenOp<Indi>& op = make_op(parser, state, init);
  //// Now the representation-independent things 
  //
  // YOU SHOULD NOT NEED TO MODIFY ANYTHING BEYOND THIS POINT
  // unless you want to add specific statistics to the checkpoint
  //////////////////////////////////////////////
  // initialize the population
  // yes, this is representation indepedent once you have an eoInit
 eoPop<Indi>& pop    = make_pop(parser, state, init);
  // stopping criteria
 eoContinue<Indi> & term = make_continue(parser, state, eval);
  // output
 eoCheckPoint<Indi> & checkpoint = make_checkpoint(parser, state, eval, term);
  // algorithm (need the operator!)
 eoAlgo<Indi>& ga = make_algo_scalar(parser, state, eval, checkpoint, op);
  ///// End of construction of the algorithm
  /////////////////////////////////////////
  // to be called AFTER all parameters have been read!!!
 make_help(parser);
  //// GO
  ///////
  // evaluate intial population AFTER help and status in case it takes time
 apply<Indi>(eval, pop);
  // if you want to print it out
//    cout << "Initial Population\n";
//    pop.sortedPrintOn(cout);
//    cout << endl;
 run_ea(ga, pop); // run the ga
 cout << "Final Population\n";
 pop.sortedPrintOn(cout);
 cout << endl;
 }
 catch(exception& e)
 {
     cout << e.what() << endl;
 }
 return 0;
}

Back to Lesson 5 - Tutorial main page - Top-Down page - Bottom-up page - Programming hints - EO documentation
Marc Schoenauer

Last modified: Sat May 4 07:37:41 2002