Ir ao conteúdo

Posts recomendados

Postado

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

Postado

No caso você tem vários vector<int> da linguagem C++, que no caso seria trocado por matrizes: int [], como o CiroboyBR disse. porém eu acho que na linguagem C não foi implementado a possibilidade de declarar variáveis dentro do loop 'for', exemplo: no C++ podemos usar 'for(int j = 0; j < 8; j++)' mas no C temos que declarar o j e depois usar normalmente no loop, exemplo: 

int j = 0;

for(j = 0; j < 8; j++){

}

Então se quiser usar for no C, terá que declarar as variáveis antes de usar no loop.

vector<> é do std da biblioteca <iostream>.

Postado

@1freakday só complementando, no C pode-se declarar variáveis dentro do for, mas tem que que marcar o flag -std=c99 nas opções do compilador, ou adicionar -std=c99 no "Other compiler Options"

 

 

 

 

  • Curtir 1
Visitante
Este tópico está impedido de receber novas respostas.

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!