Adaptar bubleSort em ag

0 respostas
Onimatsu

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

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());
        }
Estou a muito tempo tentando implementar esse método de AG, por isso agradeço a todos que tiverem alguma ideia para compartilhar.
Criado 21 de janeiro de 2014
Respostas 0
Participantes 1