O Algoritmo Genético
Por: w2020 • 27/5/2020 • Resenha • 450 Palavras (2 Páginas) • 252 Visualizações
import java.util.Random;
public class AlgoritmoGenetico {
private Cromossomo populacao[];
private int tabuleiro[][];
private Random gerador;
private int qtdPopulacao;
private int x;
private int y;
public AlgoritmoGenetico(int qtdPais, int qtdFilhosPorCasal, int maximoGeracoes, int x, int y) {
tabuleiro = new int[8][8];
gerador = new Random();
qtdPopulacao = calcularQtdPopulacao(qtdPais, qtdFilhosPorCasal);
System.out.println("Populacao: "+qtdPopulacao);
populacao = new Cromossomo[qtdPopulacao];
this.x = x;
this.y = y;
Cromossomo melhorCromossomo = new Cromossomo(x, y);
int geracao=0;
int ultimaGeracao=0;
long tempoInicial = System.currentTimeMillis();
criarPais(qtdPais);
while(true) {
acasalamento(qtdPais, qtdFilhosPorCasal);
selecaoNatural();
if(populacao[0].getNota() > melhorCromossomo.getNota()) {
ultimaGeracao = geracao;
long tempoFinal = System.currentTimeMillis();
melhorCromossomo = populacao[0];
melhorCromossomo.mostrar();
System.out.println("new AlgoritmoGenetico("+qtdPais+", "+qtdFilhosPorCasal+", "+maximoGeracoes+", "+x+", "+y+")");
System.out.println("Geração: "+geracao+" Tempo: " + (tempoFinal - tempoInicial)/1000.0 + " segundos");
mostrarPercursoMelhorCromossomo();
}
if(melhorCromossomo.getNota()==63) {
System.out.println("Encontrado melhor cromossomo!");
break;
}
if(geracao-ultimaGeracao>maximoGeracoes) {
ultimaGeracao = geracao;
criarPais(qtdPais);
}
geracao++;
}
}
private void criarPais(int qtdPais) {
for(int i=0; i<qtdPais; i++) {
populacao[i] = new Cromossomo(x, y);
gerarNota(populacao[i]);
}
}
private void acasalamento(int qtdPais, int qtdFilhos) {
int posicao = qtdPais;
for(int pai=0; pai<qtdPais-1; pai++) {
for(int mae=pai+1; mae<qtdPais; mae++) {
for(int filho=0; filho<qtdFilhos; filho++) {
populacao[posicao] = crossover(populacao[pai], populacao[mae]);
gerarNota(populacao[posicao]);
posicao++;
}
}
}
}
public void mostrarDados() {
System.out.println("Quantidade de populacao: "+qtdPopulacao);
System.out.println("Populacao: ");
for(int i=0; i<qtdPopulacao; i++) {
if(populacao[i] != null) {
populacao[i].mostrar();
}
}
}
private int calcularQtdPopulacao(int qtdPais, int qtdFilhos) {
return calcularQtdCasais(qtdPais, qtdFilhos)*qtdFilhos + qtdPais;
}
private int calcularQtdCasais(int qtdPais, int qtdFilhos) {
return fatorial(qtdPais) / (fatorial(qtdPais-2)*2);
}
private int fatorial(int n) {
int resultado = 1;
for(int i=1; i<=n; i++) {
resultado = resultado*i;
}
return resultado;
}
private void limparTabuleiro() {
for(int y=0; y<8; y++) {
for(int x=0; x<8; x++) {
tabuleiro[x][y] = 0;
}
}
}
private boolean isMovimentoValido(int movimento, int x, int y) {
switch (movimento) {
case 1: x+=1; y+=2; break;
...