Algoritmiek 2013/2014
LET OP:
Eerstejaars studenten Informatica en Economie volgen het vak in Den Haag.
Deze website (www.liacs.nl/home/graaf/ALGO) is bedoeld voor de studenten die
in Leiden het vak volgen. De Haagse studenten hebben een eigen
website, die tot dit
studiejaar werd
bijgehouden door de toenmalige docent van het vak in Den Haag. Zie aldaar voor
de informatie over Algoritmiek zoals dat in Den Haag wordt gegeven.
Het eerstejaarsvak Algoritmiek wordt in het voorjaar van 2014 verzorgd
door Jeannette de Graaf.
Het vak is verplicht voor alle studenten Informatica, Informatica en Economie,
en voor studenten die een dubbele propedeuse Wiskunde/Informatica doen.
Het vak levert 6 EC op. Studenten die deel gaan nemen aan Algoritmiek wordt verzocht zich via
uSis aan te melden. Je kunt dit het beste doen via het nummer van de studieactiviteit Algoritmiek
(dat is 8949). Je bent dan meteen aangemeld voor het tentamen. Zie
hier
voor informatie over inschrijven voor vakken/tentamens.
De colleges zijn op vrijdagen van 11.15 tot 13.00 uur in zaal B02 van het
Snelliusgebouw. De bijbehorende werkcolleges vinden
plaats op donderdagen van 11.15 uur tot 13.00 uur in zaal B02 en B03 (meestal)
of in computerzaal 306/308 (soms).
Assistentie bij de werkgroep en het practicum
wordt verleend door Jennifer Jochems, Leon Helwerda en Bart van Strien.
Het eerste college is op vrijdag 7 februari 2014; het eerste werkcollege
is op donderdag 13 februari.
Voorkennis voor dit vak is het college
Programmeermethoden. Het
college dat op Algoritmiek aansluit heet
Datastructuren.
Dit wordt gegeven in het najaar (derde semester van de studie Informatica).
In het vak Complexiteit (vierde semester) gaan we
dieper in op de vraag hoe moeilijk bepaalde problemen zijn, hoe je dat onderzoekt, en
hoe je daarmee omgaat.
Inhoud van het vak
Algoritmiek gaat uiteraard over algoritmen. Er zullen enkele belangrijke, veel gebruikte oplossingsmethoden
worden besproken, compleet met voorbeelden. Besproken worden in elk geval: brute force, exhaustive search,
backtracking, verdeel en heers, dynamisch programmeren, greedy algoritmen en branch and bound.
Verder onder meer ook toestand-actie-ruimtes (als hulp bij het probleeemoplossen), een beetje complexiteit
(om de efficientie van algoritmen te beschrijven en te vergelijken) en heapsort.
Voor globale informatie over het vak in studiejaar 2013-2014 wordt men verwezen naar de
algemene webpagina.
Materiaal
In het studiejaar 2013/2014 wordt wederom
gebruik gemaakt van het volgende
boek: Anany Levitin,
Introduction to The Design and Analysis of Algorithms,
THIRD edition (Addison-Wesley, 2012).
Of de
internationale editie van hetzelfde boek.
Tot en met studiejaar 2010/2011 werd de second edition van het boek gebruikt. Deze verschilt niet
vreselijk veel van de nieuwe editie: er is wat geschoven in de volgorde van sommige behandelde methoden,
en de opgaven zijn volgens de schrijver van het boek uitgebreid. De tweede editie van het boek is
inhoudelijk dus ook te gebruiken, maar let op voor andere hoofdstuknummering en andere opgavenummering.
Voor een compleet overzicht, zie de
verwijslijst
van de derde editie naar de tweede editie. De paragraaf over het berekenen van binomiaalcoefficienten
met behulp van dynamisch programmeren is bij de overgang van de tweede editie naar de derde editie
uit het boek verdwenen. Een scan hiervan is
hier
De bij het college behorende sheets worden ook via deze website beschikbaar gesteld. Meestal zullen de
sheets al voor het college op deze webpagina verschijnen: er kunnen daarin dan nog kleine veranderingen
worden aangebracht, afhankelijk van hoe ver we op college komen (en of er fouten in gevonden worden).
Na afloop van het college wordt telkens de definitieve versie van de sheets hieronder geplaatst.
Nieuws / mededelingen studiejaar 2013/2014
18-07-2014 - En de eindcijfers zijn nu
ook uitgerekend. Mocht je het tentamen gehaald hebben, maar nog iets hebben
openstaan van het programmeerwerk, neem dan vandaag nog contact met mij op.
Als dat vandaag niet meer lukt, ga dan alvast aan de slag met je openstaande
opdracht(en) en stuur mij rond 5 augustus een mail voor een afspraak om
de stand van zaken te bespreken. Ik ben in elk geval afwezig van maandag
21 juli tot en met maandag 4 augustus, en zeker weer aanwezig op het Snellius op
7 augustus.
17-07-2014 - Het hertentamen van vorige week is inmiddels nagekeken. De uitslagen zijn hier te vinden. Eindcijfers gaan morgen berekend worden en komen eveneens op deze site te staan.
16-07-2014 - Vanwege hoofdpijn is het mij helaas vandaag niet gelukt het hertentamen van vorige week nagekeken te hebben. Het nakijken is nu voor 75% klaar. Morgen ga ik een nieuwe poging wagen e.e.a. af te maken, dus houd deze website goed in de gaten.
04-07-2014 - Het tentamen van juni staat verderop op deze site, en tevens een uitwerking van dit tentamen.
27-06-2014 - Inmiddels zijn de eindcijfers berekend en hier te vinden. Het tentamen alsmede een uitwerking daarvan wordt binnenkort ook online gezet op deze site.
26-06-2014 - Het tentamen van 10 juni is nagekeken. De cijfers staan hier.
De eindcijfers moeten nog berekend worden: voor studenten met een onvoldoende tentamencijfer is het eindcijfer het (op helen/halven) afgeronde tentamencijfer, voor studenten met een voldoende (>=5,5) wordt het eindcijfer berekend volgens de op deze website staande weging van tentamencijfer/practicumcijfer. Dit kun je dus nu zelf al uitrekenen. Nagekeken werk kan uiteraard worden ingezien en/of in de vorm van een kopie mee naar huis genomen. Hiervoor kun je bij de docent langsgaan.
06-06-2014 - Er is een handgeschreven en misschien niet helemaal nette
uitwerking van de heapsommen uit het laatste werkcollege beschikbaar. Zie
verderop op deze pagina.
03-06-2014 - Het vragenuur Algoritmiek is vrijdag 6 juni in zaal 174. Aanvang
11:00 uur.
03-06-2014 - Het grootste deel van de ingeleverde derde programmeeropdrachten
is inmiddels nagekeken en becijferd.
Alhier de resultaten. Zodra de ontbrekende
cijfers bekend zijn wordt de cijferlijst bijgewerkt.
26-05-2014 - Omdat we tijdens het laatste college niet zo erg zijn opgeschoten
met het augustus-tentamen van 2013 staat hier alsnog een handgeschreven
uitwerking van dit tentamen.
23-05-2014 - Hier vind je ook
de resultaten voor opdracht 2. Mocht je
een fout ontdekken, neem dan contact op met de docent.
23-05-2014 - De meeste studenten hebben de nagekeken opdrachten 1 (en 2) al terug, maar
hier is nog een overzicht van de behaalde
cijfers. Een A betekent dat de opdracht niet
voldoende was, en moet worden aangevuld in overleg met de docent. Voor de
duidelijkheid, er moet nog gecontroleerd worden op kopieren.
16-05-2014 - Het vragenuur voor het tentamen wordt gehouden op vrijdag 6 juni
2014. De zaal zal op dize website en/of via het mededelingenbord t.z.t.
bekend worden gemaakt. Mocht je eerder in je voorbereiding vragen hebben, dan
kun je ook individueel langskomen. In dat geval is het verstandig om van tevoren
even een afspraak te maken. Vragen stellen per mail mag natuurlijk ook.
07-05-2014 - Op donderdag 8 mei worden in het werkcollege opgaven over
gretige algoritmen gemaakt (opgaven12). Neem het boek van Levitin mee,
want een aantal opgaven komt daaruit.
24-04-2014 - Programmeeropdracht 1 is nu bijna helemaal nagekeken. Binnenkort
zullen de behaalde cijfers op deze website worden gezet. Overigens moet er nog
een kopieercontrole plaatsvinden, dus de behaalde cijfers zijn onder voorbehoud.
24-04-2014 - Voor de duidelijkheid bij de definitie van G(i,j): er wordt daar
bedoeld dat je i munten in bezit heb, waarvan je er nog een zeker aantal mag
begraven voordat je echt bij het volgende fort aankomt, alwaar je tol moet
betalen.
24-04-2014 - In principe begint het oplossen van een dynamisch programmeren
vraagstuk met een recursieve formulering, waaruit je vervolgens kunt afleiden
hoe het te gebruiken array gevuld kan worden. Je begint dus recursief na te
denken, maar past vervolgend in je programma bottom up dynamisch
programmeren toe. Lees voordat je begint te programmeren wel eerst de hele
opdracht door, inclusief het gedeelte dat gaat over het verslag.
22-04-2014 - Op veler verzoek heb ik al enige -min of meer willekeurige- testvoorbeelden voor programmeeropdracht 3 op de site gezet. Zie verderop bij de programmeeropdrachten.
17-04-2014 - Door ziekte van een van de nakijkers zijn nog niet alle
opdrachten 1 nagekeken. Als het goed is zal dit na het Paasweeekend wel het
geval zijn. De resterende nagekeken werken kunnen dan bij/tijdens het
(werk)college of (vanaf dinsdagmiddag) bij de docent worden afgehaald.
14-04-2014 - De derde programmeeropdracht staat inmiddels online (zie verderop).
Het werkcollege van donderdag 17 april zal aan deze programmeeropdracht gewijd
zijn, dus zorg dat je hem voor die tijd goed leest en erover nadenkt hoe je het
probleem gaat oplossen.
09-04-2014 - Er komen nog twee vragenuren voor programmeeropdracht 2, te weten op donderdag 10 april (15:30 - 17:00) en op maandag 14 april (11:00 - 13:00).
09-04-2014 - Het werkcollege van 9 april vindt plaats in zaal B2. Zie het collegeschema voor de opgaven.
09-04-2014 - Er zijn voor alle drie opties uit programmeeropdracht 2 enige testresultaten te vinden verderop op deze pagina, bij de opdracht zelf.
02-04-2014 - Voortaan is het "op-papier"-werkcollege Algoritmiek alleen in zaal
B2. De twee werkgroepen zijn dus samengevoegd.
26-03-2014 - Voorbereiding op het werkcollege Algoritmiek van donderdag 27 maart: lees de de tweede programmeeropdracht van tevoren op zijn minst goed door en denk alvast na hoe je het problem aanpakt.
Zorg dat je de structuur van je programma al in je hoofd hebt, en hebt nagedacht over de representatie van het schaakbord en het plaatsen van de dominostenen.
25-03-2014 - Er bestaat de mogelijkheid om een bonus van 0,5 punt te behalen
voor opdracht 2 als je ook steeds enkele goede standen netjes afdruk. Zie verder de
toelichting bij de opdracht zelf.
23-03-2014 - Programmeeropdracht 2 staat inmiddels online. Deze moet op 14 april ingeleverd worden (= over drie weken). Donderdag 27 maart zal de werkgroep Algoritmiek in de computerzalen 306/308 en 303 plaatsvinden en kun je onder begeleiding aan je opdracht werken.
16-03-2014 - De deadline voor de eerste programmeeropdracht wordt met een dag verschoven. De deadline is nu: dinsdag 18 maart om 10:00 uur. Als het goed is heeft iedereen een mail gekregen waarin dit wordt aangekondigd en toegelicht. Zie verder de informatie bij de opdracht zelf, verderop op deze pagina.
09-03-2014 - Op verzoek is er deze week nog een extra vragenuur voor de eerste programmeeropdracht, te weten VRIJDAG 14 MAART, aanvang 14:00 uur in de computerzalen (waarschijnlijk 306/308). Mocht je eerder in de week vragen hebben over de programmeeropdracht, stuur dan een mail of kom persoonlijk langs bij de docent in kamer 151. Ik ben in principe op maandag (tot 15 uur), dinsdag, donderdag en vrijdag aanwezig.
05-03-2014 - Zoals beloofd is er inmiddels een aantal testvoorbeelden beschikbaar. Een bestandje met uitleg
kun je hieronder vinden bij de eerste programmeeropdracht onder het kopje Programmeeropdrachten. Ter herinnering:
op 6 maart is er nog een vragenuur (zie mededeling van 27/02). Het werkcollege zal deze week in zalen B2/B3 plaatsvinden.
Zie ook het mededelingenscherm.
04-03-2014 - Voortaan zal het laatste nieuws bovenaan staan in plaats van
onderaan. Zie de mededeling hieronder voor de vragenuren.
27-02-2014 - Op maandag 3 maart is er van 11:00 tot 13:00 een vragenuur in de computerzaal 306/308 over de
eerste programmeeropgave. Er zal assistentie aanwezig zijn om jullie vragen te beantwoorden. Op donderdag 6 maart
is er nog een vragenuur, eveneens in zaal 306/308. Dit keer van 16:30 tot 17:00 uur. Maak hier goed gebruik van!
14-02-2014 - Er is een uitwerking beschikbaar van opgave 7 t/m 9 van het eerste
werkcollege. Zie verderop op deze pagina.
12-02-2014 - De werkgroepindeling voor het werkcollege is voorlopig als volgt:
studenten waarvan de achternaam begint met een letter <= J zitten in zaal B2;
de rest heeft werkcollege in zaal B3.
06-02-2014 - De eerste programmeeropdracht voor dit jaar is al te
downloaden/lezen. Alhoewel misschien nog niet alle stof die nodig is behandeld
is (uiteraard) kun je er wel al rustig aan beginnen. Bij Programmeermethoden heb
je immers ook al recursie gehad.
10-01-2014 - Er is nog geen nieuws. Het eerste college is op vrijdag 07-02-2014.
Programma
Het programma van colleges en werkcolleges zal hieronder worden bijgehouden. Voor elke week staat daarin
welke onderwerpen aan de orde zijn gekomen, met de bijbehorende hoofdstukken uit het boek en de gebruikte
sheets. Bovendien kan men hier de bij het
werkcollege behandelde opgaven vinden. (Let dus op als je de tweede editie van het boek gebruikt.
De verwijzingen zijn in principe naar de derde editie.)
| Datum (HC) |
Onderwerp |
Sheets |
Boek |
Datum (WC) |
Werkcollege |
| 7 februari |
Introductie |
sheets1 |
1.1, 1.2, 1.4 (t/m graafrepresentaties) |
13 februari |
opgaven1 |
| 14 februari |
Grafen en bomen, intro t.a.r. |
sheets2 |
1.4 |
20 februari |
opgaven2 |
| 21 februari |
Toestand-actie-ruimte |
sheets3 |
sheets, 4.5 p.189-192, 6.6 p.272-273 |
27 februari |
Eerste programmeeropdracht |
| 28 februari |
Complexiteit, brute force, exhaustive search intro |
sheets4 |
2.1-3, 2.6-7, 3 inl, 3.1-3 |
6 maart |
opgaven4 |
| 7 maart |
Exhaustive search, backtracking |
sheets5 |
3.4-5, sheets, 12 inl, 12.1 (dames) |
20 maart |
opgaven5 |
| 14 maart |
Collegevrije week |
... |
... |
... |
... |
| 21 maart |
Backtracking, Verdeel en heers |
sheets6 |
12.1, 5 inl., 5.1, 4 inl. |
27 maart |
Tweede programmeeropdracht |
| 28 maart |
Verdeel en heers |
sheets7 |
4.1, 4.4, 5.2-5 |
3 april |
opgaven7 |
| 4 april |
Restant Decrease and conquer, Dynamisch programmeren |
sheets8 |
Sheets, 4 inl, opgave 4.5.12, 8 inl |
10 april |
opgaven8 |
| 11 april |
Dynamisch programmeren |
sheets9 |
Sheets, 8.1, 8.2, scan binomiaalcoefficienten |
17 april |
Derde programmeeropdracht |
| 18 april |
Goede Vrijdag: geen college |
--- |
--- |
24 april |
opgaven10 |
| 25 april |
Gretige algoritmen |
sheets10 |
9 inl, 9.2 t/m p.353, 9.3, sheets |
1 mei |
Derde programmeeropdracht |
| 2 mei |
Dijkstra, Branch and bound |
sheets11 |
9.3, 12.2, sheets |
8 mei |
opgaven12 |
| 9 mei |
Branch and bound, heap, heapsort |
sheets12 |
12.2, 6.4 |
15 mei |
opgaven13 |
| 16 mei |
Gedeelte oud tentamen 2013 |
augustus 2013 |
--- |
--- |
--- |
De tentamenstof bestaat uit: alles wat we gedurende het semester behandelen.
Dat komt in 2013/2014 op het volgende neer:
-
De hierboven gegeven slides bij de hoor- en werkcolleges
(wordt in de loop van semester opgebouwd).
-
De hierboven vermelde delen uit de derde editie van
het boek van Anany Levitin
(wordt in loop van semester opgebouwd).
-
De opgaven die bij het werkcollege zijn behandeld, en die je hierboven
in het schema kunt vinden
(wordt in loop van semester opgebouwd).
-
Alles wat bij hoor- en werkcollege en de programmeeropdrachten
aan de orde is gekomen.
-
Uiteraard moet je behandelde ontwerptechnieken voor algoritmes
ook op nieuwe problemen kunnen toepassen.
Opgaven
Tijdens werkcolleges worden opgaven gemaakt, soms op papier en soms achter de computer. Deze opgaven
kunnen via deze website worden verkregen, maar zullen ook tijdens (werk)college worden uitgedeeld.
Van enkele opgaven is een uitwerking beschikbaar. Deze zullen hieronder worden
gepubliceerd.
- Antwoorden van opgave 7 t/m 9 van het
eerste werkcollege
- Antwoorden van opgave 1 t/m 10 van het
vijfde werkcollege
- Antwoord van opgave 1 van het
zevende werkcollege
- Antwoord van opgave 10 van het
zevende werkcollege
- Antwoord van opgaven 4+5 van het
twaalfde werkcollege
- Handgeschreven uitwerking van de heapopgaven
uit het dertiende werkcollege
Tweede Werkcollege 2013/2014
Tijdens het tweede werkcollege wordt er een practicumopdracht worden gedaan in
de computerzalen 306-308 en 303. Zet de PC eerst op Linux (UNIX).
Het skeletprogramma zoals dat moet worden gebruikt staat
hier.
Volg de volgende stappen om te beginnen:
- Pak het skeletprogramma uit (onder Linux kan dat bijvoorbeeld met "tar xvfz
practicum2014.tgz").
- Ga naar de directory "practicum2014" (onder Linux kan dat bijvoorbeeld met
"cd practicum2014").
- Bekijk de gewenste file "readmewindows.txt" of "readmelinux.txt" voor de
precieze bedoeling en werking van het programma.
De opgaven staan hierboven in de tabel met het programma van colleges en
werkcolleges (opgaven2). Bewerk "boom.cc"
zoals aangegeven in de twaalf opgaven. In dit bestand kunnen vanaf regel 350
de functies gevonden worden die moeten worden aangepast.
De liefhebbers kunnen ook zelf bomen maken om uit te proberen.
Zie voor de gewenste codering van de bomen de file "readmewindows.txt"
of "readmelinux.txt".
Voorbeelduitwerkingen zijn
hier
te vinden.
Als alles goed is, dan moet de test bij onderdeel 1 (menu-optie 1)
een uitvoer hebben die sterk
hierop
lijkt.
De uitvoer bij onderdeel 2 (menu-optie 2) moet
hierop
lijken.
Programmeeropdrachten
Bij dit college moeten drie programmeeropdrachten (in C++) gemaakt worden, waarbij de nadruk ligt op het
toepassen van de op college besproken probleemoplossingsmethoden. De opdrachten moeten alle drie voldoende
zijn (>=6).
Programmeerwerk mag in tweetallen worden gemaakt. In de week voorafgaand aan de deadline is het
werkcollege in de computerzaal; je kunt dan aan de opdrachten werken en de werkcollegebegeleiders zijn
aanwezig om vragen te beantwoorden. Er zullen ook enkele speciale vragenuren worden georganiseerd in
de twee weken voor de deadlines.
De opdrachten dienen (stipt!) op de deadlines te worden
ingeleverd. Anders gaat er per week (of gedeelte daarvan) te laat inleveren een punt af.
Studenten die vorig studiejaar alle drie programmeeropdrachten hebben afgerond hoeven het programmeerwerk
dit jaar niet opnieuw te doen. Ouderejaars studenten die het practicum helemaal niet of slechts
gedeeltelijk hebben gedaan moeten contact opnemen met de docent om een individuele regeling te treffen.
Deelresultaten blijven niet automatisch geldig.
- Programmeeropdracht 1 (brute force).
Uiterste inleverdatum: dinsdag 18 maart 2014, 10:00 uur.
Om te controleren of je programma werkt is hier een aantal testgevallen (beginstanden en tussenstanden) met
bijbehorende antwoorden te vinden.
Merk op dat vastligt voor welk van beide spelers (beginnende of tegenstander) een stand winnend of verliezend is, evenals het
optimale verschil waarmee de winnaar wint. De beste zet en de precieze uitslag hoeven niet perse
hetzelfde te zijn als in de file met testresultaten staat aangegeven.
De tweede toestand-actie-ruimte die gemaakt moet worden en bij het verslag gevoegd, is een beetje groot uitgevallen. Teken dus ook vooral spelverlopen die helemaal vastliggen niet (geef alleen de einduitslag die resulteert). Teken verder bijvoorbeeld de bovenste vier niveaus in 1 figuur geheel, met de bijbehorende einduitslagen in alle toestanden. Voor de standen op het onderste niveau moet je dan wel aangeven hoe je aan het antwoord komt. Dit kun je bijvoorbeeld doen door voor de betreffende subbomen corresponderend met die standen alleen de spelverlopen te geven, zonder de tabel steeds te tekenen, en daaruit de einduitslag te bepalen.
- Programmeeropdracht 2 (backtracking).
Uiterste inleverdatum: maandag 14 april 2014, 23:59 uur.
Er is een bonus van 0,5 punt te verdienen als je behalve het aantal standen
ook enkele van die goede standen zelf, dus bedekkingen van het schaakbord
met dominostenen,
op een duidelijke manier op het beeldscherm afdrukt/visualiseert.
Het is uiteraard niet de bedoeling
alle standen af te drukken, want dat kunnen er heel erg veel zijn. Geef dus een
beperkte selectie met echt verschillende standen (dus bijvoorbeeld niet
standen waarbij maar 2 stenen anders liggen) en maak er wat moois van.
Enkele testresultaten zijn inmiddels beschikbaar.
- Programmeeropdracht 3 (dynamisch programmeren).
Uiterste inleverdatum: maandag 12 mei 2014, 23:59 uur.
Om te controleren of je programma werkt zijn er twee files met testresultaten. In de ene staat voor een aantal combinaties van N, M en K het maximale aantal goudstukken waarmee de koopman thuiskomt. In de andere staat voor twee voorbeelden behalve het maximale aantal waarmee je in je woonplaats aankomt ook een mogelijk schema dat aangeeft hoe je dat moet doen. Merk op het maximale aantal munten waarmee je thuiskomt wel vastligt, maar dat er meerdere manieren kunnen bestaan hoe je dat aantal bereikt; het schema is dus niet perse uniek.
Meer informatie, zoals over het schrijven van het verslag in LaTeX, is
hier
te vinden.
Voor vragen/hulp bij de programmeeropdrachten kun je terecht bij de
werkcollegebegeleiders of de docent.
Eventuele opmerkingen, tips of testgevallen bij de opdrachten zullen
hier worden bekendgemaakt.
Eindcijfer
Het programmeerwerk telt, net als bij Programmeermethoden, mee voor het eindcijfer. Het eindcijfer
wordt voor twee derde bepaald door het tentamencijfer, en voor een derde door het programmeerwerk.
Zowel programmeerwerk als tentamen moeten daarbij voldoende zijn. Voor
minorstudenten geldt een iets aangepaste regel.
Tentamen
In studiejaar 2013/2014 vindt het tentamen plaats op dinsdag 10 juni 2014, 10.00-13.00 uur.
Er is een vragenuur op vrijdag 6 juni 2014, vanaf 11:00 uur. Plaats: zaal 174.
Het hertentamen is op woensdag 9 juli 2014, 10.00-13.00 uur.
De tentamens van 2011, 2012 en 2013 zijn hieronder te vinden,
alsmede uitwerkingen van enkele daarvan.
Vragen en/of opmerkingen kunnen worden gestuurd
naar: j.m.de.graaf@liacs.leidenuniv.nl.
Laatste wijziging 13 augustus 2014 - http://www.liacs.nl/~graaf/ALGO/