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:

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.

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: 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.


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/