sbas:ss2013:genalg
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
sbas:ss2013:genalg [11.09.2013 08:34] – angelegt Tobias Kaminsky | sbas:ss2013:genalg [28.11.2022 00:11] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
====== Genetischer Algorithmus ====== | ====== Genetischer Algorithmus ====== | ||
+ | „Genetische Algorithmen sind Optimierungsverfahren, | ||
+ | So ist zum Beispiel das Problem des Handlungsreisenden formal lösbar, indem alle Möglichkeiten überprüft werden. Dies ist aber aufgrund der Komplexitätsklasse von O(n!) nicht auf größere Probleme anwendbar, da schon bei n=30 2,6*10^32 Möglichkeiten entstehen. | ||
+ | Genetische Algorithmen sind in der Lage diese Problemklasse effizient zu lösen. Sie sind an die biologische Evolution angelehnt und verwenden die Terminologie (vgl. Harbich, 2007, S. 3). | ||
+ | In der Evolution sind die Chromosomen die Träger der Erbsubstanz. Einzelne Abschnitte dieser Chromosome werden als Gene bezeichnet und können verschiedene Ausprägungen (Allele) haben. | ||
+ | Evolution bezeichnet nun die Veränderung der Gene einer Population von einer Generation zu der nächsten. Hierbei sind drei wichtige Mechanismen zu beachten: | ||
+ | * Selektion: Die am Besten angepassten Individuuen einer Population haben die größte Überlebenswahrscheinlichkeit und bilden somit mit einer höheren Wahrscheinlichkeit die nächste Generation. Wie stark ein Individuum angepasst ist, wird mit der Fitness beschrieben. | ||
+ | * Mutationen verändern willkürlich einzelne Allele von Genen. | ||
+ | * Crossover: Hierbei werden mehrere Allele zusammen von einem Chromosom zum nächsten ausgetauscht | ||
+ | (vgl. Harbich, 2007, S. 4f). | ||
+ | In den nachfolgenden Kapiteln wird der genetische Algorithmus kurz erläutert und seine Umsetzung in Matlab aufgezeigt und wo nötig kommentiert. Der Code baut auf der Entwicklung von Stefan Tretner auf. | ||
+ | |||
+ | ====== Grundform eines genetischen Algorithmus ====== | ||
+ | < | ||
+ | Gegeben: Optimierungsproblem mit Suchraum S und Fitnessfunktion f | ||
+ | |||
+ | Lösung: | ||
+ | | ||
+ | | ||
+ | { | ||
+ | Berechne Fitness der Individuen aus P | ||
+ | Selektiere nach Fitness | ||
+ | Wende genetische Operatoren an | ||
+ | } | ||
+ | |||
+ | Ergebnis: bestes Individuum aus der Population | ||
+ | </ | ||
+ | (vgl. Harbich, 2007, S. 5) | ||
+ | |||
+ | ====== Startpopulation ====== | ||
+ | Als Startpopulation werden zufällige Chromosome erzeugt. Dies verhindert, dass durch eine Vorauswahl von geeigneten Chromosomen nur ein lokales Optimum gefunden wird (vorzeitige Konvergenz) (vgl. Harbich, 2007, S. 6). | ||
+ | |||
+ | **Umsetzung in Matlab** | ||
+ | <code matlab> | ||
+ | % Variablen | ||
+ | pop_size = 50; % Populationsgröße | ||
+ | generations = 100; % Anzahl an Generationen | ||
+ | % Protokoll [Chromosom #, Generation #, (Chromosomausprägung, | ||
+ | protocol=zeros(pop_size, | ||
+ | </ | ||
+ | |||
+ | In dem Protokoll wird die Chromosomen- und Generationsnummer in einem Array gespeichert. Zu dieser eindeutigen Kombination (z.B. 5. Generation und 10. Chrosomom) wird die aktuelle Chromosomausprägung und der dazugehörige Fitnesswert gespeichert. | ||
+ | ====== Fitness ====== | ||
+ | Die Fitness beschreibt die Überlebenswahrscheinlichkeit eines Chromosoms mit der Formel: | ||
+ | < | ||
+ | `p(c_i) = f(c_i) / (\sum_{j=1}^nf(c_j))` | ||
+ | </ | ||
+ | |||
+ | |||
+ | Die Summe aller Überlebenswahrscheinlichkeiten ist 1 (vgl. Harbich, 2007, S. 6). | ||
+ | |||
+ | Der Fitnesswert ist abhängig von der jeweiligen Modellierung und wird in dort beschrieben. | ||
+ | |||
+ | Der nachfolgende Matlab-Code zeigt speichert das beste Chromosom in einer Variable, sodass der genetische Algorithmus zu jedem Zeitpunkt beendet werden kann und dennoch eine gültige und (zu diesem Zeitpunkt) beste Lösung vorhanden ist. | ||
+ | |||
+ | **Umsetzung in Matlab** | ||
+ | <code matlab> | ||
+ | % Index von bestem Chromosom | ||
+ | % bestind == [fitness generation element] | ||
+ | bestind = [0 0 0]; | ||
+ | |||
+ | % Prüfe, ob neues bestes Ergebnis | ||
+ | if (fitness > bestind(1)) | ||
+ | bestind(1) = fitness; | ||
+ | bestind(2) = f; | ||
+ | bestind(3) = chrom; | ||
+ | bestOrder = currentChrom; | ||
+ | fprintf(' | ||
+ | fprintf(' | ||
+ | fprintf(' | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | ====== Selektion ====== | ||
+ | |||
+ | Die Auswahl der Chromosomen, | ||
+ | Dieser Vorgang wird so oft wiederholt, bis die nachfolgende Generation die gleiche Populationsgröße wie die vorherige hat. | ||
+ | [{{ : | ||
+ | **Umsetzung in Matlab** | ||
+ | <code matlab> | ||
+ | % Sortiere aktuelle Population nach Fitness | ||
+ | protocol(:,:, | ||
+ | |||
+ | % Erstelle neues Intervall [0,1] | ||
+ | R = rwheel(protocol(:,:, | ||
+ | |||
+ | % Erstelle temporäre Generation | ||
+ | Pnew = zeros(pop_size, | ||
+ | |||
+ | % Fülle temporäre Generation mit alten Chromosomen anhand deren Wahrscheinlichkeit | ||
+ | for i=1: | ||
+ | Pnew(i,:) = P(wheel_select(protocol(:,:, | ||
+ | end | ||
+ | | ||
+ | % Kopiere Pnew nach P | ||
+ | P = Pnew; | ||
+ | </ | ||
+ | |||
+ | <code matlab> | ||
+ | % Erstellt [0,1] Intervall mit Wahrscheinlichkeit für alle Chromosome | ||
+ | function R = rwheel(pop, | ||
+ | R = zeros(length(pop), | ||
+ | summe = sum(pop(:, | ||
+ | for id = 1: | ||
+ | R(id) = sum(pop(id: | ||
+ | end | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | <code matlab> | ||
+ | % Gibt Chromosom in Abhängigkeit von Zufallszahl zurück | ||
+ | function partner = wheel_select(pop, | ||
+ | rnd = rand(1); | ||
+ | id = length(thewheel); | ||
+ | while id > 1 && rnd > thewheel(id) | ||
+ | id = id-1; | ||
+ | end | ||
+ | partner = pop(id,1); | ||
+ | end | ||
+ | </ | ||
+ | |||
+ | Die Chromosome der nachfolgenden Generation werden nun mutiert bzw. ausgetauscht (crossover) (vgl. Harbich, 2007, S. 7). | ||
+ | |||
+ | ====== Mutation ====== | ||
+ | Bei der Mutation werden zufällig die Gene eines Chromosoms verändert. Hierbei wird die Wahrscheinlichkeit meist auf 1/Anzahl der Gene gesetzt. Ist ein Gen ausgewählt worden, so wird dieses durch ein zufälliges, | ||
+ | [{{ : | ||
+ | **Umsetzung in Matlab** | ||
+ | <code matlab> | ||
+ | % Schleife über alle Chromosome | ||
+ | for i=1: | ||
+ | for gen = 1:1:64 | ||
+ | % Wenn ausgewählt | ||
+ | if rand(1) <= p_mut | ||
+ | % Neue Zahl finden, die anders ist als bestehende | ||
+ | random = randi(9)-1; | ||
+ | while P(i,gen) == random | ||
+ | random = randi(9)-1; | ||
+ | end | ||
+ | P(i,gen) = random; | ||
+ | mutcount = mutcount + 1; | ||
+ | end | ||
+ | end | ||
+ | end | ||
+ | </ | ||
+ | | ||
+ | ====== Crossover ====== | ||
+ | Bei der Kreuzung werden immer zwei Chromosome paarweise ausgewählt. Über eine Zufallszahl wird entschieden, | ||
+ | |||
+ | [{{ : | ||
+ | In der Abbildung ist das Vorgehen schematisch für zwei Chromosome gezeigt. Die Kreuzung erfolgt bei z=3 (vgl. Harbich, 2007, S. 7f). | ||
+ | |||
+ | **Umsetzung in Matlab** | ||
+ | <code matlab> | ||
+ | % CROSSOVER | ||
+ | % speichert Crossover-Kandidaten | ||
+ | Q = []; | ||
+ | for i=1: | ||
+ | if rand(1) <= p_cross | ||
+ | Q = [Q i]; | ||
+ | end | ||
+ | end | ||
+ | | ||
+ | disp([' | ||
+ | | ||
+ | % Führe Kreuzung durch | ||
+ | while length(Q)> | ||
+ | % wähle erstes Element (Index) aus und lösche es aus Q | ||
+ | rand1 = floor(1 + (length(Q))*rand(1)); | ||
+ | elem1 = Q(rand1); | ||
+ | Q(rand1) = []; | ||
+ | | ||
+ | % wähle zweites Element (Index) aus und lösche es aus Q | ||
+ | rand2 = floor(1 + (length(Q))*rand(1)); | ||
+ | elem2 = Q(rand2); | ||
+ | Q(rand2) = []; | ||
+ | | ||
+ | | ||
+ | father = P(elem1,:); | ||
+ | mother = P(elem2,:); | ||
+ | cut = floor(1 + (64-1)*rand(1)); | ||
+ | | ||
+ | % overwrite mother & father with children | ||
+ | P(elem1, | ||
+ | P(elem1, | ||
+ | | ||
+ | P(elem2, | ||
+ | P(elem2, | ||
+ | end | ||
+ | </ | ||
+ | | ||
+ | ====== Abbruchbedingung ====== | ||
+ | Mit jeder neuen Generation ist es prinzipiell möglich, dass eine neue, bessere Lösung gefunden werden kann. Daher sollten andere Abbruchbedingungen definiert werden. Möglich sind: | ||
+ | * Abbrechen nach n Generationen | ||
+ | * Keine signifikante Verbesserung zur vorherigen Generation | ||
+ | (vgl. Harbich, 2007, S. 8) | ||
+ | |||
+ | |||
+ | ====== Download | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ====== Literatur | ||
+ | |||
+ | Harbich, S. 2007. // | ||
+ | |||
+ | {{indexmenu_n> |
sbas/ss2013/genalg.1378881271.txt.gz · Zuletzt geändert: 28.11.2022 00:11 (Externe Bearbeitung)