Ejemplo n.º 1
0
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");
}
Ejemplo n.º 2
0
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();
}