# Rekombination (evolutionärer Algorithmus)

Als Rekombination oder Crossover wird bei evolutionären Algorithmen die Erzeugung eines neuen Genoms (auch als Filialgenom bezeichnet) aus (in der Regel) zwei Elterngenomen (Parentalgenomen) bezeichnet. Eine Funktion, die eine zulässige Menge von Parentalgenomen auf eine Menge von Filialgenomen abbildet, heißt Rekombinationsfunktion. Eine Rekombinationsfunktion ist ein genetischer Operator.
In der Literatur ist neben der Rekombination auch häufig von Crossover die Rede und beide Begriffe werden meist synonym verwendet.
Ziel der Rekombination ist es, gute Eigenschaften zweier verschiedener Eltern auf ein Kind zu übertragen. Im Vergleich zu Algorithmen, die nur die Mutation zur Veränderung der Genome benutzen, können so möglicherweise schneller Individuen gefunden werden, die zwei gute Eigenschaften A und B in sich tragen, wenn es vorher nur Individuen gab, die entweder nur über A oder B verfügten. Generell gilt, dass die Erzeugung von Elternklonen aus Effizienzgründen zu vermeiden ist.
Gute Rekombinationsfunktionen zeichnen sich dadurch aus, dass sie zumindest die guten Eigenschaften der Eltern erhalten und nicht so rekombinieren, dass diese Eigenschaften zerstört werden.
Für verschiedene Genom- und Problemtypen eignen sich verschiedene Rekombinationstypen unterschiedlich gut. Die nachstehende Liste von Operatoren ist keineswegs vollständig und dient vor allem der beispielhaften Veranschaulichung dieses dyadischen genetischen Operatortyps. Weitere Operatoren und weitere Einzelheiten sind in der Literatur zu finden.

## Rekombination von binären Zahlen (Bitstrings)

Bei der Rekombination binärer Zahlen werden die Parentalgenome an einer oder mehreren Stellen unterteilt und das Filialgenom aus diesen Teilen zusammengesetzt.
Zu den schon frühzeitig verwendeten Rekombinationsoperatoren gehören das 1-Punkt- und das n-Punkt-Crossover. Bei beiden Operatoren werden Crossoverpunkte zufällig innerhalb des Genoms eines Elters bestimmt, die dann für beide Parentalgenome gelten. Das n-Punkt-Crossover beginnt mit der zufälligen Bestimmung der Anzahl $n$ der Crossoverpunkte, deren Anzahl kleiner sein muss als die der Gene des Genoms. Beim 1-Punkt-Crossover gilt $n=1$. Das Kindgenom wird dadurch gebildet, das abwechselnd die Gene des ersten und des zweiten Parentalgenoms bis zum jeweils nächsten Crossoverpunkt auf das Kindgenom kopiert werden.
Als Beispiel soll ein 2-Punkt-Crossover dienen:
| Verfahren | Beispiel |
| Gegeben seien zwei binäre Zahlen. | $P_{0}=\left(0,1,1,0,0,1,0\right)$ und $P_{1}=\left(1,0,0,0,1,0,0\right)$ |
| Wähle nun zufällig zwei Indizes, an denen die Genome unterteilt werden. | $s_{1}=3$, $s_{2}=6$, |
| Für das Kindgenom werden aus $P_{1}$ alle Stellen übernommen, die zwischen $s_{1}$ und $s_{2}$ liegen, während alle restlichen Stellen aus $P_{0}$ übernommen werden. | $P_{C}=\left(0,1,{\underline {0,0,1,0}},0\right)$ |
Ein ebenfalls häufig genutzter Operator ist das Uniform Crossover, bei dem für jedes Gen (hier jedes Bit) zufällig entschieden wird, von welchem Parentalgenom es stammen soll.
Je nach Ausgestaltung eines Rekombinationsoperators können auch die bei den vorgestellten drei Operatoren verbleibenden Genomstücke zu einem zweiten Kindgenom zusammengefügt werden. Dann erzeugt der so modifizierte Rekombinationsoperator zwei an Stelle von einem Nachkommen pro Ausführung.

## Rekombination von ganzzahligen oder reellwertigen Genomen

Für die oben vorgestellten und für die meisten anderen Rekombinationsoperatoren für Bitstrings gilt, dass sie auch auf ganzzahlige oder reellwertige Genome, deren Gene aus je einer ganzen oder reellwertigen Zahl bestehen, entsprechend angewandt werden können. Anstelle einzelner Bits werden dann einfach ganze oder reelle Zahlen in das Kindgenom kopiert. Die Nachkommen liegen auf den verbleibenden Ecken des durch die beiden Eltern aufgespannten Hyperkörpers. Nebenstehendes Bild zeigt dies beispielhaft für den dreidimensionalen Fall, bei dem die Nachkommen auf den Ecken des durch die beiden Eltern $E_{1}=\left(1{,}5;6;8\right)$ und $E_{2}=\left(7;2;1\right)$ aufgespannten Quaders liegen.

