void Genetic_Algorigthm::manageGA() { currentGen++; accessPop(); sortPop(); output(); setNewPopulation(top10()); }
void Populacao::updatePop() { //Ordenar indivíduos pelo fitness sortPop(); //Liberar memória dos indivíduos a serem descartados for (int i = POP_SIZE; i < pop.size(); i++) { delete(pop[i]); } //Eliminar ponteiros nulos da população vector<Individuo *>::iterator it = pop.begin() + POP_SIZE; pop.erase(it, pop.end()); //cout << "POP_SIZE: " << pop.size() << endl; }
void clonation(struct cell clone[POP+1]){ int i=0,j=0,n=0, counter[POP], k=0, clones; double m[POP+1], intPart, decPart; sortPop(clone); for (i=0;i<POP;i++){ if(isNull(clone[i])) break; n++; } for (i=0;i<n;i++){ clones = (float)(clonationFactor*n)/(float)(i+1); if((int)clones + clone_control > 2){ m[i] = clones + clone_control; } else{ m[i] = clones; } decPart = modf(m[i],&intPart); if(decPart >= 0.5){ counter[i] = (int)(intPart + 1); } else{ counter[i] = (int)intPart; } } k=n; for(i=0;i<n;i++){ for (j=0; j<counter[i]; j++){ clone[k] = clone[i]; k++; if (k >= POP){ k = 0; } } } for (i = 0; i < POP; i++) { clonePop[i] = clone[i]; } }
// HyperMutacion void hypermutation(){ int i, j, random_1, random_2, tmp; sortPop(clonePop); for(i=0;i<POP;i++){ if(!isNull(clonePop[i])){ // se intercambian por su orden, el primero 2 veces, el segundo 3 veces... for(j=0;j<(i+1);j++){ // Generamos dos numeros para intercambiar los valores // de nuestra solucion random_1 = (1+(int)((rand()/(RAND_MAX + 1.0))*(VARS+1)))%VARS; random_2 = (1+(int)((rand()/(RAND_MAX + 1.0))*(VARS+1)))%VARS; // Intercambiamos los valores del swap tmp = clonePop[i].gene[random_1]; clonePop[i].gene[random_1] = clonePop[i].gene[random_2]; clonePop[i].gene[random_2] = tmp; } } } }
// HyperMutacion void hypermutation(){ int i, j, random_1, random_2, tmp; //CAMBIAR! //Hipermutamos poco a los mejores y mucho a los peores // cout << "--Mutacion--" << endl; // sortPop(clonePop); for(i=0;i<POP;i++){ if(!isNull(clonePop[i])){ //POP*0.4 for(j=0;j<round(mutRate * clonePop[i].fitness);j++){ // Generamos dos numeros para intercambiar los valores // de nuestra solucion random_1 = (1+(int)((rand()/(RAND_MAX + 1.0))*(VARS+1)))%VARS; random_2 = (1+(int)((rand()/(RAND_MAX + 1.0))*(VARS+1)))%VARS; // Intercambiamos los valores del swap tmp = clonePop[i].gene[random_1]; clonePop[i].gene[random_1] = clonePop[i].gene[random_2]; clonePop[i].gene[random_2] = tmp; } } } }
//void clonation(){ void clonation(struct cell clone[POP+1], bool type){ int i=0,j=0,n=0, counter[POP], k=0,var=0; double m[POP+1], intPart, decPart; // cout << "--Clonacion--" << endl; if (type){ // cout << "Clonamos..." << endl; sortPop(clone); // printPop(clone); for (i=0;i<POP;i++){ if(isNull(clone[i])) break; n++; } // cout << "El n:" << n << endl; // getchar(); for (i=0;i<n;i++){ m[i] = (float)(clonationFactor*n)/(float)(i+1); // cout << "m["<<i<<"]: "<< m[i] << endl; decPart = modf(m[i],&intPart); // cout << "decPart:" << decPart << "\t intPart: "<<intPart << endl; if(decPart >= 0.5){ counter[i] = (int)(intPart + 1); } else{ counter[i] = (int)intPart; } // cout << "counter["<<i<<"]: "<< counter[i]<<endl; } k=n; for(i=0;i<n;i++){ for (j=0; j<counter[i]; j++){ // cout <<"n: "<<n<<" k: "<< k << " counter["<<i<<"]: " << counter[i] << endl; // getchar(); clone[k] = clone[i]; k++; if (k >= POP){ k = 0; } } } } else{ sortPop(clone); for (i=0;i<POP;i++){ if(isNull(clone[i])) break; n++; } k=n; var = (int)((POP-n)*0.5); for(i=0;i<n;i++){ for (j=0; j<var; j++){ clone[k] = clone[i]; k++; } var = var - (int)(POP*0.1); } } for (i = 0; i < POP; i++) { clonePop[i] = clone[i]; } // printPop(clonePop); }