Ejemplo n.º 1
0
void* GeneticAlgorithmProfile1::Algorithm( void* arg )
{
    srand (static_cast <unsigned> (time(0)));
    ThreadData* td = (ThreadData*)arg;
    if( td->first && td->generation.size() == 0 ) {
        td->generation = GeneticAlgorithmProfile1::GeneratePopulation(MaxChromosomesPopulationSize, 0, 0);
    }
    td->SetSimulating(false);
    td->SetGaInitialized(true);
    td->SetGaEnabled(true);
    if( td->first && td->generation.size() > 0 ) {
        for(int i = 0; i < td->generation.size(); i++) {
            GeneticAlgorithmProfile1::CalculateFitness(td, td->generation.at(i));
        }
        std::sort (td->generation.begin(), td->generation.end(), [](Chromosome * a, Chromosome * b) {
            if (b->fitnessScore == a->fitnessScore) { return b->fitnessHPPercentage < a->fitnessHPPercentage; }
            return b->fitnessScore < a->fitnessScore; });
        td->first = false;
    }

    //DBG - LOG
    std::cout << "\n\n LOG - Generation : INITIAL POP " << " START ";
    for(int k = 0; k < td->generation.size(); k++) {
        std::cout << "\n Chromosome : " << k << " fitness score : " << td->generation.at(k)->fitnessScore;
    }
    std::cout << "\n ---END--- ";
    
    for(int i = 0; i < MaxGenerations; i++) {
        
        std::cout << "\n START OF NEW GENERATION\n";
        
        td->previouslyPlayedFitness = td->generation.at(0)->fitnessScore;
        Chromosome* elite =(Chromosome*) malloc(sizeof(Chromosome));
        for ( int j = 0; j < CreepsPerRound; j ++) {
            elite->healthPoints[j] = td->generation.at(0)->healthPoints[j];
            elite->movementSpeed[j] = td->generation.at(0)->movementSpeed[j];
            elite->elementalAffinity[j] = td->generation.at(0)->elementalAffinity[j];
            elite->fitnessScore = td->generation.at(0)->fitnessScore;
        }
        Chromosome* parent1;
        Chromosome* parent2;
        if(td->crossoverRate == 100) {
            int totalFitness = 0;
            std::vector<double> result(td->generation.size());
            for(int x = 0; x < td->generation.size(); x++) {
                totalFitness =  totalFitness + td->generation.at(x)->fitnessScore;
            }
            for(int p = 0; p < td->generation.size(); p++) {
                result[p] = (((double)td->generation.at(p)->fitnessScore) / ((double)totalFitness)) * 100;
            }
            bool firstSelected = false;
            bool secondSelected = false;
            for(int l = 0 ; l < result.size() ; l++) {
                float roll = static_cast <float> (rand()) / (static_cast <float> (RAND_MAX/100.0f));
                if( roll <= result.at(l) ) {
                    if(!firstSelected) {
                        parent1 = td->generation.at(l);
                        firstSelected = true;
                    }
                    else if(!secondSelected) {
                        parent2 = td->generation.at(l);
                        secondSelected = true;
                    }
                }
                if(firstSelected && secondSelected) {
                    break;
                }
                else {
                    if( l == result.size()-1 ) {
                        l = 0;
                    }
                }
            }
            GeneticAlgorithmProfile1::Crossover(td, parent1, parent2);
        }
        td->generation.pop_back();
        GeneticAlgorithmProfile1::Mutate(td, &td->generation);
        td->generation.push_back(elite);
        for(int k = 0; k < td->generation.size(); k++) {
            Chromosome* c = td->generation.at(k);
            GeneticAlgorithmProfile1::CalculateFitness(td, c);
        }
        std::sort (td->generation.begin(), td->generation.end(), [](Chromosome * a, Chromosome * b) {
                       if (b->fitnessScore == a->fitnessScore) { return b->fitnessHPPercentage < a->fitnessHPPercentage; }
                       return b->fitnessScore < a->fitnessScore; });
    
        //DBG - LOG
        std::cout << "\n\n LOG - Generation : " << i << " START ";
        for(int k = 0; k < td->generation.size(); k++) {
            std::cout << "\n Chromosome : " << k << " fitness score : " << td->generation.at(k)->fitnessScore;
        }
        std::cout << "\n ---END--- ";
        std::cout << "\n\n GENS PAST " << i;
    
        if ( td->generation.at(0)->fitnessScore == MinAcceptableFitness ) { break; }
    
    }

    std::cout << " \n DEPLOYMENT SETTING --- FITNESS : " << td->generation.at(0)->fitnessScore;
    
    GeneticAlgorithmProfile1::SetWaveForDeployment(td, td->generation.at(0));
    td->SetGaInitialized(false);
    td->SetGaEnabled(false);
    td->SetNonGARounds(0);
    return 0;
}