// Program to test several EO-ES features #ifdef _MSC_VER #pragma warning(disable:4786) #endif #include #include #include #include #include #include using namespace std; #include // representation specific #include #include "real_value.h" // the sphere fitness // Now the main /////////////// typedef eoMinimizingFitness FitT; template void runAlgorithm(EOT, eoParser& _parser, eoState& _state, eoEsObjectiveBounds& _bounds); int main(int argc, char *argv[]) { // Create the command-line parser eoParser parser( argc, argv, "Basic EA for vector with adaptive mutations"); // Define Parameters and load them eoValueParam& seed = parser.createParam(static_cast(time(0)), "seed", "Random number seed"); eoValueParam& load_name = parser.createParam(string(), "Load","Load a state file",'L'); eoValueParam& save_name = parser.createParam(string(), "Save","Saves a state file",'S'); eoValueParam& stdevs = parser.createParam(false, "Stdev", "Use adaptive mutation rates", 's'); eoValueParam& corr = parser.createParam(false, "Correl", "Use correlated mutations", 'c'); eoValueParam& chromSize = parser.createParam(unsigned(50), "ChromSize", "Number of chromosomes", 'n'); eoValueParam& minimum = parser.createParam(-1.e5, "Min", "Minimum for Objective Variables", 'l'); eoValueParam& maximum = parser.createParam(1.e5, "Max", "Maximum for Objective Variables", 'h'); eoState state; state.registerObject(parser); rng.reseed(seed.value()); if (!load_name.value().empty()) { // load the parser. This is only neccessary when the user wants to // be able to change the parameters in the state file by hand // Note that only parameters inserted in the parser at this point // will be loaded!. state.load(load_name.value()); // load the parser } state.registerObject(rng); eoEsObjectiveBounds bounds(chromSize.value(), minimum.value(), maximum.value()); // Run the appropriate algorithm if (stdevs.value() == false && corr.value() == false) { runAlgorithm(eoEsSimple() ,parser, state, bounds); } else if (corr.value() == true) { runAlgorithm(eoEsFull(),parser, state, bounds); } else { runAlgorithm(eoEsStdev(), parser, state, bounds); } // and save if (!save_name.value().empty()) { string file_name = save_name.value(); save_name.value() = ""; // so that it does not appear in the parser section of the state file state.save(file_name); } return 0; } template void runAlgorithm(EOT, eoParser& _parser, eoState& _state, eoEsObjectiveBounds& _bounds) { // evaluation eoEvalFuncPtr&> eval( real_value ); // population parameters, unfortunately these can not be altered in the state file eoValueParam mu = _parser.createParam(unsigned(50), "mu","Size of the population"); eoValueParamlambda_rate = _parser.createParam(float(7.0), "lambda_rate", "Factor of children to produce"); if (lambda_rate.value() < 1.0f) { throw logic_error("lambda_rate must be larger than 1 in a comma strategy"); } // Initialization eoEsChromInit init(_bounds); eoPop& pop = _state.takeOwnership(eoPop(mu.value(), init)); _state.registerObject(pop); // evaluate initial population apply(eval, pop); // Ok, time to set up the algorithm // Proxy for the mutation parameters eoEsMutationInit mutateInit(_parser); eoEsMutate mutate(mutateInit, _bounds); // monitoring, statistics etc. eoAverageStat average; eoStdoutMonitor monitor; monitor.add(average); eoGenContinue cnt(2000); eoCheckPoint checkpoint(cnt); checkpoint.add(monitor); checkpoint.add(average); eoProportionalGOpSel opSel; opSel.addOp(mutate, 1.0); eoEvolutionStrategy es(checkpoint, eval, opSel, lambda_rate.value(), eoEvolutionStrategy::comma_strategy()); es(pop); }