Ajuda em lógica :(

Galera, to com um problema de lógica.
Eu tenho um array que tem n Objetos de outra classe. Os objetos dessa classe são criados tendo um número que varia de 1 a 100 sendo mandados por parâmetro.
O que eu to fazendo é: comparo o campo 0 com o 1 e vejo quem tem o “melhor valor” e esse que tem o melhor valor, vai para a posição 0. Comparo o 2 c/ o 3 e o que tem o “Melhor valor” vai para a posição 1, e assim por diante, até chegar no final do array. Isso faz com que meu array fique com os melhores valores até a metade do array. A outra metade eu queria colocar novos objetos, mas esses objetos não podem ter o mesmo número que os que tem a outra metade tem. Não podem ter valores repetidos… Se no meu array que os melhores valores estão, tem objetos que tem o numero 1, 3, 5, … no meu outro, os objetos criados devem ter 2, 4, 6… e assim por diante (não precisam ser na ordem), até atingirem 100 ou 99. Estou gerando aleatoriamente esses novos valores, mas não consigo encontrar uma maneira de eles derem certo.

        /* Array de novos individuos gerados aleatoriamente */
        for (i = j; i < numeroIndividuos; i++)
        {
            int k = 0;
            int cotador = 0;
            /* Cria um novo individuo conforme o índice do for. */
            Indivíduo aux = new Indivíduo(i);
            /* Como não podem ter indivíduos com o mesmo nome, ocorre essa troca de numeros. */
            while (contador <= numeroInividuos)
            {
            for (k = 0; (k < numeroIndividuos/2) /*|| (aux.getNumero() != populacao[k].getNumero())*/; k++)
            {
                if (aux.getNumero() == populacao[i].getNumero())
                {
                    do {
                        aux.setNumero(geradorAleatorio.nextInt((numeroIndividuos)));
                    } while ((populacao[k].getNumero()) == (aux.getNumero()));
                }
            populacao[i] = aux;
            contador++;
            }
             }     
        }

Alguem ajuda? Ah! O j = metade do array pra frente.

Valeu, abraço!

Cara, ao invés de usar arrays porque você não usa uma coleção?? Ai você pode implementar um Comparable para fazer essa ordenação. E também pode usar um conjunto que não permite duplicatas.

p.s.: Você está implementando um AG??

T+

Oi moço :slight_smile:
Desculpa, pelos menos eu não entendi… <:)
Tipo, entendi que a metade fica com os melhores valores, mas o código que vc pôs aqui faz o quê, só cria os valores? Dá pra vc pôr o código que tá tentando fazer pra resolver seu problema? :slight_smile:
Você pode dar um exemplo de como funciona seu programa? Assim ,um exemplo numérico? Pra ficar mais fácil de entender :slight_smile:
Dá como exemplo uma lista de objetos desordenados e como eles devem ficar depois do programa
Desculpa mais uma vez por pedir tanto, mas assim dá pra p/ o pessoal te ajudar melhor tá :smiley:
Té mais++

Pois é cara, eu to bem querendo. O ruim é que vou ter que mudar o programa inteiro, e esse final de semana eu não posso fazer isso porque tenho prova segunda feira. Eu já estou arrumando pra usar um ArrayList. Será que é a melhor coleção ou eu deveria usar um HashMap (na verdade os números são só pra mostrar o indivíduos… não tem grande importância isso, mas preciso pra fazer gráficos dos melhores indivíduos)?

 p.s.: Você está implementando um AG??

Sim.

aleineea

O código que eu coloquei só cria os valores mesmo. Eu vou colocar a seleção, onde dá pra ver melhor o código… ele está meio ruim de se eler, por causa dos ifs aninhados… tenho que fazer muitas verificações…

A seleção é a comparação de 2 indivíduos consecutivos e escolhe pra ficar no array quem for o melhor.
O melhor valor fica entre 10.8 e 11.5. Se der um valor tipo 9 ou 2, esses ainda são melhores que os maiores que 11.5.
Então, por exemplo, se derum valor no campo 0 de 9 e no campo 1 de 10.10, o valor de 10.10 fica no array na posição 0. O campo 2 tem o valor de 11.5 e o valor 32.5, o de 11.5 fica na posição 1, e por aí vai.

/**
     * Método que vai fazer a seleção.
     */
    public void selecao()
    {
        int i = 0, j = 0;
        
        /* Torneio */
        for (i = 0; i < (numeroIndividuos - 1); i = i + 2)
        {
            double aux1 = populacao[i].getFitness();
            double aux2 = populacao[i+1].getFitness();
            Indivíduo aux;
            if ((aux1 > melhor) && (aux2 > melhor))
            {
                if ((aux1 - melhor) <= (aux2 - melhor))
                    populacao[j] = populacao[i];
                else
                    populacao[j] = populacao[i+1];
            }
            else if ((aux1 <= melhor) && (aux2 <= melhor))
            {
                if ((aux1 - melhor) >= (aux2 - melhor))
                    populacao[j] = populacao[i];
                else
                    populacao[j] = populacao[i+1];
            }
            else if ((aux1 >= melhor) && (aux2 <= melhor))
            {
                if ((aux1 - melhor) < (-1 * (aux2 - melhor)))
                    populacao[j] = populacao[i];
                else
                    populacao[j] = populacao[i+1];
            }
            else if ((aux1 <= melhor) && (aux2 >= melhor))
            {
                if ((-1 * (aux1 - melhor)) < (aux2 - melhor))
                    populacao[j] = populacao[i];
                else
                    populacao[j] = populacao[i+1];
            }
            
            j++;
        }

     
        /* Array de novos individuos gerados aleatoriamente */
        for (i = j; i < numeroIndividuos; i++)
        {
            int k = 0;
            int contador = 0;
            /* Cria um novo individuo conforme o índice do for. */
            Indivíduo aux = new Indivíduo(i);
            /* Como não podem ter indivíduos com o mesmo nome, ocorre essa troca de numeros. */
            while (contador <= numeroIndividuos)
            {
                 for (k = 0; (k < numeroIndividuos/2) /*|| (aux.getNumero() != populacao[k].getNumero())*/; k++)
                 {
                    if (aux.getNumero() == populacao[i].getNumero())
                   {
                      do {
                           aux.setNumero(geradorAleatorio.nextInt((numeroIndividuos)));
                      } while ((populacao[k].getNumero()) == (aux.getNumero()));
                   }
                  populacao[i] = aux;
                  contador++;
                 }
             }     
        }

Abraço.

Ae galera, não é para dar up no post, mas queria saber se vocês aprovariam a idéia.
Tenho medo que seja Gambiarra… eu pegar um vetor com uma quantidade de elementos e armazenar os indices dos indivíduos que perdem no torneio… daí, na hora de renomear todos os indivíduos, eu mandaria por parâmetros esses elementos do array.

Isso é gambiarra ou é lógica?