### Diskrete Rekombination

Wenn bei der Erzeugung des Nachkommen die Regeln des Uniform Crossover für Bitstrings angewandt werden, spricht man auch von diskreter Rekombination.

### Intermediäre Rekombination

Bei diesem Rekombinationsoperator werden die Allelwerte des Filialgenoms $\alpha _{i}$ durch Mischung aus den Allelen der beiden Parentalgenome $\alpha _{i,E_{1}}$ und $\alpha _{i,E_{2}}$ erzeugt:
    $\alpha _{i}=\alpha _{i,E_{1}}\cdot \beta _{i}+\alpha _{i,E_{2}}\cdot \left(1-\beta _{i}\right)$  mit $\beta _{i}\in \left[-d,1+d\right]$ jeweils zufällig gleichverteilt pro Gen $i$
Die Wahl des Intervalls $\left[-d,1+d\right]$ bewirkt die Einbeziehung des Inneren des durch die Allelwerte der Elterngene aufgespannten Hyperkörpers und einer gewissen Umgebung. Für $d$ wird ein Wert von $0{,}25$ empfohlen, um der bei einem Wert von $0$ sonst vorhandenen Tendenz zur Verkleinerung der Allelwerte entgegenzuwirken.
Nebenstehendes Bild zeigt beispielhaft für den zweidimensionalen Fall den grau dargestellten Wertebereich der möglichen neuen Allele der beiden Parentalgenome $E_{1}=\left(2,6\right)$ und $E_{2}=\left(9,2\right)$ bei intermediärer Rekombination. Die möglichen Nachkommen der diskreten Rekombination $N_{1}$ und $N_{2}$ sind ebenfalls eingezeichnet. Die intermediäre Rekombination erfüllt die nach der Theorie der virtuellen Alphabete geforderte arithmetische Berechnung der Allelwerte des Filialgenoms. Diskrete und intermediäre Rekombination finden bei der Evolutionsstrategie standardmäßig Verwendung.

## Rekombination von Permutationen

Für kombinatorische Aufgabenstellungen werden in der Regel Permutationen verwendet, die speziell für Genome ausgelegt sind, die selbst Permutationen einer Menge sind. Die zu Grunde liegende Menge ist in der Regel eine Teilmenge von $\mathbb {N}$ oder $\mathbb {N} _{0}$. Wenn man für solche Genome 1- oder n-Punkt- oder Uniform Crossover für ganzzahlige Genome verwendet, kann es vorkommen, dass ein Filialgenom einige Werte doppelt enthält und andere fehlen. Dies kann durch Reparaturmaßnahmen (genetic repair) behoben werden, etwa indem man die überzähligen Gene (positionstreu) gegen fehlende aus dem anderen Filialgenom austauscht.
Um die Erzeugung ungültiger Nachkommen zu vermeiden, wurden spezielle Crossover-Operatoren für Permutationen entwickelt, die die Grundvoraussetzung für Permutationen erfüllen, nämlich dass alle Elemente der ursprünglichen Permutation auch in der neuen vorhanden sind und nur die Reihenfolge geändert wird. Man kann zwischen kombinatorischen Aufgaben, bei denen alle Folgen zulässig sind, und solchen, bei denen es Einschränkungen in Form von unzulässigen Teilfolgen gibt, unterscheiden. Ein bekannter Vertreter des ersten Aufgabentyps ist das Traveling-Salesman-Problem (TSP), bei dem das Ziel darin besteht, eine Menge von Städten auf der kürzesten Tour genau einmal zu besuchen. Ein Beispiel für den eingeschränkten Aufgabentyp ist das Scheduling von Workflows. Bei Workflows gibt es für einige der einzelnen Arbeitsschritte Reihenfolgebeschränkungen. So kann z. B. ein Gewinde erst geschnitten werden, nachdem das entsprechende Loch in ein Werkstück gebohrt worden ist. Solche Probleme werden auch als reihenfolgebasierte Permutationen bezeichnet.
Beispielhaft seien nachfolgend drei Operatoren vorgestellt.

### Position-based Crossover

Das Position-based Crossover und auch das nachfolgend vorgestellte Order Crossover geben die relative Reihenfolge der Elterngenome an das oder die Kinder weiter. Der Rekombinationsoperator wird anhand eines Beispiels erläutert:
| Verfahren | Beispiel |
| Gegeben seien 2 Permutationen derselben Menge | $P_{0}=\left(A,B,C,D,E,F,G\right)$ und $P_{1}=\left(E,{\underline {B}},G,A,{\underline {F}},D,{\underline {C}}\right)$ |
| sowie eine zufällige Auswahl, welche Stellen direkt von der ersten Permutation übernommen werden sollen. | $S=\left(1,0,0,1,1,0,1\right)$ |
| Als Kind-Permutation wird eine Permutation generiert, die überall dort von $P_{0}$ kopiert ist, wo $S$ eine $1$ hat. | $P_{C}=\left(A,?,?,D,E,?,G\right)$ |
| Die Stellen, die von $P_{0}$ nicht übernommen wurden, werden nun ebenfalls übernommen, aber in der Reihenfolge, wie sie in $P_{1}$ vorkommen. | $P_{\text{noch nicht übernommen}}=\left\{B,C,F\right\}$ $P_{{\text{in Reihenfolge von }}P_{1}}=\left(B,F,C\right)$ |
| Damit ergibt sich das fertige Kind-Genom. | $P_{C}=\left(A,{\underline {B}},{\underline {F}},D,E,{\underline {C}},G\right)$ |

