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;
        }   
    }   
}
Était-ce utile?

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top