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;
}
示例#2
0
文件: main.c 项目: g1ll/ga_c
/**
 * <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");
}