Frage

Ich habe Probleme bei der Implementierung eines einheitlichen Crossovers in Java.Dies ist der Algorithmus;

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

ich weiss ich kann int tmp und dann eine Zufallszahl speichern if tmp < 0.5 weiter mit Schleife

Ich habe es nicht geschafft, einen Anfang zu machen. Wir freuen uns über jede Hilfe!

Dies ist ein Beispiel meines One-Point-Crossovers, nur damit Sie mein Format kennen.

Ein Punkt-Crossover – Crossover-Punkt ist ausgewählt, die binäre Zeichenfolge vom Anfang des Chromosoms bis zum Crossover-Punkt wird von einem Elternteil kopiert, der Rest wird vom zweiten Elternteil kopiert.

Elternteil 1 = Chromosom und Elternteil 2 = Indi.

Ich verwandle die Eltern direkt in Kinder

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;
        }   
    }   
}
War es hilfreich?

Lösung

Mit einem einheitlichen Crossover möchten Sie im Allgemeinen Folgendes tun:

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

Aus Ihrem Ein-Punkt-Beispiel geht hervor, dass Sie beide Eltern gleichzeitig an Ort und Stelle ändern.In welchem ​​Fall:

For each gene
  if rand()<0.5
    leave both parents alone
  else
    swap chromosome[i] with indi.chromosome[i] as before
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top