int main() { int O, D; time_t first, second; system("clear"); printf("ORIGEM.: "); scanf("%d",&O); printf("DESTINO.: "); scanf("%d",&D); first=time(NULL); inicializa(); gerapop(); geracao = 1; while(geracao<=num_ger) { selecao(); cruzamento(); aptidao(O,D); mutacao(); geracao++; } second=time(NULL); printf("\nTempo Gasto em Segundos: %.2f\n", difftime(second,first)); getch(); return 0; }
Ag *reproducao(Ag* Pais, int *mascara_cruzamento){ int i,j=0,*pai1,*pai2,**aux=NULL, rand1,rand2; //int k_individuos=rand_lim1(Pais->linhas);/*Quantidade de pais se podem reproduzir*/ float prob_mutacao; Ag *Filhos=NULL; Filhos=malloc(sizeof(Ag)); Filhos->matriz=malloc(1 * sizeof(int *)); Filhos->colunas=22; for(i=0;i<Pais->linhas;i++){ Filhos->matriz = (int **) realloc(Filhos->matriz, (j + 1) * sizeof(Filhos->matriz)); Filhos->matriz[j]=malloc(Pais->colunas * sizeof(int)); //rand1=rand_lim1(k_individuos);//escolhe posicao aleatoria de entre os melhores k_individuos rand1=selecaoTorneio(Pais->matriz,Pais->linhas);//escolhido o 1º Pai pai1=Pais->matriz[rand1];//escolhido o 1º Pai*/ do{ rand2=selecaoTorneio(Pais->matriz,Pais->linhas);//escolhido o 2º Pai }while (rand1==rand2); pai2=Pais->matriz[rand2];//escolhido o 2º Pai*/ aux=cruzamento(mascara_cruzamento,pai1,pai2); Filhos->matriz[j]=aux[0]; prob_mutacao=rand_lima(); if(prob_mutacao<=0.001){ printf("Ocorreu mutacao Filho 1\nProb mutacao %.4f\n\n",prob_mutacao); Filhos=mutacao(Filhos,j); } Filhos->matriz[j++]=aux[1]; prob_mutacao=rand_lima(); if(prob_mutacao<=0.001){ printf("Ocorreu mutacao Filho 2\nProb mutacao %.4f\n\n",prob_mutacao); Filhos=mutacao(Filhos,j-1); } /*printf("Pai 1 %d\t->",rand1+1); printArraya(pai1); printf("\nPai 2 %d\t->",rand2+1); printArraya(pai2); printf("\n\nFilho 1\t->"); printArraya(aux[0]); printf("\nFilho 2\t->"); printArraya(aux[1]); puts("\n");*/ } Filhos->linhas=j; return Filhos; }
void cria_nova_geracao(){ int i; for(i=0;i<TAMANHO_POPULACAO-1;i++) { //Seleção torneio(i, populacao, &pai1); torneio(i+1, populacao, &pai2); //Recombinação recombinacao(&pai1, &pai2, &filho1, &filho2, TAXA_DE_RECOMBINACAO); //Mutação mutacao(&filho1, TAXA_DE_MUTACAO); mutacao(&filho2, TAXA_DE_MUTACAO); filho1.aptidao = funcao_de_avaliacao(&filho1); filho2.aptidao = funcao_de_avaliacao(&filho2); adiciona_individuo(&filho1,i); adiciona_individuo(&filho2,++i); } //Ordena a geração atual qsort(populacao, TAMANHO_POPULACAO, sizeof(individuo), (int(*)(const void*, const void*))compara_individuo); //Ordena a nova geração qsort(copia_populacao, TAMANHO_POPULACAO, sizeof(individuo), (int(*)(const void*, const void*))compara_individuo); //Mantém a elite e substitui o restante pelos melhores da nova geração int j = 0, l; for(i = ELITE; i < TAMANHO_POPULACAO;i++,j++){ for(l=0;l<TAMANHO_INDIVIDUO;l++){ populacao[i].genotipo[l] = copia_populacao[j].genotipo[l]; } } }