Ir ao conteúdo
  • Cadastre-se

Paulo Furtado Jr.

Membro Júnior
  • Posts

    5
  • Cadastrado em

  • Última visita

Reputação

0
  1. @xcroos Eu estou com o mesmo problema você conseguiu resolver?
  2. Gostaria de saber se alguém tem códigos ou algum material sobre algoritmo genético na linguagem C? Estou precisando aprender esse conteúdo e estou tendo dificuldade na implementação. Na internet não consegui encontrar nada desse assunto em C.
  3. Olá pessoal me ajudem com esse algoritmo, eu gostaria de transformá-lo em linguagem C, me ajudem por favor. // Algoritmos Genéticos - Problema OneMax #include <iostream> #include <vector> #include <stdlib.h> #include <time.h> using namespace std; // parâmetros do algoritmo genético int tam_genes = 100; // quantidade de genes int tam_pop = 50; // quantidade de indivíduos da população int tam_torneio = 20; // tamanho do torneio int geracoes = 500; // quantidade de gerações double prob_mut = 0.2; // probabilidade de mutação double prob_cruz = 0.7; // probabilidade de cruzamento // população vector<vector<int> > populacao; void inicializaPopulacao() { for(int i = 0; i < tam_pop; i++) { vector<int> individuo; for(int j = 0; j < tam_genes; j++) { int num = rand() % 2; // escolhe um número no intervalo [0,1] individuo.push_back(num); // insere no vetor do individuo } populacao.push_back(individuo); // insere no vetor da populacao } } void mostrarPopulacao() { for(int i = 0; i < tam_pop; i++) { for(int j = 0; j < tam_genes; j++) cout << populacao[j] << " "; cout << endl; } } // retorna o score do indivíduo int obterPontuacao(vector<int> individuo) { // o score é a soma dos valores dos genes int soma = 0; for(int i = 0; i < tam_genes; i++) soma += individuo; return soma; } // realiza a mutação void mutacao(vector<int>& individuo) { // escolhe um gene aleatoriamente no intervalo [0, tam_genes - 1] int gene = rand() % tam_genes; // modifica o valor do gene escolhido if(individuo[gene] == 0) individuo[gene] = 1; else individuo[gene] = 0; } // realiza o cruzamento void cruzamento(int indice_pai1, int indice_pai2, vector<int>& filho) { // escolhe um ponto aleatoriamente no intervalo [0, tam_genes - 1] int ponto = rand() % tam_genes; for(int i = 0; i <= ponto; i++) filho.push_back(populacao[indice_pai1]); for(int i = ponto + 1; i < tam_genes; i++) filho.push_back(populacao[indice_pai2]); } // retorna o índice do melhor indivíduo da população int obterMelhor() { int indice_melhor = 0; int score_melhor = obterPontuacao(populacao[0]); for(int i = 1; i < tam_pop; i++) { int score = obterPontuacao(populacao); if(score > score_melhor) { indice_melhor = i; score_melhor = score; } } return indice_melhor; } int main(int argc, char *argv[]) { srand(time(NULL)); inicializaPopulacao(); //mostrarPopulacao(); for(int i = 0; i < geracoes; i++) { for(int j = 0; j < tam_torneio; j++) { // calcula a probabilidade de cruzamento double prob = ((double) rand() / ((double)RAND_MAX + 1)); if(prob < prob_cruz) { // escolhe dois pais int indice_pai1 = rand() % tam_pop; int indice_pai2; // garante que os índices dos pais não são iguais do { indice_pai2 = rand() % tam_pop; } while(indice_pai1 == indice_pai2); vector<int> filho; // aplica o cruzamento de 1 ponto cruzamento(indice_pai1, indice_pai2, filho); // calcula a probabilidade de mutação prob = ((double) rand() / ((double)RAND_MAX + 1)); if(prob < prob_mut) mutacao(filho); int score_pai = obterPontuacao(populacao[indice_pai1]); int score_filho = obterPontuacao(filho); /* se a pontuação (score) do filho for melhor do que o pai1, então substitui o pai 1 pelo filho */ if(score_filho > score_pai) { // faz a cópia dos genes do filho para o pai for(int k = 0; k < tam_genes; k++) populacao[indice_pai1][k] = filho[k]; } } } cout << "geração " << i + 1 << endl; cout << "Melhor: "; int indice_melhor = obterMelhor(); int score_melhor = obterPontuacao(populacao[indice_melhor]); for(int j = 0; j < tam_genes; j++) cout << populacao[indice_melhor][j] << " "; cout << "\nPontuacao: " << score_melhor << "\n\n"; // verifica se encontrou a solução ótima global if(score_melhor == tam_genes) break; } return 0; }

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!