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.
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.
Oi moço
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?
Você pode dar um exemplo de como funciona seu programa? Assim ,um exemplo numérico? Pra ficar mais fácil de entender
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á
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++;
}
}
}
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.