#include #include #include #include #include #include "../../problems/eval/oneMaxEval.h" using Particle = eoRealParticle; using Bits = eoBit; // Generate a search space of 5,232,000 algorithms, // by enumerating candidate operators and their parameters. eoAlgoFoundryFastGA& make_foundry(eoFunctorStore& store, eoInit& init, eoEvalFunc& eval_onemax) { auto& foundry = store.pack< eoAlgoFoundryFastGA >(init, eval_onemax, 20,10); /***** Continuators ****/ for(size_t i=10; i < 100; i+=2 ) { foundry.continuators.add< eoSteadyFitContinue >(10,i); } /***** Crossovers ****/ for(double i=0.1; i<0.9; i+=0.1) { foundry.crossovers.add< eoUBitXover >(i); // preference over 1 } for(size_t i=1; i < 11; i+=1) { foundry.crossovers.add< eoNPtsBitXover >(i); // nb of points } foundry.crossovers.add< eo1PtBitXover >(); /***** Mutations ****/ double p = 1.0; // Probability of flipping eath bit. foundry.mutations.add< eoUniformBitMutation >(p); // proba of flipping k bits, k drawn in uniform distrib foundry.mutations.add< eoStandardBitMutation >(p); // proba of flipping k bits, k drawn in binomial distrib foundry.mutations.add< eoConditionalBitMutation >(p); // proba of flipping k bits, k drawn in binomial distrib, minus zero foundry.mutations.add< eoShiftedBitMutation >(p); // proba of flipping k bits, k drawn in binomial distrib, changing zeros to one foundry.mutations.add< eoNormalBitMutation >(p); // proba of flipping k bits, k drawn in normal distrib foundry.mutations.add< eoFastBitMutation >(p); // proba of flipping k bits, k drawn in powerlaw distrib for(size_t i=1; i < 11; i+=1) { foundry.mutations.add< eoDetSingleBitFlip >(i); // mutate k bits without duplicates } /***** Selectors *****/ for(eoOperatorFoundry>& ops : {std::ref(foundry.crossover_selectors), std::ref(foundry.aftercross_selectors), std::ref(foundry.mutation_selectors) }) { ops.add< eoRandomSelect >(); ops.add< eoStochTournamentSelect >(0.5); ops.add< eoSequentialSelect >(); ops.add< eoProportionalSelect >(); for(size_t i=2; i < 10; i+=4) { ops.add< eoDetTournamentSelect >(i); } } /***** Replacements ****/ foundry.replacements.add< eoPlusReplacement >(); foundry.replacements.add< eoCommaReplacement >(); foundry.replacements.add< eoSSGAWorseReplacement >(); for(double i=0.51; i<0.91; i+=0.1) { foundry.replacements.add< eoSSGAStochTournamentReplacement >(i); } for(size_t i=2; i < 10; i+=1) { foundry.replacements.add< eoSSGADetTournamentReplacement >(i); } return foundry; } int main(int /*argc*/, char** /*argv*/) { eo::log << eo::setlevel(eo::warnings); eoFunctorStore store; oneMaxEval onemax_eval; eoBooleanGenerator gen(0.5); eoInitFixedLength init(/*bitstring size=*/5, gen); auto& foundry = make_foundry(store, init, onemax_eval); size_t n = foundry.crossover_selectors.size() * foundry.aftercross_selectors.size() * foundry.mutation_selectors.size() * foundry.mutations.size() * foundry.replacements.size() * foundry.continuators.size() ; std::clog << n << " possible algorithms instances." << std::endl; eoPop pop; pop.append(5,init); ::apply(onemax_eval,pop); foundry.select({ /*crossover_rates */ double{0.8}, /*crossover_selectors */ size_t{0}, /*crossovers */ size_t{0}, /*aftercross_selectors*/ size_t{0}, /*mutation_rates */ double{0.9}, /*mutation_selectors */ size_t{0}, /*mutations */ size_t{0}, /*replacements */ size_t{0}, /*continuators */ size_t{0}, /*offspring_sizes */ size_t{1}, }); foundry(pop); std::cout << "Done" << std::endl; std::cout << pop << std::endl; std::cout << pop.best_element() << std::endl; }