\documentclass[a4paper,10pt]{article}
    \usepackage{alltt}
    \usepackage{color}
    \usepackage{fullpage}
    \definecolor{string}{rgb}{0.7,0.0,0.0}
    \definecolor{comment}{rgb}{0.13,0.54,0.13}
    \definecolor{keyword}{rgb}{0.0,0.0,1.0}
    \title{strengthga.m}
    \author{\textsc{Matlab}, The Mathworks, Inc.}
\begin{document}
\maketitle
\begin{alltt}
0001 \textcolor{keyword}{function} [] = strengthga( overallfitness )
0002 \textcolor{comment}{%STRENGTHGA Genetischer Algorithmus zur Anpassung der Fitnesswerte}
0003 \textcolor{comment}{%   Dieser GA soll nach mehreren erfolgten Simulationsläufen mit dem}
0004 \textcolor{comment}{%   gleichen Regelsatz aber unterschiedlichen Fitnesswerten der einzelnen}
0005 \textcolor{comment}{%   Regeln die Ergebnisse der Läufe miteinander vergleichen und aufgrund}
0006 \textcolor{comment}{%   der globalen Fitness der entstandenen Strukturen die einzelnen}
0007 \textcolor{comment}{%   Stärkewerte der Regeln genetisch rekombinieren. Dadurch sollen neue}
0008 \textcolor{comment}{%   Regelsätze erzeugt werden, die sich nur durch die Fitness der einzelnen}
0009 \textcolor{comment}{%   Regeln von den alten Regelsätzen unterscheiden.}
0010 
0011 \textcolor{keyword}{global} wespe;
0012 \textcolor{keyword}{global} Wabengitter;
0013 \textcolor{keyword}{global} MittelWabe;
0014 
0015 probcrossover = 0.7; \textcolor{comment}{% feste Crossoverwahrscheinlichkeit}
0016 probmutation = 0.2; \textcolor{comment}{% feste Mutationswahrscheinlichkeit}
0017 
0018 elternzahl = 20; \textcolor{comment}{% Zahl der auszuwählenden Individuen pro GA-Durchlauf}
0019                 \textcolor{comment}{% - muss ein Vielfaches von 2 sein}
0020                 
0021 overallrezip = 1 ./ overallfitness; \textcolor{comment}{% Die reziproken Werte der Gesamtfitness}
0022                                   \textcolor{comment}{% zur Berechnung der zu löschenden}
0023                                   \textcolor{comment}{% Elemente}
0024 overallrezip = overallrezip / sum(overallrezip); \textcolor{comment}{% Normierung auf Gesamtsumme 1}
0025 
0026 overallfitness = overallfitness / sum(overallfitness); \textcolor{comment}{% Normierung auf Gesamtfitness 1}
0027                      \textcolor{comment}{% wichtig für Roulette\_wheel-Selection}
0028 
0029 cumulfitness = 0;
0030 cumulrezip = 0;
0031 \textcolor{comment}{% es werden zwei Vektoren (maxfitness und maxrezip) erzeugt, in denen für}
0032 \textcolor{comment}{% jeden Regelsatz in wespe ein Wert abgespeichert ist, der der Position des}
0033 \textcolor{comment}{% jeweiligen Abschnitts auf dem Roulette-Wheel entspricht. Der Vektor ist}
0034 \textcolor{comment}{% normiert auf 1, d.h. der letzte Wert im Vektor sollte 1.0 betragen.}
0035 \textcolor{keyword}{for} regelsatz=1:length(overallfitness)
0036     cumulfitness = cumulfitness + overallfitness(regelsatz);
0037     maxfitness(regelsatz) = cumulfitness;
0038     cumulrezip = cumulrezip + overallrezip(regelsatz);
0039     maxrezip(regelsatz) = cumulrezip;
0040 \textcolor{keyword}{end}
0041 
0042 \textcolor{comment}{% Selektion}
0043 eltern = roulette(overallfitness, maxfitness);
0044 
0045 \textcolor{comment}{% Rekombination}
0046 newstrings = onepointxover(eltern);
0047 
0048 \textcolor{comment}{% Mutation}
0049 newstrings = mutation(newstrings);
0050 
0051 \textcolor{comment}{% Selektion der zu löschenden bauagent-Objekte}
0052 \textcolor{comment}{% - Es wird das gleiche Prinzip zur Roulette-Wheel-Selektion angewendet wie}
0053 \textcolor{comment}{% bei der Eltern-Selektion, nur dass auf den Kehrwerten der Fitnesswerte}
0054 \textcolor{comment}{% gearbeitet wird und deshalb die Selektionswahrscheinlichkeit mit}
0055 \textcolor{comment}{% steigender Fitness abnimmt, d.h. dass weniger fitte bauagent-Objekte mit}
0056 \textcolor{comment}{% höherer Wahrscheinlichkeit gelöscht werden.}
0057 todelete = roulette(overallrezip, maxrezip);
0058 
0059 \textcolor{comment}{% Erzeugen von zwei zusätzlichen bauagent-Objekten in wespe}
0060 \textcolor{comment}{% - nicht mehr nötig, da die Populationsgröße konstant gehalten werden soll}
0061 \textcolor{comment}{% und für die neuen Objekte alte überschrieben werden}
0062 \textcolor{comment}{% Stattdessen direktes Ersetzen der zu löschenden Objekte und Einfügen der}
0063 \textcolor{comment}{% neuen Fitnessstrings}
0064 
0065 \textcolor{comment}{% rulesetanzahl = size(wespe,1);}
0066 \textcolor{keyword}{for} elternindex=1:elternzahl
0067     wespe(todelete(elternindex),1) = bauagent(Wabengitter(1:2, MittelWabe)', 1);
0068     wespe(todelete(elternindex),1).classifierfitnessstring = newstrings(1,:);
0069     wespe(todelete(elternindex),1).updatefitness;
0070 \textcolor{keyword}{end}
0071 
0072 
0073 \textcolor{keyword}{function} index = roulette(fitnessvektor, maxvektor)
0074     
0075     \textcolor{keyword}{for} candid=1:elternzahl
0076         a = rand;
0077         \textcolor{comment}{% b = rand;}
0078     
0079         \textcolor{keyword}{for} ruleset=length(fitnessvektor):-1:2
0080             \textcolor{keyword}{if} ( (a >= maxvektor(ruleset-1)) \&\& (fitnessvektor(ruleset) > 0.0) )
0081                 index(candid) = ruleset
0082                 \textcolor{comment}{% maxfitness(ruleset-1) = 1.0; \% verhindert, dass für index2 der gleiche Wert gewählt wird}
0083                 
0084                 \textcolor{keyword}{break};
0085             \textcolor{keyword}{end}
0086         \textcolor{keyword}{end}
0087         \textcolor{keyword}{if} ( a < maxvektor(1) )
0088             index(candid) = 1
0089         \textcolor{keyword}{end}
0090         
0091         fitnessvektor(index(candid)) = 0.0; \textcolor{comment}{% Fitness des gewählten Individuums auf 0 setzen}
0092         fitnessvektor = fitnessvektor / sum(fitnessvektor); \textcolor{comment}{% neue Normierung}
0093                 
0094         cumul = 0;
0095         \textcolor{keyword}{for} regel=1:length(fitnessvektor)
0096             cumul = cumul + fitnessvektor(regel);
0097             maxvektor(regel) = cumul;
0098         end \textcolor{comment}{% neuen Vektor mit Maximalwerten für Roulette-Selection erzeugen}
0099     \textcolor{keyword}{end}
0100 \textcolor{keyword}{end}
0101 
0102     \textcolor{keyword}{function} kinder = onepointxover(eltern)
0103       \textcolor{keyword}{for} xoverindex=1:uint8(elternzahl/2)
0104         string1 = wespe(eltern(xoverindex),1).classifierfitnessstring;
0105         string2 = wespe(eltern(xoverindex+1),1).classifierfitnessstring;
0106            \textcolor{comment}{% kopiert die Fitness-Strings der ausgewählten Eltern in Graycode}
0107            \textcolor{comment}{% in zwei lokale String-Variablen}
0108            \textcolor{comment}{% Es wird der Gesamtstring (Stärke aller Regeln}
0109            \textcolor{comment}{% hintereinander) verwendet}
0110         xoverpoint = uint16(rand * length(string1));
0111            \textcolor{comment}{% wählt einen zufälligen Crossoverpunkt}
0112            
0113         \textcolor{keyword}{if} (rand <= probcrossover) \textcolor{comment}{% nur dann Crossover, wenn Zufallszahl }
0114                                    \textcolor{comment}{% kleiner als}
0115                                    \textcolor{comment}{% Crossover-Wahrscheinlichkeit ist}
0116             neustring1 = [string1(1:xoverpoint) string2(xoverpoint+1:length(string2))];
0117             neustring2 = [string2(1:xoverpoint) string1(xoverpoint+1:length(string1))];
0118         \textcolor{keyword}{else} \textcolor{comment}{% sonst werden die Elternstrings einfach kopiert}
0119             neustring1 = string1;
0120             neustring2 = string2;
0121         \textcolor{keyword}{end}
0122         
0123         kinder(xoverindex,:) = neustring1; 
0124         kinder(xoverindex+1,:) = neustring2;
0125       \textcolor{keyword}{end}
0126     \textcolor{keyword}{end}
0127     
0128     \textcolor{keyword}{function} newbitstring = mutation(bitstring)
0129       \textcolor{keyword}{for} mutindex=1:uint8(elternzahl/2)  
0130         bitstring1 = bitstring(mutindex,:);
0131         bitstring2 = bitstring(mutindex+1,:);
0132         
0133         \textcolor{keyword}{if} (rand < probmutation) \textcolor{comment}{% wenn Zufallszahl unter Mutationswahrscheinlichkeit}
0134             mutbit = uint16(rand * length(bitstring1));
0135             \textcolor{keyword}{if} strcmp(bitstring1(mutbit),\textcolor{string}{'0'})
0136                 bitstring1(mutbit) = \textcolor{string}{'1'};
0137             \textcolor{keyword}{end}
0138             \textcolor{keyword}{if} strcmp(bitstring1(mutbit),\textcolor{string}{'1'})
0139                 bitstring1(mutbit) = \textcolor{string}{'0'};
0140             \textcolor{keyword}{end}
0141         end \textcolor{comment}{% für bitstring1}
0142         
0143         \textcolor{keyword}{if} (rand <= probmutation) \textcolor{comment}{% wenn Zufallszahl unter Mutationswahrscheinlichkeit}
0144             mutbit = uint16(rand * length(bitstring2));
0145             \textcolor{keyword}{if} strcmp(bitstring2(mutbit),\textcolor{string}{'0'})
0146                 bitstring2(mutbit) = \textcolor{string}{'1'};
0147             \textcolor{keyword}{end}
0148             \textcolor{keyword}{if} strcmp(bitstring2(mutbit),\textcolor{string}{'1'})
0149                 bitstring2(mutbit) = \textcolor{string}{'0'};
0150             \textcolor{keyword}{end}
0151         end \textcolor{comment}{% für bitstring2}
0152         
0153         newbitstring(mutindex,:) = bitstring1;
0154         newbitstring(mutindex+1,:) = bitstring2;
0155       \textcolor{keyword}{end}
0156     \textcolor{keyword}{end}
0157         
0158 \textcolor{keyword}{end}
\end{alltt}
\end{document}