1 | %
|
---|
2 | % $Id: report.tex 523 2008-03-18 11:09:00Z rick $
|
---|
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 |
|
---|
15 | \author{Rick van der Zwet, Universiteit Leiden}
|
---|
16 | \title{Kunstmatige Intelligentie 2008 --- opdracht 2 \\
|
---|
17 | \large{RoboCom}}
|
---|
18 | \author{Rick van der Zwet\\
|
---|
19 | \texttt{<hvdzwet@liacs.nl>}\\
|
---|
20 | \\
|
---|
21 | LIACS\\
|
---|
22 | Leiden University\\
|
---|
23 | Niels Bohrweg 1\\
|
---|
24 | 2333 CA Leiden\\
|
---|
25 | The Netherlands}
|
---|
26 | \date{\today}
|
---|
27 |
|
---|
28 | \begin{document}
|
---|
29 |
|
---|
30 | \maketitle
|
---|
31 |
|
---|
32 | \section{Inleiding}
|
---|
33 |
|
---|
34 | Dit verslag gaat over de tweede programmeer-opgave van het vak
|
---|
35 | kunstmatige intelligentie\cite{opdracht}. Welke als opdracht heeft om
|
---|
36 | softbots te bouwen, die tijdens een simulatie met elkaar samenwerken om
|
---|
37 | een vlag te construeren of tegen andere softbots ten strijden trekken,
|
---|
38 | met als doel als enigste over te blijven. Dit allen als doel om de
|
---|
39 | \emph{PEAS} beschrijving uit het college boek~\cite{collegeboek} beter te
|
---|
40 | kunnen begrijpen.
|
---|
41 | \section{Uitleg probleem}
|
---|
42 |
|
---|
43 | \emph{RoboCom} is computerprogramma welke een simulatie omgeving bied
|
---|
44 | waarmee met assembly achtige programma code een programma wordt gemaakt
|
---|
45 | welke een software robot kan aansturen een zogenaamde \emph{softbot}.
|
---|
46 | Deze softbots kunnen simpele commando's zoals vermenigvuldigen, omgeving
|
---|
47 | afzoeken, code kopiëren en andere acties
|
---|
48 | \footnote{http://www.cyty.com/robocom/help/instr1.html}. Al deze acties
|
---|
49 | kosten \emph{tikken}, waarbij er verschillende gradaties gemaakt worden
|
---|
50 | aan de voorwaarden te scheppen aan de aan de omgeving waar de softbots in
|
---|
51 | gaan `leven'. Buiten de verschillende gradaties in tikken kan er ook nog
|
---|
52 | onderscheidt gemaakt worden via limitatie in de instructieset. Tijdens
|
---|
53 | deze opdracht is deze gelimiteerd tot \emph{Classic}
|
---|
54 | \footnote{http://www.cyty.com/robocom/help/instrall.html} welke de set
|
---|
55 | is waarmee het spel origineel mee ontworpen is.
|
---|
56 |
|
---|
57 | Het speelbord is vierkant in representatie, maar is werkelijkheid een
|
---|
58 | bol. De onderste rij grenst aan de bovenste rij en hetzelfde geldt voor
|
---|
59 | de meest linker en meest rechtse column. Het bord heeft in totaal 256
|
---|
60 | vakjes welke allen een softbot kunnen bevallen of leeg zijn. Een softbot op
|
---|
61 | zijn beurt bestaat uit maximaal 50 \emph{banken} welke op hun beurt weer
|
---|
62 | 1000 regels code kunnen bevatten.
|
---|
63 |
|
---|
64 | Een softbot kan actief zijn of niet. In de actieve stand is hij bezig met
|
---|
65 | het uitvoeren van code. Waarbij begonnen wordt bij regel 1 in bank 1 en
|
---|
66 | zo verder. Als hij bij het einde van een bank komt dan springt hij terug
|
---|
67 | naar het begin (bank 1,regel 1). Als hij geen code kan vinden in bank 1
|
---|
68 | dan gaat hij dood, wat ook wel \emph{data-hunger} genoemd wordt. Tijdens
|
---|
69 | de niet actieve stand zal hij de lopende instructie stoppen en wachten
|
---|
70 | tot hij weer geactiveerd wordt. Dit kan hij zelf niet doen.
|
---|
71 |
|
---|
72 |
|
---|
73 | \begin{figure}[!ht]
|
---|
74 | \begin{center}
|
---|
75 | \includegraphics[scale=0.25]{speelbord}
|
---|
76 | \end{center}
|
---|
77 | \caption{
|
---|
78 | Impressie van de grafische representatie van het speelbord, elk team
|
---|
79 | krijgt een eigen kleur. Een kruis door de softbot als deze niet actief is
|
---|
80 | (niet weergegeven). Een driehoekje geeft de richting aan in welke hij
|
---|
81 | 'kijkt'. De kleur van het driehoekje geeft aan van wie de instructie
|
---|
82 | bank welke hij op het moment aan het uitvoeren is.
|
---|
83 | }
|
---|
84 | \end{figure}
|
---|
85 |
|
---|
86 | Hieronder volgt een paar regels voorbeeld programma assembly code:
|
---|
87 | \begin{verbatim}
|
---|
88 | Bank Main ; Daddy Tutorminator's program
|
---|
89 | @Loop
|
---|
90 | Turn 0 ; turn around, that's cool
|
---|
91 | Create 1, 2, 1 ; build a mobile child with 2 banks
|
---|
92 | Trans 2, 1 ; transfer RunAround into the first bank
|
---|
93 | ; the second bank is left empty
|
---|
94 | Set %active, 1 ; activate our baby
|
---|
95 | Jump @Loop ; ...and start over
|
---|
96 | \end{verbatim}
|
---|
97 |
|
---|
98 |
|
---|
99 | \section{Theorie}
|
---|
100 |
|
---|
101 | Over de softbots kan een PEAS beschrijving gegeven worden.
|
---|
102 | \textbf{P}restatie maat is het winnen van een simulatie. Als extra
|
---|
103 | punt zo daar eventueel aan toegevoegd kunnen worden dat dit in een zo
|
---|
104 | kort mogelijke tijd gedaan moet worden. \textbf{E}nvironment is het
|
---|
105 | speelbord en de andere softbots in het spel. \textbf{A}ctuatoren van de
|
---|
106 | softbot zijn de verschillende vragen die de softbot aan de omgeving
|
---|
107 | kan stellen. Dit zijn alle verschillende types van scannen.
|
---|
108 | \textbf{S}ensoren zijn de acties die de softbot op de omgeving kan doen.
|
---|
109 | Hieronder vallen acties als kopiëren, creëren, activeren.
|
---|
110 |
|
---|
111 | De reeds beschikbare documentatie~\cite{website-help} beschrijft
|
---|
112 | uitvoering enkele theorieën die gebruikt kunnen worden de softbots te
|
---|
113 | schrijven. In het kort komt het neer op de verschillende punten waar
|
---|
114 | rekening gehouden mee moet worden. Probeer het programma zo simpel
|
---|
115 | mogelijk te houden, een heleboel regels en/of banken kosten veel tijd om
|
---|
116 | te dupliceren en/of uit te voeren waardoor je softbot kwetsbaarder is
|
---|
117 | tegen simpele programma's. Gebruik simpele programma's in het begin,
|
---|
118 | deze worden ook wel virussen genoemd, om de vijand zo veel mogelijk te
|
---|
119 | 'pesten' in de ontwikkeling van zijn softbots. Maak gebruik van meerdere
|
---|
120 | type softbots en beperk je niet tot een tactiek. Ga bijvoorbeeld eerst met
|
---|
121 | een simpel virus aan de slag en gebruik daarna ingewikkelde en sterkere
|
---|
122 | softbots om het karwei af te maken.
|
---|
123 |
|
---|
124 | Als laatste in dit korte rijtje, zorg dat de softbots geen hinder
|
---|
125 | ondervinden van hun eigen tactieken en let op dat de vijand dezelfde
|
---|
126 | tactiek zal gebruiken, dus wapen je ertegen.
|
---|
127 |
|
---|
128 |
|
---|
129 | \section{Aanpak}
|
---|
130 | Bij het maken van de vlag is gebruik gemaakt van het coöperatie element
|
---|
131 | in het spel. Tijdens het maken van de twee vecht softbots is zowel het
|
---|
132 | competitie element gebruikt als het coöperatie element.
|
---|
133 |
|
---|
134 | \subsection{Vlag softbot}
|
---|
135 | Bij een vlag cruciaal is dat de softbots netjes naast elkaar komen te
|
---|
136 | lopen is dat de voornaamste uitdaging. Het uit programmeren hierna is
|
---|
137 | triviaal. Om te zorgen dat de verschillende softbots elkaar kunnen
|
---|
138 | ontmoeten wordt er gebruik maakt van het feit dat als je twee haak
|
---|
139 | op elkaar staande lijnen trekt deze altijd ergens in een enkele lijn
|
---|
140 | snijdt. Het algoritme in pseudo-code
|
---|
141 | \begin{verbatim}
|
---|
142 | while begin
|
---|
143 | scan vakje voor de softbot
|
---|
144 | switch begin
|
---|
145 | case leeg vakje
|
---|
146 | maak kloon aan
|
---|
147 | blijf naar kloon kijken tot deze signaal doodgaan gegeven
|
---|
148 | heeft ga dood
|
---|
149 | case bot andere kleur
|
---|
150 | geef signaal doodgaan aan 'staart'
|
---|
151 | ga rechtsom
|
---|
152 | continue
|
---|
153 | case bot eigen kleur
|
---|
154 | als links of recht van je een 'vijand' bot staat dan
|
---|
155 | klaar doe niets meer
|
---|
156 | anders
|
---|
157 | ga rechtsom
|
---|
158 | continue
|
---|
159 | end
|
---|
160 | end
|
---|
161 | \end{verbatim}
|
---|
162 |
|
---|
163 | \subsection{Defensieve softbot}
|
---|
164 | Bij het schrijven van de eerste vechtende softbot is gekozen voor een
|
---|
165 | defensieve tactiek, met een soort van drie meertrapsraket methode. Als eerste
|
---|
166 | komt er een zeer simpel schild om moederbot heen welke een verlammend
|
---|
167 | verspreidend virus infecteert aan alle softbots die in de buurt komen. Na
|
---|
168 | een zekere tijd wordt er een nog simpeler virus geïnjecteerd dat alle
|
---|
169 | softbots vermoord. Hierna worden ingewikkelder softbots gemaakt genaamd
|
---|
170 | slopers welke het bord opruimen. Voordeel hierbij is dat simpele
|
---|
171 | virussen geen vat op deze softbots hebben, want de moederbot is geschreven
|
---|
172 | om hier immuun voor te zijn. Nadeel is echter dat er geen tot weinig
|
---|
173 | ontwikkeling plaatsvind in de softbots, waardoor in de laatste fase van
|
---|
174 | het spel misschien te weinig softbots dood gaan om te zorgen dat rustig de
|
---|
175 | slopers gemaakt kunnen worden.
|
---|
176 |
|
---|
177 |
|
---|
178 | \subsection{Offensieve softbot}
|
---|
179 | De aanvallende softbot heeft een heel andere tactiek. Deze maakt gelijk
|
---|
180 | ingewikkende softbots. Deze ingewikkende softbots infecteren de vijand met
|
---|
181 | een simpel virus en laten dit even verspreiden. Nadien vernietigd hij
|
---|
182 | deze softbot en maakt hij een kloon van zichzelf aan. Deze tactiek zorgt
|
---|
183 | ervoor dat de softbots niet vatbaar zijn voor de simpele virussen, maar
|
---|
184 | heeft als nadeel dat de softbots veel meer tijd kosten om te bouwen en dan
|
---|
185 | kwetsbaarder kunnen zijn.
|
---|
186 |
|
---|
187 |
|
---|
188 |
|
---|
189 |
|
---|
190 | \section{Implementatie}
|
---|
191 |
|
---|
192 | Er is gekozen om geen gebruik te maken voorbeeld implementaties van
|
---|
193 | andere softbots in de eigen code. De voorbeelden in de handleidingen
|
---|
194 | zijn wel overgenomen. De softbot code is in de RoboCom taal geschreven.
|
---|
195 |
|
---|
196 | \section{Experimenten}
|
---|
197 | Alle testen zijn uitgevoerd met het programma RoboCom Workshop
|
---|
198 | v3.10\cite{website-programma} gedraaid op een Microsoft Windows XP
|
---|
199 | computer. Gebruikt instructie set is Classic.
|
---|
200 |
|
---|
201 | \subsection{Vlag}
|
---|
202 | Tijdens het testen van het succesvol vormen van de vlag is gebruik
|
---|
203 | gemaakt van 2 type simulaties. Als eerste is 20 keer de softbots op
|
---|
204 | willekeurige plekken neergezet en gekeken of er een vlag uitkomt. Als
|
---|
205 | tweede zijn de softbots 20 keer op elke keer dezelfde plek gezet en
|
---|
206 | gekeken of deze dezelfde vlag vormen.De resultaten zijn te vinden in
|
---|
207 | tabel~\ref{tab:vlag}
|
---|
208 |
|
---|
209 | \begin{center}
|
---|
210 | \begin{table}[h]
|
---|
211 | \caption{Resultaten plaatsingen van vlag, bij goed staat de vlag of
|
---|
212 | horizontaal, bij matig verticaal, bij fout is erna 80000 tikken nog geen
|
---|
213 | uitslag. De vaste plaatsing is op posities (X,Y,richting) $8,10,2$,
|
---|
214 | $14,14,0$, $3,9,1$ }
|
---|
215 | \begin{tabular}{l|r|r|r}
|
---|
216 | Type & Goed & Matig & Fout \\
|
---|
217 | \hline
|
---|
218 | Willekeurige plaatsing & 9 & 9 & 2 \\
|
---|
219 | Vaste plaatsing & 4 & 12 & 4 \\
|
---|
220 | \end{tabular}
|
---|
221 | \label{tab:vlag}
|
---|
222 | \end{table}
|
---|
223 | \end{center}
|
---|
224 |
|
---|
225 | \subsection{Vechters}
|
---|
226 | Door het programma RoboCom wordt een set softbots meegeleverd die gelabeld
|
---|
227 | zijn als `classic legends'. De twee softbots hebben in een tegen een
|
---|
228 | gevechten tegen al deze classic legends gespeeld. Elke een tegen een
|
---|
229 | gevecht is 20 keer uitgevoerd. De resultaten staan hieronder in de
|
---|
230 | tabel~\ref{tab:defensive} voor de defensieve softbot.
|
---|
231 | Tabel~\ref{tab:offensive} levert de resultaten voor de offensieve
|
---|
232 | softbot.
|
---|
233 |
|
---|
234 | \begin{center}
|
---|
235 | \begin{table}[h]
|
---|
236 | \caption{Resulaten defensieve softbot na 80000 tikken, bij score telt een
|
---|
237 | gelijkspel voor 1 punt en winst voor 3 punten en verlies niets. }
|
---|
238 | \begin{tabular}{l|r|r|r|r}
|
---|
239 | Tegenstander & Winst & Verlies & Gelijkspel & Score\\
|
---|
240 | \hline
|
---|
241 | (Cy)Borg 004c83a8n & 3 & 0 & 7 & 16\\
|
---|
242 | Advanced Speedix 2004 & 2 & 1 & 7 & 13\\
|
---|
243 | Africa & 2 & 0 & 8 & 14\\
|
---|
244 | Alien v5.13d & 1 & 0 & 9 & 12\\
|
---|
245 | Bright Star Three & 0 & 5 & 5 & 5\\
|
---|
246 | Comes the Wuss 2 & 10 & 0 & 0 & 30\\
|
---|
247 | CopyBot & 1 & 1 & 8 & 11\\
|
---|
248 | Delusion 5 & 10 & 0 & 0 & 30\\
|
---|
249 | DJ Combat - Deep Strike & 10 & 0 & 0 & 30\\
|
---|
250 | DJ CoNTiNUuM & 0 & 2 & 8 & 8\\
|
---|
251 | Fungus 0.2a & 0 & 0 & 10 & 10\\
|
---|
252 | HotBot V2 & 10 & 0 & 0 & 30\\
|
---|
253 | Hurricane6 & 10 & 0 & 0 & 30\\
|
---|
254 | Immer mit der Ruhe! XXXVI & 9 & 0 & 1 & 28\\
|
---|
255 | Jörg's Bisexa & 0 & 0 & 10 & 10\\
|
---|
256 | Kreuziger V2.03q anti Killer & 10 & 0 & 0 & 30\\
|
---|
257 | Malignant Tumor & 0 & 1 & 9 & 9\\
|
---|
258 | Outer Limits & 10 & 0 & 0 & 30\\
|
---|
259 | Speed Slug & 7 & 0 & 3 & 24\\
|
---|
260 | SpiceGirls & 10 & 0 & 0 & 30\\
|
---|
261 | Spy vs. Spy & 0 & 7 & 3 & 3\\
|
---|
262 | \hline
|
---|
263 | fighter-defensive-1 &17 &105 & 88 & 139
|
---|
264 | \end{tabular}
|
---|
265 | \label{tab:defensive}
|
---|
266 | \end{table}
|
---|
267 | \end{center}
|
---|
268 |
|
---|
269 | \begin{center}
|
---|
270 | \begin{table}[h]
|
---|
271 | \caption{Resulaten offensieve softbot na 80000 tikken, bij score telt een
|
---|
272 | gelijkspel voor 1 punt en winst voor 3 punten en verlies niets. }
|
---|
273 | \begin{tabular}{l|r|r|r|r}
|
---|
274 | Tegenstander & Winst & Verlies & Gelijkspel & Score\\
|
---|
275 | \hline
|
---|
276 | (Cy)Borg 004c83a8n & 10 & 0 & 0 & 30\\
|
---|
277 | Advanced Speedix 2004 & 10 & 0 & 0 & 30\\
|
---|
278 | Africa & 4 & 0 & 6 & 18\\
|
---|
279 | Alien v5.13d & 8 & 1 & 1 & 25\\
|
---|
280 | Bright Star Three & 4 & 3 & 3 & 15\\
|
---|
281 | Comes the Wuss 2 & 4 & 5 & 1 & 13\\
|
---|
282 | CopyBot & 9 & 1 & 0 & 27\\
|
---|
283 | Delusion 5 & 7 & 1 & 2 & 23\\
|
---|
284 | DJ Combat - Deep Strike & 10 & 0 & 0 & 30\\
|
---|
285 | DJ CoNTiNUuM & 3 & 4 & 3 & 12\\
|
---|
286 | Fungus 0.2a & 0 & 1 & 9 & 9\\
|
---|
287 | HotBot V2 & 0 & 0 & 10 & 10\\
|
---|
288 | Hurricane6 & 10 & 0 & 0 & 30\\
|
---|
289 | Immer mit der Ruhe! XXXVI & 10 & 0 & 0 & 30\\
|
---|
290 | Jorg's Bisexa x & 0 &10 & 0 & 0 \\
|
---|
291 | Kreuziger V2.03q anti Killer & 10 & 0 & 0 & 30\\
|
---|
292 | Malignant Tumor & 3 & 7 & 0 & 9\\
|
---|
293 | Outer Limits & 10 & 0 & 0 & 30\\
|
---|
294 | Speed Slug & 9 & 0 & 1 & 28\\
|
---|
295 | SpiceGirls & 10 & 0 & 0 & 30\\
|
---|
296 | Spy vs. Spy & 1 & 0 & 9 & 12\\
|
---|
297 | \hline
|
---|
298 | fighter-offensive-2 &33 &132 & 45 & 144
|
---|
299 | \end{tabular}
|
---|
300 | \label{tab:offensive}
|
---|
301 | \end{table}
|
---|
302 | \end{center}
|
---|
303 |
|
---|
304 | \section{Conclusie}
|
---|
305 | \subsection{Vlag}
|
---|
306 | Bij het willikeurig neerzetten van de softbots gaan er slechts 2
|
---|
307 | gevallen fout, nader onderzoek blijkt uit dat er een fout in de code is
|
---|
308 | geslopen waardoor situaties waarbij een volledig `kruis' gemaakt word door
|
---|
309 | een enkele softbot niet afgevangen word. Waardoor deze in een deadloop
|
---|
310 | beland.
|
---|
311 | Een vaste uitgangspositie levert echter heel vreemde resultaten op. De
|
---|
312 | verwachting was dat er altijd dezelfde situatie uit zal komen, dit is
|
---|
313 | echter totaal niet het geval, 4 gevallen worden zelfs niet opgelost. De
|
---|
314 | oorzaak hiervan ligt niet in de softbots, maar in de implementatie van het
|
---|
315 | programma. Het aantal softbots lijkt niet te kloppen en nader analyse
|
---|
316 | blijkt dat er 'spook softbots' op het bord staan. Verder zijn de
|
---|
317 | grensgevallen niet bekend. Zoals wat er bijvoorbeeld gebeurt op het
|
---|
318 | moment dat 2 softbots op precies hetzelfde moment een instructie op de
|
---|
319 | softbot plaatsen. Er lijkt willekeurig een keuze gedaan te worden,
|
---|
320 | waardoor het spelverloop ernstig verstoord kan worden.
|
---|
321 |
|
---|
322 | Voor verder onderzoek is het aan te raden contact op te nemen met de
|
---|
323 | ontwikkelaars om de fouten uit de simulatie te halen en dan de kijken
|
---|
324 | hoe het geval van het `kruis' opgelost kan worden.
|
---|
325 |
|
---|
326 |
|
---|
327 | \subsection{Vechters}
|
---|
328 | Beide vechtende softbots hebben ongeveer dezelfde score, maar halen wel op
|
---|
329 | verschillende gebieden hun punten binnen. De defensieve weet er in 41\%
|
---|
330 | van de gevallen gelijkspel uit te slepen en is in 9\% zelfs winnend,
|
---|
331 | waarbij dus voor 50\% van de gevallen de softbot goed presteert. Hij
|
---|
332 | presteer slecht tegen softbots die gebruik maken van verschillende
|
---|
333 | tactieken en meer effectieve opruim methodes hebben.
|
---|
334 |
|
---|
335 | De offensieve is effectief in het opruimen tegen verschillende type
|
---|
336 | softbots waarbij de defensieve nog met een gelijkspel genoegen moet nemen,
|
---|
337 | maar houdt het een stuk minder uit tegen de `grote jongens'.
|
---|
338 |
|
---|
339 | Voor verder onderzoek zou gekeken moeten worden of een combinatie van de
|
---|
340 | vechters een goede opstelling is. Een analyse van alle verschillende
|
---|
341 | tactieken van de tegenstanders zou ook aan te raden zijn. Door een softbot
|
---|
342 | zo veel mogelijk te storen in zijn ontwikkeling is de beste methode
|
---|
343 | omdat niet veel softbot bouwers rekening hebben gehouden met bijvoorbeeld
|
---|
344 | een situatie waar alle softbots niet meer in controle zijn van de bouwer.
|
---|
345 |
|
---|
346 | \begin{thebibliography}{XX}
|
---|
347 |
|
---|
348 | \bibitem{opdracht}
|
---|
349 | W.A.~Kosters, Kunstmatige intelligentie Programmeer-opgave 2 van 2008
|
---|
350 | -- Bridge, \url{http://www.liacs.nl/~kosters/AI/robot.html}
|
---|
351 |
|
---|
352 | \bibitem{collegeboek}
|
---|
353 | S.J. Russell en P. Norvig, Artificial Intelligence, A Modern Approach,
|
---|
354 | Second ediion, Prentice Hall, 2003.
|
---|
355 |
|
---|
356 | \bibitem{website}
|
---|
357 | Robocom, official website, latest version
|
---|
358 | \url{http://cyty.com/robocom/}
|
---|
359 |
|
---|
360 | \bibitem{website-help}
|
---|
361 | Robocom help, official website, latest version
|
---|
362 | \url{http://www.cyty.com/robocom/?area=help}
|
---|
363 |
|
---|
364 | \bibitem{website-programma}
|
---|
365 | Robocom Workshop, official website, latest version
|
---|
366 | \url{http://www.cyty.com/robocom/?area=d\_rcws}
|
---|
367 |
|
---|
368 | \end{thebibliography}
|
---|
369 |
|
---|
370 | \section*{Appendix}
|
---|
371 | De obot programma's zagen er als volgt uit:
|
---|
372 | \tiny
|
---|
373 | \advance\textwidth by 8cm
|
---|
374 | \advance\oddsidemargin by -3cm
|
---|
375 | \advance\evensidemargin by -3cm
|
---|
376 | \advance\topmargin by -2cm
|
---|
377 | \advance\textheight by 2cm
|
---|
378 | \advance\footskip by -2cm
|
---|
379 | \marginparwidth 0cm
|
---|
380 | \twocolumn
|
---|
381 | %c++ input preformatted with `source-highlight -n -f latex bridge.cc`
|
---|
382 | \include{figure-flag-v2.rob}
|
---|
383 | \include{fighter-defensive-1.rob}
|
---|
384 | \include{fighter-offensive-2.rob}
|
---|
385 | \onecolumn
|
---|
386 |
|
---|
387 | \end{document}
|
---|