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; }
/** * <h3>Algoritmos Genéticos</h3> * <p>A função ga_fo_01 tem como objetivo usar uma implementação simples de GA para * otimizar a função <i>F(x)=x*sin(10*pi*x)+1<i> em um espaço de busca definido.</p> * @file main.c * @version 0.0 * @autor Gill Velleda Gonzales * @param a Início do espaço de busca * @param step Valor de incremento * @param b Fim do espaço de busca * @param otimizacao 0 Minimiza a FO != 0 Maximiza * @pop_size tamanho da população (bug máximo 12 indivíduos) * @return * Valor otimizado de <i><b>fo_01</b></i> no espaço definido por <b>a</b> até <b>b</b> passo <b>step</b> * * @ToDo * * */ long double ga_fo_01(double a, double step, double b, int otimizacao, int pop_size) { //Inicialização int **pop, **pop_mat, //População Intermediaria size_pop = pop_size, //População genes = 12, //Tamanho de Cromossomos (Cadeia de Bits) geracao = 1, i, j, count_ev = 0, //Contador de não-evoluções ou gerações iguais que não evoluirão; nev_max = 10, //Número máximo de populações iguais que não evoluirão, critério de parada *cr_opt; float *v_ap, taxa_cros = 0.9, taxa_mutate = 0.3; printf("\nAlgoritmo Genético Processando"); //Espaço de Busca printf("\nEspaço de busca de %.3f a %.3f incrementado de %.3f", a, b, step); //Gerando a população printf("\nGerando a População ...\nCromossos: 12 genes binários\nPopulação: %d indivíduos", size_pop); pop = gerarPopIni(size_pop, genes, a, step, b); //LOOP do { if (geracao > 1) free(pop_mat); //Liberando memória - Descarta a população de Pais //Avalia População printf("\nAvaliando a população (Geração: %d)", geracao); v_ap = avaliarPop(pop, size_pop, genes, a, b); //Selecionar mais aptos printf("\n Selecionando mais aptos:\n\t-gerando mating-pool\n"); pop_mat = selecaoTorneio(pop, v_ap, size_pop, genes, otimizacao); printf("\n População Original - Geracao %d:\n", geracao); printPop(pop, size_pop, genes); printf("\n\n População Intermediária:\n"); printPop(pop_mat, size_pop, genes); free(pop); //Liberando memória - Descarta a população original //Operações de Crossover e Mutação pop = crossover(pop_mat, taxa_cros, size_pop, genes); printf("\n\n Nova Geração pós-cruzamentos:"); printPop(pop, size_pop, genes); //Mutação pop = mutate(pop, taxa_mutate, size_pop, genes); printf("\n\n Nova Geração pós-mutações:"); printPop(pop, size_pop, genes); //Geração de nova população geracao++; //count_nev = final_ga(pop, v_ap, size_pop, genes, count_nev); count_ev = final_ga(pop_mat, v_ap, size_pop, genes, count_ev); printf("\t-----------CONTADOR %d----------\n", count_ev); printf("\n||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n"); if (count_ev == nev_max) { /* aloca espaço para o cromossomo otimo */ cr_opt = (int *) calloc(genes, sizeof (int)); cr_opt = getOtimo(pop_mat, otimizacao, size_pop); } } while (count_ev < nev_max); //&& geracao <= 100); //FIM LOOP printf("\n GA- Finalizado:\n\tPopulação dos mais aptos:\n"); printPop(pop_mat, size_pop, genes); printf("\n GA- Finalizado:\n\tx = %.3f Valor ótimo;\n\t y = %.3f", bitsToFloat(cr_opt), fo_01(bitsToFloat(cr_opt))); printf("\n Tamanho da População: %d", size_pop); printf("\n Genes por Cromossomos: %d", genes); printf("\n Taxa de Cruzamento: %.1f", taxa_cros); printf("\n Taxa de Mutação: %.1f", taxa_mutate); printf("\n Última Geração: %d:\n", geracao); printf("\n\n"); }