Information Technology Reference
In-Depth Information
Die Crossover-Arten werden vollständig in der Methode
crossover(Indivi-
duum, Crossoverschema)
abgearbeitet. Durch den Parameter
art
wird ausge-
wählt, ob ein One-Point-, Two-Point- oder Uniform-Crossover durchgeführt wird. Weitere
Crossover-Arten sind in der
switch
-Anweisung zu definieren und damit auszuführen.
Die temporäre Variable
temp
muss an den Typ der Atome angepasst werden. Gekreuzt
werden das aktuelle Individuum (dessen Methode ausgeführt wird) und das in der Variab-
len übergebene. Zurückgegeben wird nichts, da direkt auf den Individuen operiert wird!
Zufällig werden der oder die Schnittpunkte mit der schon erwähnten
nextInt
-Methode
festgelegt. Beim Uniform Crossover wird für jedes Atom ein Zufallsexperiment durch-
geführt.
Der Konstruktor erzeugt das Objekt und legt das Array
individual[]
in der ge-
wünschten Länge an. Die Methode
print()
zeigt alle Atome sowie deren Fitnesswerte
an. Zur Herstellung einer Kopie des Individuums wird die
clone()
- Methode ver-
wendet. Zur Erstellung einer Kopie des Individuums muss das Array mit den Atomen
elementweise kopiert werden. Dies ist auch technisch beim Aufruf des Vererbungsschritts
in der Klasse
Population
bedingt. Hier wird eine Methode aus der Klasse
Object
überschrieben, deshalb auch das Casting beim Aufruf. Ebenfalls wird die Klasse
Popu-
lation
für den Algorithmus benötgt. Ein Objekt dieser Klasse besteht aus einem Array
von Objekten der Klasse
Individuum
.
Als Vitalfunktionen gelten die Methoden
selektieren()
und
schritt()
. Ers-
tere dient zur Auswahl von Elementen zur Reproduktion und letztere zum Ausführen von
Crossover und Mutation. Komplettiert werden diese Vitalfunktionen durch die folgenden
Auswertungsmethoden. In der Methode
selektieren()
wird zunächst die Gesamt-
fitness als Summe aller Fitnesswerte der vorhandenen Individuen berechnet. Die Variable
cut
bekommt dann einen zufälligen Wert zwischen 0 und der Gesamfitness zugewiesen.
Daran anschließend werden die Fitnesswerte aus der Population wieder aufsummiert, al-
lerdings nur bis zu dem Punkt, an dem der cut-Wert erreicht ist. Der Index des Individu-
ums, das erreicht wurde, bevor der Wert überschritten wurde, wird zurückgegeben.
Die Methode
schritt()
benötigt drei Parameter, nämlich die Variable
cross-
overschema
, die beim Aufruf von
crossover()
übergeben werden muss, dazu
crossoverws
, also die Wahrscheinlichkeit, mit der überhaupt ein Crossover durch-
geführt wird, und schließlich
mutationsws
, die Wahrscheinlichkeit, dass ein einzel-
nes Atom mutiert wird (dieser Wert wird an
mutieren()
weitergegeben). In diesem
Schritt wird zunächst eine neue Population erzeugt, in die als erstes - durch Aufruf von
bester()
bestimmt - das beste Individuum kopiert wird. Die folgende Schleife wird
so oft durchlaufen, bis die neue Population gefüllt ist. Zwei Eltern werden selektiert und
in die Variablen
kind1
und
kind2
kopiert. Diese werden mit der Wahrscheinlichkeit,
die durch
crossoverws
festgelegt wurde, einem Crossover unterzogen. Nachdem dann
beide Kinder mutiert wurden, wird das Kind mit der besseren Fitness der neuen Popula-
tion zugeschlagen.