[2] | 1 | %
|
---|
| 2 | % $Id: report.tex 614 2008-05-14 11:58:06Z tsteenbe $
|
---|
| 3 | %
|
---|
| 4 |
|
---|
| 5 | \documentclass[12pt,a4paper]{article}
|
---|
| 6 |
|
---|
| 7 | \frenchspacing
|
---|
| 8 | \usepackage[english,dutch]{babel}
|
---|
| 9 | \selectlanguage{dutch}
|
---|
| 10 | \usepackage{graphicx}
|
---|
| 11 | \usepackage{url}
|
---|
| 12 | \usepackage{multicol}
|
---|
| 13 | \usepackage{fancybox}
|
---|
| 14 | \usepackage{amssymb,amsmath}
|
---|
| 15 | \parindent0ex
|
---|
| 16 |
|
---|
| 17 | \author{Rick van der Zwet & Thomas Steenbergen, Universiteit Leiden}
|
---|
| 18 | \title{Kunstmatige Intelligentie 2008 --- opdracht 4 \\
|
---|
| 19 | \large{Genetische algoritmen}}
|
---|
| 20 | \author{Rick van der Zwet~~~~~Thomas Steenbergen \\
|
---|
| 21 | \texttt{hvdzwet@liacs.nl}~~~~\texttt{tsteenbe@liacs.nl}\\
|
---|
| 22 | \\
|
---|
| 23 | LIACS\\
|
---|
| 24 | Leiden University\\
|
---|
| 25 | Niels Bohrweg 1\\
|
---|
| 26 | 2333 CA Leiden\\
|
---|
| 27 | The Netherlands}
|
---|
| 28 | \date{\today}
|
---|
| 29 |
|
---|
| 30 | \begin{document}
|
---|
| 31 |
|
---|
| 32 | \maketitle
|
---|
| 33 |
|
---|
| 34 | \section{Inleiding}
|
---|
| 35 | Dit verslag gaat over de vierde opdracht~\cite{assignment} voor het
|
---|
| 36 | vak Kunstmatige Intelligentie~\cite{course}, welke over genetische
|
---|
| 37 | algoritmen gaat als besproken in het collegeboek~\cite{aibook}.
|
---|
| 38 | Een \emph{Genische Algoritme} is een zoek techniek dat gebruikt maakt
|
---|
| 39 | van Darwin's evolutietheorie~\cite{darwin} om complexe problemen op te
|
---|
| 40 | lossen. Darwin's theorie stelt dat ontwikkeling van elke soort levend
|
---|
| 41 | organisme op aarde word bepaald door natuurlijke selectie. Diegenen die
|
---|
| 42 | zich het best aanpassen aan hun omgeving en daardoor overleven zullen
|
---|
| 43 | een groter aandeel krijgen in genetische variatie van een populatie,
|
---|
| 44 | simpel gezegd voor elke organisme geldt 'surival of the fittest'. In
|
---|
| 45 | het genetische algoritme van deze opdracht wordt dit mechnisme gebruikt
|
---|
| 46 | om vanuit een populatie van mogelijke probleem oplossingen uiteindelijk
|
---|
| 47 | te evolueren naar een correct antwoord.
|
---|
| 48 |
|
---|
| 49 | \section{Probleem}
|
---|
| 50 | Gegeven een graaf, schrijf een genetisch algoritme dat in een
|
---|
| 51 | coordinatenstelsel \emph{X, Y} de knopen van deze graaf zo plaats dat er
|
---|
| 52 | zo min mogelijke kruisende takken zijn en zodat de schaal tussen de
|
---|
| 53 | knopen zo goed mogelijk behouden blijft.
|
---|
| 54 |
|
---|
| 55 | \begin{table}
|
---|
| 56 | \begin{center}
|
---|
| 57 | \begin{tabular}{c c c c}
|
---|
| 58 | 4 & & & \\
|
---|
| 59 | 0 & 8 & 0 & 3 \\
|
---|
| 60 | 8 & 0 & 2 & 5 \\
|
---|
| 61 | 0 & 2 & 0 & 0 \\
|
---|
| 62 | 3 & 5 & 0 & 0 \\
|
---|
| 63 | \end{tabular}
|
---|
| 64 | \end{center}
|
---|
| 65 | \caption{Voorbeeld van input graaf in adjacency-matrix representatie
|
---|
| 66 | \label{tab:example-graph}}
|
---|
| 67 | \end{table}
|
---|
| 68 |
|
---|
| 69 | \noindent
|
---|
| 70 | Bovenstaand Tabel~\ref{tab:example-graph} bevat een eenvoudige representie van
|
---|
| 71 | een graaf. De eerste regel heeft het aantal knopen dat de graaf heeft,
|
---|
| 72 | in dit geval $4$.
|
---|
| 73 | De adjacency-matrix er onder geeft aan of er een tak tussen de knoop $i$
|
---|
| 74 | en $j$ zit en wat hiervan de lengte is. $0$ betekend geen tak. In de
|
---|
| 75 | $i$-de rij / $j$-de kolom staat dat er dan een tak tussen knopen $i$ en
|
---|
| 76 | $j$ is met een afstand gelijk aan het getal.
|
---|
| 77 | Tevens is er gegeven dat de graaf geen lussen bevat en dat alle
|
---|
| 78 | afstanden tussen de knopen positieve gehele getallen zijn.
|
---|
| 79 |
|
---|
| 80 | \section{Theorie}
|
---|
| 81 | %XXX: Wiskundige uitleg genetische algoritmen
|
---|
| 82 | % -> zoveel wiskunde komt er ook weer niet bij kijken
|
---|
| 83 | Een genetisch algoritme is gebaseerd op de evolutie theorie en gebruikt
|
---|
| 84 | natuurlijke selectie om optimalisatie- en zoekproblemen op te lossen.
|
---|
| 85 | Een genetisch algoritme doorloopt de volgende stappen generatie op generatie
|
---|
| 86 | om tot een oplossing te komen of totdat het een stopconditie heeft bereikt:
|
---|
| 87 |
|
---|
| 88 | \subsection{Initialisatie}
|
---|
| 89 | De eerste stap in elk genetisch algoritme is om een ouder generatie te
|
---|
| 90 | cre\"{e}eren, welke uit een voorafgesproken grootte bestaat.
|
---|
| 91 | Deze generatie bestaat in de meeste implementaties uit sets van
|
---|
| 92 | willekeurige getallen waarbij elke set een mogelijke oplossing voor het
|
---|
| 93 | probleem bevat.
|
---|
| 94 |
|
---|
| 95 | \subsection{Selectie}
|
---|
| 96 | Voor elk item uit de ouder generatie wordt met behulp van een
|
---|
| 97 | \emph{fitnessfunctie} bepaald hoeveel deze ouder afwijkt van de eisen
|
---|
| 98 | die we aan de probleemoplossing hebben gesteld. Deze fitnessfunctie is
|
---|
| 99 | te zien als maatstaf van de kwaliteit. Vervolgens worden de twee beste
|
---|
| 100 | ouders geselecteerd en deze gaan na kruising of mutatie door naar
|
---|
| 101 | de volgende generatie.
|
---|
| 102 |
|
---|
| 103 | \subsection{Kruising}
|
---|
| 104 | De twee ouders worden in deze kruising of ook wel \emph{crossover} stap
|
---|
| 105 | gerecombineerd zodat er twee unieke kinderen uit ontstaan. Hiervoor zijn
|
---|
| 106 | verschillende crossover methodes beschikbaar, onder andere
|
---|
| 107 | \emph{single-point} of \emph{two-point} of \emph{uniform} kruising
|
---|
| 108 | gebruiken. Bij \emph{single-point} of \emph{two-point} wordt elke ouder
|
---|
| 109 | op respectievelijk \'{e}\'{e}n of twee plaatsen opgesplist en daarna
|
---|
| 110 | worden de delen zo hergecombioneerd dat er twee nieuwe kinderen ontstaan
|
---|
| 111 | met dezelfde lengte als de ouders. Bij \emph{uniform} crossover wordt
|
---|
| 112 | er per element in \'{e}\'{e}n van de twee ouders met een bepaalde kans
|
---|
| 113 | bekeken of dit element met het corresponderende element in de andere
|
---|
| 114 | ouder verwisseld dient te worden. Kruising zorgt voor meer spreiding in
|
---|
| 115 | de ouder generatie, positieve eigenschappen van verschillende ouders
|
---|
| 116 | komen bij elkaar.
|
---|
| 117 |
|
---|
| 118 | \subsection{Mutatie}
|
---|
| 119 | De kinderen die ontstaan zijn uit de kruising worden gemuteerd om de diversiteit
|
---|
| 120 | van de kinderen te bevorderen. De waarde van elk element in een ouder wordt met
|
---|
| 121 | een bepaald kans veranderd naar een willekeurige waarde. Om bepaalde
|
---|
| 122 | positieve eigenschappen die misschien nog niet in de ouder generatie
|
---|
| 123 | zaten toe te voegen aan de generatie wordt mutatie toegepast.
|
---|
| 124 |
|
---|
| 125 | \subsection{Stopconditie}
|
---|
| 126 | In tegenstelling tot evoluatie in de natuur die oneindig voortduurt dienen bij
|
---|
| 127 | genetische algoritmen het eveolutie process op een gegeven moment te stoppen om
|
---|
| 128 | conclusies te kunnen trekken.
|
---|
| 129 | Het is een goed moment om te stoppen als de fitness waarde gedurende een lange
|
---|
| 130 | periode gelijk blijft of langzaam naar een bepaalde waarde toe convergeerd.
|
---|
| 131 | Het simpelweg stoppen van de berekening na een vooraf vastgesteld aantal
|
---|
| 132 | generaties is een andere stopconditie die veel wordt gebruikt vanwege
|
---|
| 133 | praktische redenen, bijvoorbeeld als men een beperkte rekentijd heeft op een
|
---|
| 134 | supercomputer.
|
---|
| 135 |
|
---|
| 136 |
|
---|
| 137 | \section{Aanpak}
|
---|
| 138 | %XXX: Welke keuzes zijn genomen en met welke reden, wat is de
|
---|
| 139 | %achterliggende gedachte
|
---|
| 140 | Er is gekozen gebruik te maken van het voorbeeld implementatie raamwerk gegeven
|
---|
| 141 | in de sheet\cite{aisheet} tijdens het college kunstmatige
|
---|
| 142 | intelligentie welke een pseudo beschrijving geeft voor het programmeren
|
---|
| 143 | van een genetisch algoritme.
|
---|
| 144 | \pagebreak
|
---|
| 145 | \begin{verbatim}
|
---|
| 146 | Initialiseer populatie
|
---|
| 147 | Evalueer populatie
|
---|
| 148 | while not klaar do
|
---|
| 149 | Selecteer ouders
|
---|
| 150 | Genereer met crossover kinderen (recombineer)
|
---|
| 151 | Muteer kinderen
|
---|
| 152 | Evalueer kinderen
|
---|
| 153 | Bepaal nieuwe populatie
|
---|
| 154 | return beste element uit populatie
|
---|
| 155 | \end{verbatim}
|
---|
| 156 | \noindent
|
---|
| 157 | Er is gekozen om te beginnen met populatie van een vooraf gedefineerde
|
---|
| 158 | grootte, deze wordt tijdens de initialisatie gevuld met grafen met
|
---|
| 159 | random gekozen punten.
|
---|
| 160 |
|
---|
| 161 | De evaluatie van de populatie wordt gedaan met behulp van een fitness
|
---|
| 162 | functie, welke de fitheid van elke graaf berekend aan de hand van twee criteria;
|
---|
| 163 | het aantal kriuisende takken en de lengte van de takken ten opzichte van
|
---|
| 164 | de invoer adjacency-matrix.
|
---|
| 165 | Om het aantal kruisende takken te bepalen dienen we de snijpunten tussen elke
|
---|
| 166 | bestaande tak in de adjency-matrix en alle andere takken uit te
|
---|
| 167 | rekenen, dit wordt gedaan door de lijn vergelijkingen op te lossen en
|
---|
| 168 | daarna te controleren of de gevonden oplossing in het vlak ligt welke
|
---|
| 169 | bekeken wordt. Als voorbeeld implementatie is het topcoder
|
---|
| 170 | artikel~\cite{line-intersect} gebruikt, welke in de opdracht als
|
---|
| 171 | referentie wordt gemeld.
|
---|
| 172 |
|
---|
| 173 | Voor het selecteren van de ouders is \emph{roulettewheel} selectie een
|
---|
| 174 | zeer geschikte methode, welke als eigenschap heeft dat een element dat
|
---|
| 175 | goed is meer kans heeft op gekozen te worden, omdat het een groter deel
|
---|
| 176 | van het `wiel' zal beslaan.
|
---|
| 177 |
|
---|
| 178 | Voor de creatie van de nieuwe populatie wordt \emph{steady state}
|
---|
| 179 | gebruikt, dit houdt in dat steeds de beste van de ouders en de kinderen
|
---|
| 180 | doorgaan naar de volgende ronde.
|
---|
| 181 |
|
---|
| 182 |
|
---|
| 183 |
|
---|
| 184 | \section{Implementatie}
|
---|
| 185 | %XXX: Versie nummers en eventuele hulptalen
|
---|
| 186 | Het genetisch algoritme is geschreven in C$\stackrel{++}{}$, gebruik
|
---|
| 187 | makend van struct op een instantie van een graaf te representeren en
|
---|
| 188 | dynamische arrays.
|
---|
| 189 |
|
---|
| 190 | Om de executie-snelheid van het genetisch algoritme te verhogen is het
|
---|
| 191 | domein waarin de random punten gekozen kunnen worden te verminderen tot
|
---|
| 192 | \emph{aantal knopen} x \emph{grootst gevonden lengte van een tak} mits
|
---|
| 193 | dit een domein oplevert kleiner dan 1000 x 1000.
|
---|
| 194 |
|
---|
| 195 | \section{Experimenten}
|
---|
| 196 | Tijdens de experimenten wordt er een random nummer generatie gebruikt,
|
---|
| 197 | welke het onmogelijk maakt waardes van experimenten te vergelijken. Door
|
---|
| 198 | een random initalisatie seed van $0$ te gebruiken kan in elke run
|
---|
| 199 | dezelfde random nummers gebruikt worden om in elke run dezelfde random
|
---|
| 200 | waardes te laten spelen. Er zijn 3 typen variaties in de parameters van
|
---|
| 201 | het genetisch algoritmes gemodificeerd om te onderzoeken wat deze voor
|
---|
| 202 | invloed hebben op de kwaliteit van de grafiek. Verder is er gebruik
|
---|
| 203 | gemaakt van een special typen grafiek. De cirkel grafiek, welke slechts
|
---|
| 204 | een domein heeft van 30 x 30 en 10 nodes grafiek met een domein van
|
---|
| 205 | 200 x 200.
|
---|
| 206 | Als eerste de de loop duur gevarieerd en de tijd gemeten hoe lang het
|
---|
| 207 | programma uitvoerd, welke de resultaten in tabel~\ref{tab:loops}
|
---|
| 208 | oplevert.
|
---|
| 209 |
|
---|
| 210 | \begin{table}
|
---|
| 211 | \begin{tabular}{c|c|c|c}
|
---|
| 212 | Loops $10^x$ & fitness cirkel & fitness 10 nodes \\
|
---|
| 213 | \hline
|
---|
| 214 | 4 & 17 & 260 \\
|
---|
| 215 | 5 & 2 & 260 \\
|
---|
| 216 | 6 & 2 & 146 \\
|
---|
| 217 | 7 & 2 & 118 \\
|
---|
| 218 | \end{tabular}
|
---|
| 219 | \caption{Experimenten met verschillende loop groottes \label{tab:loops}}
|
---|
| 220 | \end{table}
|
---|
| 221 |
|
---|
| 222 | Om experimenten snel te laten verlopen is gekozen om de rest van de
|
---|
| 223 | experimenten met groottes $10^6$ uit te voeren. Er wordt gebruik gemaakt
|
---|
| 224 | van 2 fitness functies in het GA algoritme. De eerste is op basis van
|
---|
| 225 | afstandverschillen tussen de nodes, de tweede rekend het aantal
|
---|
| 226 | snijpunten uit. Om te kijken welke resultaten het oplevert als we de
|
---|
| 227 | fitness getallen in verschillende houdingen bij elkaar optellen, is de
|
---|
| 228 | code telkens aangepast en opnieuw gecompileerd. De resultaten hiervan
|
---|
| 229 | staan in tabel~\ref{tab:verhoudingen}.
|
---|
| 230 | \begin{table}
|
---|
| 231 | \begin{tabular}{c|c|c|c}
|
---|
| 232 | gewicht snijpunt & gewicht afstand & fitness cirkel & fitness 10 nodes \\
|
---|
| 233 | \hline
|
---|
| 234 | 1 & 1 & 2/0/2 & 18/128/146 \\
|
---|
| 235 | 1 & 0 & 26/0/0 & 213/50/50 \\
|
---|
| 236 | 1 & 2 & 0/15/15 & 64/117/245 \\
|
---|
| 237 | 1 & 10 & 0/26/26 & 17/193/363 \\
|
---|
| 238 | 2 & 1 & 0/0/0 & 66/77/214 \\
|
---|
| 239 | 10 & 1 & 0/0/0 & 159/54/699 \\
|
---|
| 240 | \end{tabular}
|
---|
| 241 | \caption{Experimenten met verschillende fitness berekeningen fitness
|
---|
| 242 | weergegeven als fitness intersection/distance/overall
|
---|
| 243 | \label{tab:verhoudingen}}
|
---|
| 244 | \end{table}
|
---|
| 245 |
|
---|
| 246 | \begin{table}
|
---|
| 247 | \begin{tabular}{c|c|c}
|
---|
| 248 | $MUT\_LEVEL$ & fitness cirkel & fitness 10 nodes \\
|
---|
| 249 | \hline
|
---|
| 250 | 1 & 14/16/30 & 213/97/310 \\
|
---|
| 251 | 10 & 0/4/4 & 79/114/193 \\
|
---|
| 252 | 25 & 5/7/12 & 59/108/167 \\
|
---|
| 253 | 50 & 0/2/2 & 18/128/146 \\
|
---|
| 254 | 75 & 13/9/22 & 25/131/156 \\
|
---|
| 255 | 90 & 10/8/18 & 29/112/141 \\
|
---|
| 256 | 99 & 0/0/0 & 23/116/139 \\
|
---|
| 257 | \end{tabular}
|
---|
| 258 | \caption{Experimenten met verschillende mutatie niveaus weergegeven als
|
---|
| 259 | fitness intersection/distance/overall \label{tab:mutaties}}
|
---|
| 260 | \end{table}
|
---|
| 261 |
|
---|
| 262 | Het derde experiment veranderd de mutatie snelheid van het algoritme,
|
---|
| 263 | dit is gedaan door de $MUT\_LEVEL$ aan te passen. \\De resultaten hiervan
|
---|
| 264 | zijn te vinden in tabel~\ref{tab:mutaties}.
|
---|
| 265 |
|
---|
| 266 | Voor de visualisatie zijn de programma's graphviz~\cite{graphviz} en
|
---|
| 267 | imagemagick~\cite{imagemagick} gebruikt. Graphviz heeft door middel
|
---|
| 268 | van het subprogramma $neato$ een ingebouwd algoritme om het beste plaatje
|
---|
| 269 | te plotten en kan tevens `dom' gemaakt worden met de vlag $-n2$ zodat onze
|
---|
| 270 | uitvoer geplot kan worden. \\
|
---|
| 271 | Imagemagick zorgt voor het samenvoegen van de
|
---|
| 272 | plaatjes en toevoegen van de labels. In figuur~\ref{fig:beste-cirkel} is de
|
---|
| 273 | beste uitvoer van $input-circular.txt$ geplot.
|
---|
| 274 | Figuur~\ref{fig:beste-10nodes} heeft de beste uitvoer van $input10.txt$.
|
---|
| 275 |
|
---|
| 276 | \begin{center}
|
---|
| 277 | \begin{figure}
|
---|
| 278 | \includegraphics[width=\textwidth]{beste-cirkel.ps}
|
---|
| 279 | \caption{Beste uitvoer $input-circular.txt$, $fitness=0$}
|
---|
| 280 | \label{fig:beste-cirkel}
|
---|
| 281 | \end{figure}
|
---|
| 282 | \end{center}
|
---|
| 283 |
|
---|
| 284 | \begin{center}
|
---|
| 285 | \begin{figure}
|
---|
| 286 | \includegraphics[width=\textwidth]{beste-10nodes.ps}
|
---|
| 287 | \caption{Beste uitvoer $input10.txt$, $fitness=139$}
|
---|
| 288 | \label{fig:beste-10nodes}
|
---|
| 289 | \end{figure}
|
---|
| 290 | \end{center}
|
---|
| 291 |
|
---|
| 292 |
|
---|
| 293 | \section{Conclusies}
|
---|
| 294 | De implementatie van het GA algoritme lijkt niet perfect te werken en te
|
---|
| 295 | selectief te werk te gaan, vanwege de optimatisatie is het mogelijk met
|
---|
| 296 | een hoger $MUT\_LEVEL$ nummer bijna alle oplossingen af te gaan waardoor
|
---|
| 297 | de optimale oplossing eruit komt vallen. Het zoeken naar betere
|
---|
| 298 | combinatie functies zou een oplossing kunnen bieden.
|
---|
| 299 |
|
---|
| 300 | Verder valt op dat de generereerde plaatjes met een bepaalde belangrijke
|
---|
| 301 | eigenschap geen rekening is gehouden, namelijk om de afstand tussen elke
|
---|
| 302 | node zo groot mogelijk te maken. Hierdoor vallen nodes over elkaar geen
|
---|
| 303 | en is de grafische implementatie zeer slecht, terwijl de oplossing toch
|
---|
| 304 | als optimaal aangeboden worden.
|
---|
| 305 |
|
---|
| 306 | De random seed is in alle gevallen hetzelfde gezet (namelijk $0$),
|
---|
| 307 | onderzocht kan worden of het wijzigen van de seed nog invloed heeft op
|
---|
| 308 | de resultaten.
|
---|
| 309 |
|
---|
| 310 |
|
---|
| 311 | \begin{thebibliography}{XX}
|
---|
| 312 |
|
---|
| 313 | \bibitem{assignment}
|
---|
| 314 | W.A.~Kosters, Kunstmatige intelligentie Programmeer-opgave 4 van 2008
|
---|
| 315 | -- Genetische Algorithmen, \url{http://www.liacs.nl/home/kosters/AI/ga08.html}
|
---|
| 316 |
|
---|
| 317 | \bibitem{course}
|
---|
| 318 | W.A.~Kosters, Kunstmatige intelligentie, \url{http://www.liacs.nl/home/kosters/AI.html}
|
---|
| 319 |
|
---|
| 320 | \bibitem{darwin}
|
---|
| 321 | Darwin, Charles, On the Origin of Species by Means of Natural Selection,
|
---|
| 322 | or the Preservation of Favoured Races in the Struggle for Life, John
|
---|
| 323 | Murray, London, 1859,
|
---|
| 324 | \url{http://www.literature.org/authors/darwin-charles/the-origin-of-species/index.html}
|
---|
| 325 |
|
---|
| 326 | \bibitem{aibook}
|
---|
| 327 | S.J. Russell en P. Norvig, Artificial Intelligence, A Modern Approach,
|
---|
| 328 | Second ediion, Prentice Hall, 2003.
|
---|
| 329 |
|
---|
| 330 | \bibitem{aisheet}
|
---|
| 331 | W.A.~Kosters, Kunstmatige intelligentie College neurale netwerken 2008,
|
---|
| 332 | \url{http://www.liacs.nl/~kosters/AI/genetisch.pdf}
|
---|
| 333 |
|
---|
| 334 | \bibitem{line-intersect}
|
---|
| 335 | lbackstrom, Geometry Concepts: Line Intersection and its Applications,
|
---|
| 336 | \url{http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=geometry2}
|
---|
| 337 |
|
---|
| 338 | \bibitem{graphviz}
|
---|
| 339 | Graphviz, homepage, \url{http://graphviz.org}
|
---|
| 340 |
|
---|
| 341 | \bibitem{imagemagick}
|
---|
| 342 | Imagemagick, homepage, \url{http://imagemagick.org}
|
---|
| 343 |
|
---|
| 344 | \end{thebibliography}
|
---|
| 345 |
|
---|
| 346 | \newpage
|
---|
| 347 | \advance\textwidth by 8cm
|
---|
| 348 | \advance\oddsidemargin by -3cm
|
---|
| 349 | \advance\evensidemargin by -3cm
|
---|
| 350 | \advance\topmargin by -2cm
|
---|
| 351 | \advance\textheight by 4cm
|
---|
| 352 | \advance\footskip by -4cm
|
---|
| 353 | \marginparwidth 0cm
|
---|
| 354 | \twocolumn
|
---|
| 355 | \section*{Appendix}
|
---|
| 356 | De GA code en de test arrays zagen er als volgt uit:
|
---|
| 357 | \newline
|
---|
| 358 | \tiny
|
---|
| 359 | %preformatted with `source-highlight -n -f latex bridge.cc`
|
---|
| 360 | \input{ga.cpp}
|
---|
| 361 | \input{input-circular.txt}
|
---|
| 362 | \input{input10.txt}
|
---|
| 363 | \onecolumn
|
---|
| 364 | \end{document}
|
---|