von Janko Raschke, Jochen Frömming, Alexej Völler und Mirko Bartsch
Crossing over bedeutet, dass zufällig ausgewählte Wegabschnitte aus den Wegen mit dem gleichen Abschnitt eines anderen, zufällig gewählten Weges ausgetauscht bzw. "gecrosst" werden.
Auf diese Weise wird dafür gesorgt, dass zufällig einige Wegabschnitte an andere Wege weitergegeben werden.
Dies ist ein genetischer Vorgang, der abgewandelt und wesentlich komplexer auch in der Natur vorkommt.
(load "../cross-gruppe/crossing.scm")
(load "../cross-gruppe/mische-liste.scm")
(load "../cross-gruppe/zufallspunkt.scm")
(define
; WICHTIG:
;
; pool => Stellt den Pool an Wegen mit einzelnen Knoten dar
; akku => Wird eine leere Liste übergeben!
; wert => Ist der Wert der zu bearbeitenden Wege (0.2 -> 20%, 0.6 -> 60%, 1 -> 100%)
;
(cross-over pool akku wert)
(let
cross-schleife
((schleifen-pool (mische-liste pool '()))
(schleifen-akku akku)
(grenzwert (* wert (length pool))))
(cond
((null? schleifen-pool) schleifen-akku)
((null? (cdr schleifen-pool)) (append schleifen-akku (list (car schleifen-pool))))
;Bei einer ungeraden Anzahl von Wegen wird der letzte ignoriert!
((> grenzwert (length schleifen-akku)) (cross-schleife (cddr schleifen-pool)
(append schleifen-akku (crossing (zufallspunkt (length(car schleifen-pool)))
(zufallspunkt (length(cadr schleifen-pool))) (car schleifen-pool)
(cadr schleifen-pool))) grenzwert))
(else
(reverse (append schleifen-pool (reverse schleifen-akku)))))))