Iniciando em Algoritmos Genéticos

Boa noite amigos,
entrei em um projeto de algoritmo genético na semana passada e comecei a desenvolver tudo do início!
pela rápida introdução que tive do assunto eu já criei algumas classes. Porém como ainda estou no 3º período de Ciência da computação estou um pouco imaturo, inexperiente… e por isso estou “imendando” partes de códigos que estou achando na net e tentando entender o que acontece.
Gostaria de saber se posso contar com a ajuda de vocês para sanar algumas de minhas dúvidas (dúvidas bobas :oops: ).

O objetivo inicial do projeto é que nós (alunos) possamos aprender a essência da coisa… hehe

eis o código:
Classe Gene ->

[code]import java.util.Random;

public class Gene {

private byte valor;

public byte getValor() {
    return valor;
}

/* 
 * Cria um gene aleatoriamente
 */
public Gene() {
    Random rand = new Random();
    this.valor = (byte) rand.nextInt(2);

}

}[/code]

Classe CriaCromossomo ->

[code]
public class CriaCromossomo {

private final int TAMANHO_DO_CROMOSSOMO = 4;
Gene[] genes;

public CriaCromossomo() {
    genes = new Gene[TAMANHO_DO_CROMOSSOMO];
    initCromossomo();
}

private void initCromossomo() {
    for (int i = 0; i < TAMANHO_DO_CROMOSSOMO; i++) {
        genes[i] = new Gene();
    }
}

public Gene[] getGenes() {
    return genes;
}

public int getTAMANHO_DO_CROMOSSOMO() {
    return TAMANHO_DO_CROMOSSOMO;
}
/*
 * Insere valores no CriaCromossomo
 */

public void mostraCromossomo() {
    for (int i = 0; i < TAMANHO_DO_CROMOSSOMO; i++) {
        System.out.print(genes[i].getValor());
    }
    System.out.println();
}
private int fitness = 0;

public int calcFitness() {
    for (int i = 0; i < TAMANHO_DO_CROMOSSOMO; i++) {
        if (genes[i].getValor() == 1) {
            fitness++;
        }
    }
    return fitness;
}

}[/code]

Classe Cromossomo ->

[code]public class Cromossomo {
CriaCromossomo c = new CriaCromossomo();
int fitness = c.calcFitness();

public CriaCromossomo getC() {
    return c;
}

public int getFitness() {
    return fitness;
}

}[/code]

Se não for pedir demais, gostaria de ajuda no código já existente e na criação da população, crossover, etc. :wink:

Desde já agradeço! =)

Abraços

Ae cara, talvez ajude vc dar uma olhada nesse projeto: http://jgap.sourceforge.net/, tem vários componentes lá, é open source, etc e tal, quem sabe ao menos ele te dá alguma inspiração extra! :slight_smile:

Algo legal sobre algoritmos genéticos mas em C++ é o que o ViniGodoy escreveu em 4 artigos. O primeiro: http://sofiaia.wordpress.com/2008/07/13/algoritmos-geneticos/

Olá

Bruno, desculpe se estou errado, mas pelo que vejo você ainda não aprendeu algoritmos genéticos direito e já quer desenvolver uma espécie de framework? Talvez fosse melhor você resolver algum problema simples, como por exemplo achar o máximo de uma função do primeiro ou segundo grau usando algoritmos genéticos.

De qualquer forma, a iniciativa é válida e vou comentar algumas coisas sobre seu código:

  1. Você está partindo do princípio que todos os problemas solucionáveis com algoritmos genéticos podem ser modelados usando apenas bits, ou seja, zeros e uns. Mas há situações em que é melhor usar números decimais mesmo. Por exemplo, se você usar algoritmos genéticos para achar o máximo de uma função como sugeri acima, verá que expressar as soluções em bits é muito mais complicado.

  2. O que você chama de gene é um cromossomo na verdade. Cada elemento do array é um gene, e o conjunto deles é que forma um cromossomo. E o que você está chamando de cromossomo é na verdade a sua população de soluções.

  3. Veja que você deverá ainda prover algoritmos de seleção de indivíduos da sua população. O mais utilizado é o método da roleta, mas em alguns problemas pode ser mais adequado usar um outro algoritmo.

Vou anexar aqui um exercício da faculdade que fiz para achar o máximo da função f(x) = x * sen(10 * PI * x) + 1, tomara que lhe seja útil.

Pra finalizar, este link aqui pode ser de grande ajuda: http://www.obitko.com/tutorials/genetic-algorithms/portuguese/

Abraços

Obrigado pelas dicas amigos 8)
Realmente eu sou completamente leigo em AG.
Acontece que o desenvolvimento desse AG é pra puro aprendizado das funções ( gerar população, realizar crossover, mutação, etc), somente pra pegar a ideia de como deve funcionar. Por isso estou considerando somente 1 bit ( 0 ou 1). Mostei meu código para um professor da faculdade e ele me aconselhou usar Strings pelo fácil manuseio! Já comecei a mudar o código e realmente parece mais simples. Assim que eu mudar o código eu posto novamente aqui pra vocês.
Abraços e obrigado! :smiley: :smiley:
Edit:
Aqui vai o codigo mudado pra String conforme dito acima :slight_smile:
Qualquer critica é bem-vinda!

[code]package AG;

import java.util.Random;

public class Cromossomo {

private Random rand = new Random();
private char[] binario = "01".toCharArray();

public String geraGene() {
    StringBuffer gene = new StringBuffer();
    int ch = rand.nextInt(binario.length);

    gene.append(binario[ch]);

    return gene.toString();
}

public String geraCromossomo(int tamanhoCromossomo) {
    String crom = "";
    for (int i = 0; i < tamanhoCromossomo; i++) {
        crom += geraGene();
    }
    return crom;
}

public String[] geraPopulacao(int tamanhoPopulacao, int tamanhoCromossomo) {
    String[] populacao = new String[tamanhoPopulacao];
    for (int i = 0; i < tamanhoPopulacao; i++) {
        populacao[i] = geraCromossomo(tamanhoCromossomo);
    }
    return populacao;
}

}

[/code]

[code]package AG;

public class MainTemp {

public static void main(String args[]) {
    final int TAMANHO_POP = 10,  TAMANHO_CROM = 4;
    Cromossomo c = new Cromossomo();
    for (int i = 0; i < TAMANHO_POP; i++) {
        System.out.println(c.geraPopulacao(TAMANHO_POP, TAMANHO_CROM)[i]);
    }



}

}[/code]

Agora preciso dar continuidade ao código… qualquer dica é bem-vinda!
valeu

Da uma olhada nesse AG aqui:

http://javafree.uol.com.br/artigo/852949/Algoritimo-genetico.html

Amigo vc poderia enviar esse exercicio por email?
ciceroantonio03@gmail.com…:obg