void RunGA(){ int generations = 0; while(max_generation >= 0 && generations <= max_generation){ GAStep(); if(generations % 100 == 0){ std::cout << "Generacion: " << generations << "\n"; } if(generations % 1000 == 0){ Chromosome *best = SelectBest(); QImage image = DrawImage(best); image.save(QString("out/out_") + QString::number(generations) + ".png"); qDebug() << "Fitness: " << best->Fitness(); } generations++; } DrawSVG(SelectBest(), "Final.svg"); }
void GAStep(){ Chromosome *elite = SelectBest(); Chromosome clonA; Chromosome clonB; Chromosome *ap = NULL; // Elitism elite->Clone(&clonA); InsertPobB(&clonA); // harem int fraction = int(HAREM * sizePopulationA); for(int i = 0; i < fraction; i += 2){ elite->Clone(&clonA); SelectTournament()->Clone(&clonB); Crossover(&clonA, &clonB); clonA.Mutate(); clonB.Mutate(); clonA.Fitness() = Distance(&clonA); clonB.Fitness() = Distance(&clonB); InsertPobB(&clonA); InsertPobB(&clonB); } // Fill while((sizePopulationA - sizePopulationB) > 0){ ap = SelectTournament(); ap->Clone(&clonA); ap = SelectTournament(); ap->Clone(&clonB); Crossover(&clonA, &clonB); clonA.Mutate(); clonB.Mutate(); clonA.Fitness() = Distance(&clonA); clonB.Fitness() = Distance(&clonB); if(clonA.Fitness() < clonB.Fitness()) InsertPobB(&clonA); else InsertPobB(&clonB); } UpdatePopulation(); }