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