00001
00002
00003 #ifdef _MSC_VER
00004 #pragma warning(disable:4786)
00005 #endif
00006
00007 #include <algorithm>
00008 #include <string>
00009 #include <iostream>
00010 #include <iterator>
00011 #include <stdexcept>
00012 #include <time.h>
00013
00014 using namespace std;
00015
00016 #include <eo>
00017
00018
00019 #include <es.h>
00020
00021 #include "real_value.h"
00022
00023
00025 typedef eoMinimizingFitness FitT;
00026
00027 template <class EOT>
00028 void runAlgorithm(EOT, eoParser& _parser, eoState& _state, eoRealVectorBounds& _bounds, eoValueParam<string> _load_name);
00029
00030 int main_function(int argc, char *argv[])
00031 {
00032
00033 eoParser parser( argc, argv, "Basic EA for vector<float> with adaptive mutations");
00034
00035
00036 eoValueParam<uint32_t>& seed = parser.createParam(static_cast<uint32_t>(time(0)),
00037 "seed", "Random number seed");
00038 eoValueParam<string>& load_name = parser.createParam(string(), "Load","Load a state file",'L');
00039 eoValueParam<string>& save_name = parser.createParam(string(), "Save","Saves a state file",'S');
00040 eoValueParam<bool>& stdevs = parser.createParam(false, "Stdev", "Use adaptive mutation rates", 's');
00041 eoValueParam<bool>& corr = parser.createParam(false, "Correl", "Use correlated mutations", 'c');
00042 eoValueParam<unsigned>& chromSize = parser.createParam(unsigned(50), "ChromSize", "Number of chromosomes", 'n');
00043 eoValueParam<double>& minimum = parser.createParam(-1.0, "Min", "Minimum for Objective Variables", 'l');
00044 eoValueParam<double>& maximum = parser.createParam(1.0, "Max", "Maximum for Objective Variables", 'h');
00045
00046 eoState state;
00047 state.registerObject(parser);
00048 rng.reseed(seed.value());
00049
00050 if (!load_name.value().empty())
00051 {
00052
00053
00054
00055 state.load(load_name.value());
00056 }
00057
00058 state.registerObject(rng);
00059
00060 eoRealVectorBounds bounds(chromSize.value(), minimum.value(), maximum.value());
00061
00062
00063 if (stdevs.value() == false && corr.value() == false)
00064 {
00065 runAlgorithm(eoEsSimple<FitT>() ,parser, state, bounds, load_name);
00066 }
00067 else if (corr.value() == true)
00068 {
00069 runAlgorithm(eoEsFull<FitT>(),parser, state, bounds, load_name);
00070 }
00071 else
00072 {
00073 runAlgorithm(eoEsStdev<FitT>(), parser, state, bounds, load_name);
00074 }
00075
00076
00077 if (!save_name.value().empty())
00078 {
00079 string file_name = save_name.value();
00080 save_name.value() = "";
00081 state.save(file_name);
00082 }
00083
00084 return 0;
00085 }
00086
00087
00088
00089 int main(int argc, char **argv)
00090 {
00091 #ifdef _MSC_VER
00092
00093 int flag = _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF);
00094 flag |= _CRTDBG_LEAK_CHECK_DF;
00095 _CrtSetDbgFlag(flag);
00096
00097 #endif
00098
00099 try
00100 {
00101 main_function(argc, argv);
00102 }
00103 catch(std::exception& e)
00104 {
00105 std::cout << "Exception: " << e.what() << '\n';
00106 }
00107
00108 return 1;
00109 }
00110
00111 template <class EOT>
00112 void runAlgorithm(EOT, eoParser& _parser, eoState& _state, eoRealVectorBounds& _bounds, eoValueParam<string> _load_name)
00113 {
00114
00115 eoEvalFuncPtr<EOT, double, const vector<double>&> eval( real_value );
00116
00117
00118 eoValueParam<unsigned> mu = _parser.createParam(unsigned(7), "mu","Size of the population");
00119 eoValueParam<double>lambda_rate = _parser.createParam(double(7.0), "lambda_rate", "Factor of children to produce");
00120
00121 if (lambda_rate.value() < 1.0f)
00122 {
00123 throw logic_error("lambda_rate must be larger than 1 in a comma strategy");
00124 }
00125
00126
00127 eoEsChromInit<EOT> init(_bounds);
00128
00129
00130 eoPop<EOT>& pop = _state.takeOwnership(eoPop<EOT>(mu.value(), init));
00131
00132 _state.registerObject(pop);
00133
00134 if (!_load_name.value().empty())
00135 {
00136 _state.load(_load_name.value());
00137 }
00138 else
00139 {
00140
00141 apply<EOT>(eval, pop);
00142 }
00143
00144
00145
00146 eoEsMutationInit mutateInit(_parser);
00147
00148 eoEsMutate<EOT> mutate(mutateInit, _bounds);
00149
00150
00151 eoAverageStat<EOT> average;
00152 eoStdoutMonitor monitor;
00153
00154 monitor.add(average);
00155
00156 eoGenContinue<EOT> cnt(100);
00157 eoCheckPoint<EOT> checkpoint(cnt);
00158 checkpoint.add(monitor);
00159 checkpoint.add(average);
00160
00161
00162 eoMonGenOp<EOT> op(mutate);
00163
00164
00165 eoSequentialSelect<EOT> select;
00166
00167 eoGeneralBreeder<EOT> breed(select, op, lambda_rate.value(), true);
00168
00169
00170 eoCommaReplacement<EOT> replace;
00171
00172
00173 eoEasyEA<EOT> es(checkpoint, eval, breed, replace);
00174
00175 es(pop);
00176
00177 pop.sort();
00178 std::cout << "Final population\n" << pop << std::endl;
00179
00180 }