Problema com Algoritmo genético

5 respostas
C

Boa noite pessoal !!
Estou fazendo um trabalho para a disciplina de Inteligência Artificial, no qual eu preciso gerar uma matriz aleatória, fazer a soma dos fitness, ordena a matriz pelo fitness, faz o operador cross over e mutação com probabilidade e salvar esses dados em um arquivo .csv para mim poder abri-lo com o Excel e gerar um gráfico.

segue o código abaixo:

package controller;
import java.util.Random;
import javax.swing.JOptionPane;

public class principal {
    
    public static int tmp, aux = 0, aux1 = 0, aux2 = 0, aux3 = 0, soma = 0;
    public static int POP = 10, CROMO = 10+1, MIM = 1, MAX = 9+1, ERAS = 100;
    public static int probCross = 80, probMuta = 90; // define as probabilidades
    public static int[][] matriz = new int[POP][CROMO];
    public static int[][] matrizAux = new int[POP][CROMO];
    public static int[][] matrizAux2 = new int[POP][CROMO];
    public static String exibir = "";
    public static Random random =  new Random();

   
    public static void main(String[] args) {
        // TODO code application logic here
    
    setMatriz(gerar(matriz));  //sorteia os primeiros pais apenas uma vez
    setMatriz(fitness(matriz));
    setMatriz(ordenar(matriz));
    
    while (aux < ERAS){
        
        torneio(matriz); //evolui mais rapido por que escolhe sempre os melhores
        //roleta(matriz);
        
        if(isCrossover(probCross)){//se for maior que 50 faz crossover
        setMatriz(crossover(matriz));   
        }
        if(isMutacao(probMuta)){//se for maior que 50 faz mutação
        setMatriz(mutacao(matriz));
        }
        setMatriz(fitness(matriz));
        setMatriz(ordenar(matriz));
        exibir(matriz);
        aux++;
     }
     
     exibir(matriz);
     
    }
    
    private static int[][] gerar(int[][] matriz) {
        //primeiro sorteia os valores
        for(aux1 = 0; aux1 < POP; aux1++){
            for(aux2 = 0; aux2 < CROMO-1; aux2++){
                
                 matriz[aux1][aux2] = MIM+(random.nextInt(MAX-MIM));
                
            }   
        }
        
        return matriz;
    }
    
    public static int[][] fitness(int[][] matriz){
        //salva a soma de todos os genes na ultima posição do vetor
        for(aux1 = 0; aux1 < POP; aux1++){
            for(aux2 = 0; aux2 < CROMO-1; aux2++){
                 soma+= matriz[aux1][aux2];
            }   
            matriz[aux1][aux2] = soma;
            soma = 0;
        }
        
        return matriz;
    }
    
    public static int[][] ordenar(int[][] matriz) {
     //ordena as linhas de acordo com o melhor fitnes 
        for(aux1 = 0; aux1 < POP; aux1++){
            for(aux2 = aux1; aux2 < POP; aux2++){    
                            
                           if(matriz[aux1][CROMO-1] > matriz[aux2][CROMO-1]){
                                
                               for(aux3 = 0; aux3 < CROMO; aux3++){
                                   
                                tmp = matriz[aux2][aux3];
                                matriz[aux2][aux3] = matriz[aux1][aux3];
                                matriz[aux1][aux3] = tmp;
                                
                               } 
                        }
                  }
        }
        matrizAux = matriz;
        
        return matriz;
    }
    
    private static int[][] roleta(int[][] matriz){
    
        aux1 = 0;
    
        while(aux1 < 2){ //roleta
            //sorteia os cromossomos pais para crossover
            aux2 = random.nextInt(POP);
            //salva os selecionados
            for(aux3 = 0; aux3 < CROMO; aux3++){
                matrizAux[aux1][aux3] = matriz[aux2][aux3];
            }
        aux1++;
        }        
        return matriz;
    }   
    
    private static int[][] torneio(int[][] matriz){
        
        aux1 = 0;
        
        while(aux1 < 2){//torneio estocastico
        //escolhe os dois melhores pais
            
            for(aux3 = 0; aux3 < CROMO; aux3++){
                matrizAux[aux1][aux3] = matriz[POP-1][aux3];
                matrizAux[aux1][aux3] = matriz[POP-2][aux3];
                }
            aux1++;
        }
        return matriz;   
    }    
    
    private static int[][] crossover(int[][] matriz) {
        
        //sorteia o corte do crossover
        aux3 = random.nextInt(CROMO);
        
        aux1 = 0;
            //crossover
            for(aux2 = 0; aux2 < aux3; aux2++){
            tmp = matrizAux[aux1][aux2];
            matrizAux[aux1][aux2] = matrizAux[aux1+1][aux2];
            matrizAux[aux1+1][aux2] = tmp;
            }
        
        matriz = matrizAux;
        
        return matriz;
        
    }
    
    private static int[][] mutacao(int[][] matriz) {
    
        while(aux1 < 2){
            //sorteia posição para mutação e valor para o gene
            aux3 = random.nextInt(CROMO-1);
            aux2 = MIM+(random.nextInt(MAX-MIM));
            //mutação
            matriz[aux1][aux3] = aux2;
            aux1++;
        }
        
        return matriz;
    }

    private static void exibir(int[][] matriz) {
     
     exibir = "";   
        //salva a matriz em uma string
     for(aux1 = 0; aux1 < POP; aux1++){
         for(aux2 = 0; aux2 < CROMO; aux2++){
             exibir+= String.valueOf(principal.matriz[aux1][aux2])+"| ";
         }
         exibir+="\n";
     }//exibe o resultado
         JOptionPane.showMessageDialog(null,exibir+"\n\nEras: "+aux);
    }
    
    public static int[][] getMatriz() {
        return matriz;
    }

    public static void setMatriz(int[][] matriz) {
        principal.matriz = matriz;
    }

    private static boolean isCrossover(int probCross) {        
        return random.nextInt(100+1)<probCross;//se for maior que 50 faz crossover
    }

    private static boolean isMutacao(int probMuta) {
        return random.nextInt(100+1)<probMuta;//se for maior que 50 faz mutação
    }
 
}

5 Respostas

marcosharbs

Legal, acabei de implementar um algoritmo genético na matéria de Inteligência Artificial também,
você falou o que você quer fazer mas não falou o problema.
Com o que você está tendo problema ou onde está dando erro?

C

Bom Dia !

Eu preciso salvar os dados que são gerados em um arquivo .csv, para depois abrir este arquivo no excel e gerar um grafico.
É nisso que to tendo dificuldade e preciso de ajuda?

TerraSkilll

coutinho11
Veja se te ajuda.

Manipulação de arquivos: http://www.guj.com.br/articles/13

Abraço.

C

Preciso de ajuda Pessoal !!
como gravar os dados da matriz em um arquivo .csv?

C

blz vou tentar por este tutorial valew !!!

Criado 4 de dezembro de 2012
Ultima resposta 5 de dez. de 2012
Respostas 5
Participantes 3