Algoritmiek 2012/2013
Het eerstejaarsvak Algoritmiek wordt in het voorjaar van 2013 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.
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 wordt
bijgehouden door de docent van het vak in Den Haag, drs. R. van Vliet.
De colleges zijn op vrijdagen van 11.15 tot 13.00 uur in zaal 412. De bijbehorende werkcolleges vinden
plaats op donderdagen van 13.45 uur tot 15.30 uur, in zaal 412 en (waarschijnlijk) B02, of in
computerzaal 306/308. Assistentie bij de werkgroep en het practicum
wordt verleend door Iris Hupkens (ihupkens@liacs.nl) en Erik Massop (emassop@liacs.nl).
Het eerste college is op vrijdag 8 februari 2012; het eerste werkcollege is op donderdag 14 februari.
Indeling werkgroepen.
Op donderdagmiddagen zullen er -in elk geval in de eerste paar weken- twee
werkgroepen Algoritmiek zijn. Groep 1 zit in zaal 412; groep 2 in zaal B2.
De verdeling over de werkgroepen is als volgt: studenten waarvan de achternaam
eindigt op A t/m M zitten zoveel mogelijk in groep 1; studenten van wie de
achternaam op N t/m Z eindigt zitten in groep 2. Tijdens de werkcolleges in de
computerzalen zitten alle studenten bij elkaar.
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 2012-2013 wordt men verwezen naar de
algemene webpagina.
Materiaal
In het studiejaar 2012/2013 wordt 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 te vinden.
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
20-02-2013 - er is een uitwerking van opgaven 7,8 en 9
van werkcollege 1 beschikbaar.
21-02-2013 - de eerste programmeeropdracht is nu te downloaden. Begin er op tijd
aan te werken! In week 10 zal het werkcollege aan deze opdracht
gewijd zijn. Dat betekent echter niet dat je dan pas hoeft te beginnen.
25-02-2013 - het beloofde hulpprogramma voor het genereren van random grafen is
inmiddels ook beschikbaar (zie hieronder)
28-02-2013 - een voorbeelduitwerking van de te schrijven functies uit het
bomenpracticum staat inmiddels ook online
01-03-2013 - bij programmeeropdracht 1 (zie hieronder) is nu ook een voorbeeld
geplaatst van hoe
een toestand-actie-ruimte er voor het bekeken spel moet uitzien
15-03-2013 - er zijn vier testgevallen beschikbaar bij de eerste
programmeeropdracht. Een eerder gemaakt foutje is daarin hersteld.
15-03-2013 - de tweede programmeeropdracht (backtracking) staat online. Deze moet
op 19 april worden ingeleverd. Donderdag 4 april zal het werkcollege aan deze
opdracht gewijd zijn.
16-03-2013 - de eerste programmeeropdracht moet maandag 18 maart worden ingeleverd;
als het later wordt levert dit per week een punt aftrek op. Het is dus zeer verstandig om,
als je vragen hebt over het te schrijven programma,
deze in de komende week te stellen aan de werkgroepassistenten of de docent. Het is namelijk wel
de bedoeling dat een werkend programma wordt ingeleverd.
16-03-2013 - zoals al eerder op college verteld
zijn er geen standaard vragenuren bij de programmeeropdrachten (zoals het geval was bij Programmeermethoden),
tenzij er speciaal om een vragenuur verzocht wordt.
Wel is er bij elke programmeeropdracht een werkcollege waarin onder begeleiding aan de opdracht gewerkt wordt.
18-03-2013 - op verzoek wordt de deadline voor programmeeropdracht 1 verschoven
naar vrijdag 22 maart. Bij problemen: stel vragen en vraag hulp (per e-mail of persoonlijk)
aan de werkgroepleiders of de docent.
10-04-2013 - Om je backtrackingprogramma (programmeeropdracht 2) te testen: voor n=8 zijn er 128 goede standen;
voor n=14 zijn dat er 3118664.
16-04-2013 - De eerste programmeeropdracht is grotendeels nagekeken. De cijfers
zijn hier te vinden. Er moeten nog
enkele opdrachten nagekeken worden. De cijfers daarvan worden een deze dagen
toegevoegd aan bovenstaande lijst. Overigens zal binnenkort nog een
kopieercontrole plaatsvinden op de ingeleverde opdrachten. De cijfers zijn dus
onder voorbehoud.
16-04-2013 - Op woensdag 17 april is er een extra vragenuur voor de tweede
programmeeropdracht. Dit vragenuur vindt plaats vanaf 15.30 uur in zaal 306/308,
aansluitend op het werkcollege Databases. Erik Massop (assistent bij
Algoritmiek) zal aanwezig zijn om te helpen bij problemen en vragen.
16-04-2013 - Omdat veel studenten bij de tweede opdracht voor het algemene geval
van n+k dames (en k pionnen) gaan, twee willekeurige testvoorbeelden.
Als k=3 en n=10: 528 standen; Als k=5 en n=12: 7.032 standen.
24-04-2013 - De derde programmeeropdracht staat inmiddels online.
De uiterste inleverdatum is op vrijdag 17 mei 2013.
25-04-2013 - De kopieercontrole heeft vorige week plaatsgevonden, en de cijfers
voor opdracht 1 zijn nu definitief. Degenen die moeten aanvullen wordt
aangeraden zo snel mogelijk contact op te nemen met de nakijker, om te bespreken
wat er nog moet verbeterd. Als het aanvullen meer dan een dag werkt lijkt te
worden, neem dan even contact op met mij (de docent) om te bespreken wanneer je
je aanvulling inlevert.
02-05-2013 - Inmiddels staat er een voorbeeldinvoer met bijbehorend antwoord online behorend
bij programmeeropdracht 3. Zie hieronder, bij de programmeeropdrachten. Tevens
is daar een hulpprogramma te vinden voor het genereren van random invoer.
07-05-2013 - Woensdagmiddag 15 mei zal er een extra vragenuur zijn over de derde programmeeropdracht
o.l.v. Iris Hupkens.
Dit vragenuur zal plaatsvinden in computerzaal 306/308, en begint om 15.30 uur.
13-05-2013 - Wellicht mosterd na de maaltijd, maar toch .... In opdracht drie kun je het aandelenpakket middels een bitstring weergeven, waarbij bit 1 betekent dat je het betreffende aandeel in bezit hebt en 0 dat dit niet het geval is. Zo'n bitstring correspondeert met een geheel getal en omgekeerd. Om nu uit een geheel getal de achterhalen welke bits op 1 staan kun je herhaald door twee delen, maar je kunt ook gebruik maken van bepaalde bitstring-operaties. Een voorbeeld vind je hier.
16-05-2013 - De tweede programmeeropdracht is nagekeken. De cijfers
zijn hier te vinden. Nagekeken
werken zijn af te halen bij de docent.
17-05-2013 - Voor het tentamen is er een vragenuur. Dit staat gepland op maandg 10 juni 2013,
om 11.00 uur. Mocht je al eerder vragen hebben, stuur dan gerust een mail of
kom langs. In dat laatste geval is het verstandig een afspraak te maken.
05-06-2013 - Er is nu ook een
uitwerking van de
opgaven van werkcollege 5 beschikbaar, en
antwoorden van opgaven 4 en 5 van
werkcollege 10.
06-06-2013 - De derde programmeeropdracht is grotendeels nagekeken. De cijfers
zijn hier te vinden. Er moeten nog
enkele opdrachten nagekeken worden. De cijfers daarvan worden een deze dagen
toegevoegd aan bovenstaande lijst. Het nagekeken werk is af te halen bij de
docent in kamer 151.
01-07-2013 - Het tentamen is nog niet helemaal nagekeken. Ik verwacht dat dit
woensdag/donderdag a.s. wel het geval zal zijn. De tentamenuitslagen zullen dan
meteen op deze site worden gepost. Nog een paar dagen geduld dus (sorry).
04-07-2013 - Het tentamen is nu wel nagekeken. De behaalde tentamencijfers kun
je hier vinden. De eindcijfers moeten nog
berekend worden en zullen als het goed is morgen ook hier op de site komen. Het
is verstandig om langs te komen om je tentamen in te zien en/of een kopie van je
nagekeken werk mee naar huis te nemen. Dit is vooral zinvol indien je het
tentamen deze keer niet gehaald hebt en dit in augustus wilt herkansen.
05-07-2013 - De eindcijfers zijn berekend en kunnen
hier gevonden worden. Er komt nog een
uitwerking van het juni-tentamen op de site te staan.
15-07-2013 - De uitwerking (handgeschreven) is inmiddels beschikbaar, en is te
vinden onder het kopje Tentamen.
18-07-2013 - De komende drie weken ben ik afwezig. Voor vragen over het vak,
of voor een kopie van je nagekeken tentamen, kun je bij de docent die
Algoritmiek in Den Haag verzorgt terecht. Op maandag 5 augustus a.s. zal hij (= Rudy
van Vliet) in elk geval vanaf een uur of 11 beschikbaar zijn voor vragen
in kamer 124
(Snellius). Ook op woensdagochtend 7 augustus kun je nog bij hem langs.
Via zijn
homepage kun je zien of hij
ook op andere dagen/tijden aanwezig is.
19-08-2013 - Het hertentamen is nagekeken. De behaalde tentamencijfers kun
je hier vinden. De eindcijfers moeten nog
berekend worden en zullen zeer binnenkort ook hier op de site komen.
30-08-2013 - De eindcijfers zijn berekend en staan
hier.
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 |
| 8 februari |
Introductie |
sheets1 |
1.1, 1.2, 1.4 (t/m graafrepresentaties) |
14 februari |
opgaven1 |
| 15 februari |
Grafen en bomen |
sheets2 |
1.4 vanaf graafrepresentaties |
21 februari |
opgaven2 |
| 22 februari |
Toestand-actie-ruimte |
sheets3 |
6.6 (alleen Reduction to Graph Problems |
28 februari |
opgaven3 |
| 1 maart |
Complexiteit, Brute force, Exhaustive search |
sheets4 |
2.1-3, 2.6-7 (lezen), 3 inleiding, 3.1-3 |
7 maart |
Eerste programmeeropdracht |
| 8 maart |
Exhaustive search, Backtracking |
sheets5 |
3.4, 12 inleiding, 12.1 |
14 maart |
opgaven5 |
15 maart |
Backtracking, Begin verdeel en heers |
sheets6 |
12.1, 5 inleiding, 4 inleiding |
21 maart |
opgaven6 |
22 maart |
Verdeel en heers |
sheets7 |
4.1, 4.4, 5.2-5 |
4 april |
Tweede programmeeropdracht |
29 maart |
Geen college: Goede Vrijdag |
--- |
--- |
geen werkcollege op 28/3; wel op 4 april |
--- |
5 april |
Restant decrease and conquer, Dynamisch programmeren |
sheets8 |
Sheets, 8 inleiding |
11 april |
opgaven8 |
12 april |
Dynamisch programmeren |
sheets9 |
Sheets, 8.1, 8.2, scan binomiaalcoefficienten |
18 april |
opgaven9 |
19 april |
Restant DP, Gretige algoritmen |
sheets10 |
Sheets, 9 inleiding + 9.3 |
25 april |
opgaven10 |
26 april |
Restant gretig, Branch & bound |
sheets11 |
9.3, 12.2, sheets |
2 mei |
Derde programmeeropdracht |
3 mei |
Restant Branch & bound, Heap(sort) |
sheets12 |
12.2, 6.4 |
16 mei |
opgaven12 |
17 mei |
Oud tentamen: augustus 2010, 2011 |
zie onder |
--- |
--- |
--- |
De tentamenstof bestaat uit: alles wat we gedurende het semester behandelen.
Dat komt op het volgende neer:
-
De hierboven gegeven slides bij de hoor- en werkcolleges
(wordt in 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
nog 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.
Tweede Werkcollege 2012/2013
Tijdens het tweede werkcollege zal er een practicumopdracht worden gedaan in
de computerzaal 306-308.
Het skeletprogramma zoals dat moet worden gebruikt staat
hier.
Hieronder staat de opdracht. Volg de volgende stappen om te beginnen:
- Pak het skeletprogramma uit (onder Linux kan dat bijvoorbeeld met "tar xvfz
practicum2013.tgz").
- Ga naar de directory "practicum2013" (onder Linux kan dat bijvoorbeeld met
"cd practicum2013").
- 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. 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".
Voorbeeld uitwerkingen 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.
Binnenkort zullen de uitwerkingen van het bomenpracticum op deze plek worden
geplaatst.
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. 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: maandag 18 maart 2013, 23:59 uur.
Er is een
hulpprogramma
beschikbaar, waarmee random grafen gegenereerd kunnen worden.
Als je je afvraagt welke informatie je allemaal moet opnemen in
de toestand-actie-ruimtes in het verslag, kijk dan
hier
voor een voorbeeld van (een deel van) zo'n toestand-actie-ruimte.
Merk op dat Abe in de beginsituatie vier mogelijkheden heeft, maar
dat twee daarvan op hetzelfde neerkomen. Je hoeft derhalve maar
drie van de vervolgstanden verder uit te werken. (Opmerking: in je programma
loop je gewoon altijd alle mogelijke zetten af; het is namelijk in het
algemeen helemaal niet makkelijk om "dezelfde" grafen te herkennen. Je
programma zal dus de twee bovengenoemde standen ook allebei bekijken.)
Bij elke knoop met meerdere kinderen moet je aangeven welke zet
er gekozen wordt en waarom, zoals in het voorbeeld gebeurt voor
de beginsituatie.
Er zijn vier testgevallen beschikbaar waarop je je
eigen programma kunt testen.
- Programmeeropdracht 2 (backtracking).
Uiterste inleverdatum: vrijdag 19 april 2013, 23:59 uur.
Twee voorbeelden om je programma mee te testen: voor n=8 zijn er 128 goede standen; voor n=14 zijn dit er 3118664. Dit zijn de echte standen, dus zonder rekening te houden met eventuele symmetrie.
- Programmeeropdracht 3 (dynamisch programmeren).
Uiterste inleverdatum: vrijdag 17 mei 2013.
Er is een hulpprogramma beschikbaar,
waarmee random instanties gegenereerd
kunnen worden.
Er is ook een voorbeeldinstantie beschikbaar.
Het antwoord bedrag[tw][0] bij deze instantie vind je hier.
Bedenk dat je zelf niet alleen het bedrag moet berekenen, maar ook de
transacties waarmee je dat bedrag bereikt.
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.
Eventuele opmerkingen of tips 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
Enkele tentamens van 2011, 2012 en 2013 zijn hieronder te vinden,
alsmede uitwerkingen daarvan.
Vragen en/of opmerkingen kunnen worden gestuurd
naar: graaf@liacs.nl.
Laatste wijziging 28 november 2013 - http://www.liacs.nl/~graaf/ALGO/