Einheitliches Crossover in Java
-
26-10-2019 - |
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;
}
}
}
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