### Order Crossover (OX1)

Neben dem feingranularen Position-based Crossover gibt es noch das Order Crossover, das in größerem Maße mit zusammenhängenden Teilstücken der Genome arbeitet. Dazu werden Anzahl und Länge der Teilstücke ausgewürfelt und danach mit den entstandenen Gensequenzen ähnlich verfahren, wie zuvor beschrieben:
| Verfahren | Beispiel |
| Gegeben seien 2 Permutationen derselben Menge | $P_{0}=\left(A,B,C,D,E,F,G,H,I,J\right)$ und $P_{1}=\left(B,D,A,H,J,C,E,G,F,I\right)$ |
| sowie eine zufällige Auswahl von Genabschnitten in $P_{0}$. Hier von Genposition 1 bis 2 und von 6 bis 8. | $P_{0}=\left({\underline {A,B}},C,D,E,{\underline {F,G,H}},I,J\right)$ |
| Als Kind-Permutation wird eine Permutation generiert, die die ausgewählten Genabschnitte von $P_{0}$ positionstreu enthält. | $P_{C}=\left(A,B,?,?,?,F,G,H,?,?\right)$ |
| Die Stellen, die von $P_{0}$ nicht übernommen wurden, werden nun ebenfalls übernommen, aber in der Reihenfolge, wie sie in $P_{1}$ vorkommen. | $P_{\text{noch nicht übernommen}}=\left\{C,D,E,I,J\right\}$ $P_{{\text{in Reihenfolge von }}P_{1}}=\left(D,J,C,E,I\right)$ |
| Damit ergibt sich das fertige Kind-Genom. | $P_{C}=\left(A,B,{\underline {D,J,C}},F,G,H,{\underline {E,I}}\right)$ |
Das Order Crossover ist unter anderem gut für das Scheduling von Workflows geeignet, wenn es in Verbindung mit 1- und n-Punkt-Crossover eingesetzt wird. In diesem Zusammenhang sei angemerkt, dass beide Operatoren nicht garantieren, dass eine Reihenfolgekorrektheit der Eltern weitervererbt wird. Dies ist jedoch kein Nachteil gegenüber anderen Operatoren, welche die Weitervererbung gewährleisten.
Man kann mit den vorgestellten Operatoren auch ein zweites (in gewisser Weise inverses) Kind erzeugen, indem man die Eltern vertauscht und das Verfahren ohne erneutes Auswürfeln erneut anwendet.

### Edge-Rekombination

Eine weitere Variante der Rekombination von Permutationen ist die Edge-Rekombination, bei der die Nachbarschaftsbeziehungen zwischen den Elementen der Elterngenome so gut wie möglich erhalten werden. Bei der Edge-2-Rekombination werden dabei Verbindungen bevorzugt, die in beiden Elterngenomen vorkommen. Die Edge-3- und Edge-4-Rekombination versuchen zusätzlich, durch Inversion der Genome noch zusätzliche Nachbarschaften auszunutzen, die bei der Edge-2-Rekombination verloren gingen. Dieses Verfahren ist besonders gut geeignet für kombinatorische Optimierungsprobleme wie das TSP.

### Weitere Rekombinationsoperatoren für Permutationen

Im Laufe der Zeit wurde eine Vielzahl von Rekombinationsoperatoren für Permutationen vorgeschlagen, so dass die folgende Liste nur eine kleine Auswahl darstellt. Für weitere Informationen wird der Leser auf die Literatur verwiesen.
* Partially Mapped Crossover (PMX)
* Cycle Crossover (CX)
* Order-based Crossover (OX2)
* Voting Recombination (VR)
* Alternating-positions Crossover (AP)
* Maximal Preservative Crossover (MPX)
* Merge Crossover (MX)

## Rekombination von Bäumen

Die Rekombination von Bäumen ist speziell für Genome ausgelegt, die selbst Bäume sind.
Ein Beispiel für eine Rekombination von Bäumen ist folgendes Verfahren:
* Gegeben seien zwei Eltern-Bäume (Eltern-Genome).
* Wähle in jedem Eltern-Baum einen Teilbaum aus.
* Vertausche diese zwei Teilbäume.
Die zwei so neu entstandenen Bäume sind nun die zwei Kind-Genome.