//----------------------------------------------------------------------------- // to avoid long name warnings #ifdef _MSC_VER #pragma warning(disable:4786) #endif #include // runtime_error //----------------------------------------------------------------------------- // tt.cpp: // //----------------------------------------------------------------------------- // general #include #include #include #include //----------------------------------------------------------------------------- struct Dummy : public EO { typedef double Type; void printOn(ostream & _os) const { _os << " - "; EO::printOn(_os); } }; bool operator==(const Dummy & _d1, const Dummy & _d2) { return _d1.fitness() == _d2.fitness(); } struct eoDummyPop : public eoPop { public : eoDummyPop(int s=0) { resize(s); } }; // helper - DOES NOT WORK if different individuals have same fitness!!! template unsigned isInPop(EOT & _indi, eoPop & _pop) { for (unsigned i=0; i<_pop.size(); i++) if (_pop[i] == _indi) return i; return _pop.size(); } unsigned int pSize; // global variable, bouh! template void testSelectMany(eoSelect & _select, string _name) { cout << "\n\n" << _name << endl; cout << "===============\n"; eoDummyPop parents(pSize); eoDummyPop offspring(0); unsigned i; // initialize parents for (i=0; i nb(parents.size(), 0); for (i=0; i(offspring[i], parents); if (trouve == parents.size()) // pas trouve throw runtime_error("Pas trouve ds parents"); nb[trouve]++; } // dump to file so you can plot using gnuplot string fName = _name + ".prop"; ofstream os(fName.c_str()); for (i=0; i " << ( (double)nb[i])/offspring.size() << endl; os << i << " " << ( (double)nb[i])/offspring.size() << endl; } } template void testSelectOne(eoSelectOne & _select, eoHowMany & _hm, string _name) { eoSelectMany percSelect(_select, _hm); testSelectMany(percSelect, _name); } //----------------------------------------------------------------------------- int the_main(int argc, char **argv) { eoParser parser(argc, argv); eoValueParam parentSizeParam = parser.createParam(unsigned(10), "parentSize", "Parent size",'P'); pSize = parentSizeParam.value(); // global variable // eoValueParam offsrpringRateParam = parser.createParam(1.0, "offsrpringRate", "Offsrpring rate",'O'); // double oRate = offsrpringRateParam.value(); eoValueParam offsrpringRateParam = parser.createParam(eoHowMany(1.0), "offsrpringRate", "Offsrpring rate (% or absolute)",'O'); eoHowMany oRate = offsrpringRateParam.value(); eoValueParam tournamentSizeParam = parser.createParam(unsigned(2), "tournamentSize", "Deterministic tournament size",'T'); unsigned int tSize = tournamentSizeParam.value(); eoValueParam tournamentRateParam = parser.createParam(0.75, "tournamentRate", "Stochastic tournament rate",'R'); double tRate = tournamentRateParam.value(); eoValueParam rankingPressureParam = parser.createParam(1.75, "rankingPressure", "Selective pressure for the ranking selection",'p'); double rankingPressure = rankingPressureParam.value(); if (parser.userNeedsHelp()) { parser.printHelp(cout); exit(0); } cout << "Testing the Selections\nParents size = " << pSize << ", offspring rate = " << oRate << endl; rng.reseed(42); // the selection procedures under test // eoDetSelect detSelect(oRate); // testSelectMany(detSelect, "detSelect"); // Roulette eoProportionalSelect propSelect; testSelectOne(propSelect, oRate, "propSelect"); // Ranking eoRankingSelect rankSelect(rankingPressure); testSelectOne(rankSelect, oRate, "rankSelect"); // New ranking using the perf2Worth construct cout << "Avant appel a LinearRanking()" << endl; eoRankingSelect newRankingSelect(rankingPressure); // pressure 2 by default testSelectOne(newRankingSelect, oRate, "newRankSelect"); // New ranking using the perf2Worth construct cout << "Avant appel a exponentialRanking()" << endl; eoRankingSelect expRankingSelect(rankingPressure,2); testSelectOne(expRankingSelect, oRate, "expRankingSelect"); // Det tournament eoDetTournamentSelect detTourSelect(tSize); testSelectOne(detTourSelect, oRate, "detTourSelect"); // Stoch tournament eoStochTournamentSelect stochTourSelect(tRate); testSelectOne(stochTourSelect, oRate, "stochTourSelect"); exit(0); // Fitness scaling // eoFitnessScalingSelect fitScaleSelect(rankingPressure); // testSelectOne(fitScaleSelect, oRate, "fitScaleSelect"); // NEW Fitness scaling eoFitnessScalingSelect newFitScaleSelect(rankingPressure); testSelectOne(newFitScaleSelect, oRate, "NewFitScaleSelect"); return 1; } int main(int argc, char **argv) { try { the_main(argc, argv); } catch(exception& e) { cout << "Exception: " << e.what() << endl; return 1; } }