Ir para conteúdo
Fórum Script Brasil

Paullo

Membros
  • Total de itens

    1
  • Registro em

  • Última visita

Posts postados por Paullo

  1. Olá pessoal me ajudem com esse algoritmo, eu gostaria de transformá-lo em linguagem C, me ajudem por favor.:confused::confused:

     

     

    // 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;
    }

×
×
  • Criar Novo...