Boa noite pessoal.
Estou com um problema para modificar um bubleSort improvisado no segundo for e não consigo acertar a lógica. Eu preciso fazer um método recebe um arraylist de indivíduos chamado ‘população’ e existe também um array vazio que receberá indivíduos ordenados por rank, porém o rank não está dentro do indivíduo (o que impossibilita de fazer Comparable.sort por rank) e o rank não será gravado no array e será calculado para cada indivíduo apenas uma vez. Queria saber o que fazer para transferir os valores do arraylist para o array baseado no rank, por exemplo:
O primeiro trecho antes do pipe caracteriza o indivíduo, o segundo a aptidão e o terceiro é o rank, ou seja: indivíduo | aptidão | rank
obs: o rank é descartável e não será salvo ele serve somente para a ordenação estou enviando set para indivíduo somente para testes.
saída atual:
9 4 5 5 8 9 5 0 9 | 1,37977 | 2,67398
4 9 8 8 0 5 3 0 6 | 0,37499 | 3,17395
7 3 2 8 9 8 2 3 7 | 1,99655 | 2,36707
6 9 8 1 2 1 9 5 2 | 2,86295 | 1,93596
5 1 2 0 6 4 1 2 3 | 1,23578 | 2,74563
saída esperada no console:
4 9 8 8 0 5 3 0 6 | 0,37499 | 3,17395
5 1 2 0 6 4 1 2 3 | 1,23578 | 2,74563
9 4 5 5 8 9 5 0 9 | 1,37977 | 2,67398
7 3 2 8 9 8 2 3 7 | 1,99655 | 2,36707
6 9 8 1 2 1 9 5 2 | 2,86295 | 1,93596
saída a ser gravada no array ‘não possui rank’:
4 9 8 8 0 5 3 0 6 | 0,37499
5 1 2 0 6 4 1 2 3 | 1,23578
9 4 5 5 8 9 5 0 9 | 1,37977
7 3 2 8 9 8 2 3 7 | 1,99655
6 9 8 1 2 1 9 5 2 | 2,86295
[code] Double rankInicial = Double.MIN_VALUE, melhorAptidao = Double.MIN_VALUE, piorAptidao = Double.MAX_VALUE, rankCorrente, aptidaoCorrente;
Individuo2[] listaIndividuos = new Individuo2[populacao.size()];
for (int i = 0; i < populacao.size(); i++) {
if (melhorAptidao < (aptidaoCorrente = populacao.get(i).getAptidao())) {
melhorAptidao = aptidaoCorrente;
}
if (piorAptidao > aptidaoCorrente) {
piorAptidao = aptidaoCorrente;
}
}
// bubleSort nesse laço
for (int i = 0; i < populacao.size(); i++) {
// equação para determinar o rank do individuo atual
rankCorrente = (populacao.size() - populacao.get(i).getAptidao()) * (melhorAptidao - piorAptidao) / (populacao.size() - 1) + piorAptidao;
// populacao.get(i).setRank(rankCorrente); // somente para teste na solução real não existe método setRank
for (int j = 0; j < populacao.size() - 1; j++) {
if (rankInicial.compareTo(rankCorrente) < 0) {
Individuo2 aux = populacao.get(j);
listaIndividuos[j] = populacao.get(j + 1);
listaIndividuos[j + 1] = aux;
}
}
rankInicial = rankCorrente;
}
for (Individuo2 i : listaIndividuos) {
System.out.println(i.toString());
}[/code]
Estou a muito tempo tentando implementar esse método de AG, por isso agradeço a todos que tiverem alguma ideia para compartilhar.