Domanda

Ho problemi attuare un crossover uniforme in Java. Questo è l'algoritmo;

// 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 .
}

So che posso int tmp e memorizzare numeri casuali, poi if tmp < 0.5 continuare con ciclo

Non riusciva a fare un inizio ogni aiuto è apprezzato!

Questo è un esempio di mio unico punto di crossover solo così sai il mio formato.

Un punto di crossover -. È selezionata punto di crossover, stringa binaria dall'inizio del cromosoma al punto di crossover viene copiato da un genitore, il resto viene copiato dal secondo genitore

Parent 1 = cromosoma e Parente 2 = indi.

Mi rivolgo ai genitori in figli 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;
        }   
    }   
}
È stato utile?

Soluzione

con crossover uniforme, ciò che si vuole fare in generale è:

For each gene
  if rand()<0.5
    take from parent a
  else
    take from parent b

Ti sembra, dal vostro esempio di un punto, da modificando entrambi i genitori sul posto, allo stesso tempo. In questo caso:

For each gene
  if rand()<0.5
    leave both parents alone
  else
    swap chromosome[i] with indi.chromosome[i] as before
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top