Crossover uniforme en Java
-
26-10-2019 - |
Question
Je suis de la difficulté à mettre en œuvre un crossover uniforme java. Ceci est l'algorithme;
// Uniform Crossover
public void UniformCrossover(Individual indi) {
if (RVGA.rand.nextDouble() < pc) {
// Put your implementation of uniform crossover here
// For each gene create a random number in [0, 1].
// If the number is less than 0.5, swap the gene values in
// the parents for this gene; other wise, no swapping .
}
Je sais que je peux int tmp
et stocker nombre aléatoire, puis if tmp < 0.5
continuer avec boucle
Je ne pouvais pas arriver à faire un départ toute aide est appréciée!
Ceci est un exemple de mon un point de croisement juste pour que vous connaissez mon format.
Un point croisé. - point de croisement est sélectionné, une chaîne binaire du début du chromosome vers le point de croisement est copié à partir de l'un des parents, le reste est copié à partir du second parent
Parent 1 = chromosome et Parent 2 = indi.
Je tournais les parents, les enfants en inplace
public void onePointCrossover(Individual indi) {
if (SGA.rand.nextDouble() < pc) {
int xoverpoint = SGA.rand.nextInt(length);
int tmp;
for (int i=xoverpoint; i<length; i++){
tmp = chromosome[i];
chromosome[i] = indi.chromosome[i];
indi.chromosome[i] = tmp;
}
}
}
La solution
Avec croisé uniforme, ce que vous voulez faire en général est:
For each gene
if rand()<0.5
take from parent a
else
take from parent b
Vous semblez, de votre exemple d'un point, à modifie les deux parents en place en même temps. Dans ce cas:
For each gene
if rand()<0.5
leave both parents alone
else
swap chromosome[i] with indi.chromosome[i] as before