void main_function() { const unsigned SIZE = 8; unsigned i, j; eoBooleanGenerator gen; Chrom chrom(SIZE), chrom2; chrom.fitness(binary_value(chrom)); chrom2.fitness(binary_value(chrom2)); std::cout << "chrom: " << chrom << std::endl; chrom[0] = chrom[SIZE - 1] = true; chrom.fitness(binary_value(chrom)); std::cout << "chrom: " << chrom << std::endl; chrom[0] = chrom[SIZE - 1] = false; chrom.fitness(binary_value(chrom)); std::cout << "chrom: " << chrom << std::endl; chrom[0] = chrom[SIZE - 1] = true; chrom.fitness(binary_value(chrom)); std::cout << "chrom.className() = " << chrom.className() << std::endl; std::cout << "chrom: " << chrom << std::endl << "chrom2: " << chrom2 << std::endl; std::ostringstream os; os << chrom; std::istringstream is(os.str()); is >> chrom2; chrom.fitness(binary_value(chrom2)); std::cout << "\nTesting reading, writing\n"; std::cout << "chrom: " << chrom << "\nchrom2: " << chrom2 << '\n'; std::fill(chrom.begin(), chrom.end(), false); std::cout << "--------------------------------------------------" << std::endl << "eoMonOp's aplied to .......... " << chrom << std::endl; eoInitFixedLength<Chrom> random(chrom.size(), gen); random(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBinRandom ............ " << chrom << std::endl; eoOneBitFlip<Chrom> bitflip; bitflip(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBitFlip .............. " << chrom << std::endl; eoBitMutation<Chrom> mutation(0.5); mutation(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBinMutation(0.5) ..... " << chrom << std::endl; eoBitInversion<Chrom> inversion; inversion(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBinInversion ......... " << chrom << std::endl; eoBitNext<Chrom> next; next(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBinNext .............. " << chrom << std::endl; eoBitPrev<Chrom> prev; prev(chrom); chrom.fitness(binary_value(chrom)); std::cout << "after eoBinPrev .............. " << chrom << std::endl; std::fill(chrom.begin(), chrom.end(), false); chrom.fitness(binary_value(chrom)); std::fill(chrom2.begin(), chrom2.end(), true); chrom2.fitness(binary_value(chrom2)); std::cout << "--------------------------------------------------" << std::endl << "eoBinOp's aplied to ... " << chrom << " " << chrom2 << std::endl; eo1PtBitXover<Chrom> xover; std::fill(chrom.begin(), chrom.end(), false); std::fill(chrom2.begin(), chrom2.end(), true); xover(chrom, chrom2); chrom.fitness(binary_value(chrom)); chrom2.fitness(binary_value(chrom2)); std::cout << "eoBinCrossover ........ " << chrom << " " << chrom2 << std::endl; for (i = 1; i < SIZE; i++) { eoNPtsBitXover<Chrom> nxover(i); std::fill(chrom.begin(), chrom.end(), false); std::fill(chrom2.begin(), chrom2.end(), true); nxover(chrom, chrom2); chrom.fitness(binary_value(chrom)); chrom2.fitness(binary_value(chrom2)); std::cout << "eoBinNxOver(" << i << ") ........ " << chrom << " " << chrom2 << std::endl; } for (i = 1; i < SIZE / 2; i++) for (j = 1; j < SIZE / 2; j++) { eoBitGxOver<Chrom> gxover(i, j); std::fill(chrom.begin(), chrom.end(), false); std::fill(chrom2.begin(), chrom2.end(), true); gxover(chrom, chrom2); chrom.fitness(binary_value(chrom)); chrom2.fitness(binary_value(chrom2)); std::cout << "eoBinGxOver(" << i << ", " << j << ") ..... " << chrom << " " << chrom2 << std::endl; } // test SGA algorithm eoGenContinue<Chrom> continuator1(50); eoFitContinue<Chrom> continuator2(65535.f); eoCombinedContinue<Chrom> continuator(continuator1, continuator2); eoCheckPoint<Chrom> checkpoint(continuator); eoStdoutMonitor monitor; checkpoint.add(monitor); eoSecondMomentStats<Chrom> stats; monitor.add(stats); checkpoint.add(stats); eoProportionalSelect<Chrom> select; eoEvalFuncPtr<Chrom> eval(binary_value); eoSGA<Chrom> sga(select, xover, 0.8f, bitflip, 0.1f, eval, checkpoint); eoInitFixedLength<Chrom> init(16, gen); eoPop<Chrom> pop(100, init); apply<Chrom>(eval, pop); sga(pop); pop.sort(); std::cout << "Population " << pop << std::endl; std::cout << "\nBest: " << pop[0].fitness() << '\n'; /* Commented this out, waiting for a definite decision what to do with the mOp's // Check multiOps eoMultiMonOp<Chrom> mOp( &next ); mOp.adOp( &bitflip ); std::cout << "before multiMonOp............ " << chrom << std::endl; mOp( chrom ); std::cout << "after multiMonOp .............. " << chrom << std::endl; eoBinGxOver<Chrom> gxover(2, 4); eoMultiBinOp<Chrom> mbOp( &gxover ); mOp.adOp( &bitflip ); std::cout << "before multiBinOp............ " << chrom << " " << chrom2 << std::endl; mbOp( chrom, chrom2 ); std::cout << "after multiBinOp .............. " << chrom << " " << chrom2 <<std::endl; */ }
int main() { const unsigned POP_SIZE = 10, CHROM_SIZE = 12; unsigned i; eoBooleanGenerator gen; // the populations: eoPop<Chrom> pop; // Evaluation RoyalRoad<Chrom> rr( 8 ); eoEvalFuncCounter<Chrom> eval( rr ); eoInitVirus<float> random(CHROM_SIZE, gen); for (i = 0; i < POP_SIZE; ++i) { Chrom chrom; random(chrom); eval(chrom); pop.push_back(chrom); } std::cout << "population:" << std::endl; for (i = 0; i < pop.size(); ++i) std::cout << "\t" << pop[i] << " " << pop[i].fitness() << std::endl; // selection eoStochTournamentSelect<Chrom> lottery(0.9 ); // breeder eoOneBitFlip<Chrom> vm; eoUBitXover<Chrom> xover; eoProportionalOp<Chrom> propSel; eoGeneralBreeder<Chrom> breeder( lottery, propSel ); propSel.add(vm, 0.2); propSel.add(xover, 0.8); // Replace a single one eoCommaReplacement<Chrom> replace; // Terminators eoGenContinue<Chrom> continuator1(10); eoFitContinue<Chrom> continuator2(CHROM_SIZE); eoCombinedContinue<Chrom> continuator(continuator1, continuator2); eoCheckPoint<Chrom> checkpoint(continuator); eoStdoutMonitor monitor; checkpoint.add(monitor); eoSecondMomentStats<Chrom> stats; eoPopStat<Chrom> dumper( 10 ); monitor.add(stats); checkpoint.add(dumper); checkpoint.add(stats); // GA generation eoEasyEA<Chrom> ea(checkpoint, eval, breeder, replace ); // evolution try { ea(pop); } catch (std::exception& e) { std::cout << "exception: " << e.what() << std::endl;; exit(EXIT_FAILURE); } std::cout << "pop" << std::endl; for (i = 0; i < pop.size(); ++i) std::cout << "\t" << pop[i] << " " << pop[i].fitness() << std::endl; std::cout << "\n --> Number of Evaluations = " << eval.getValue() << std::endl; return 0; }