Algoritmiek 2014/2015
LET OP:
Eerstejaars studenten Informatica en Economie volgen het vak in Den Haag.
Deze website (http://keep.liacs.leidenuniv.nl/~graafjmde/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. Zie aldaar voor
de informatie over Algoritmiek zoals dat in Den Haag wordt gegeven.
Het eerstejaarsvak Algoritmiek wordt in het voorjaar van 2015 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 9913). 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 B2 van het
Snelliusgebouw. De bijbehorende werkcolleges vinden
plaats op donderdagen van 13:45 uur tot 15:30 uur in zaal B1 en B2 (meestal)
of in computerzaal 306/308 en/of 302/304 (soms).
Assistentie bij de werkgroep en het practicum
wordt verleend door Leon Helwerda, Mathe Zeegers en Ruud Heesterbeek.
Het eerste college is op vrijdag 6 februari 2015; het eerste werkcollege
is op donderdag 12 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 2014-2015 wordt men verwezen naar de
algemene webpagina.
Materiaal
In het studiejaar 2014/2015 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 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 2014/2015
21-07-2015 - Vandaag heb ik de eindcijfers zoals berekend uit het programmeerwerk en de tentamencijfers van het JUNI-tentamen opgestuurd om te laten boeken in uSis. Schrik dus niet als je een automatische mail krijgt uit uSis met een onvoldoende. De eindcijfers op basis van het hertentamen moeten nog berekend worden; die komen eind deze week of begin volgende week in uSis.
16-07-2015 - Ook de cijferlijst van het programmeerwerk is weer ge-updatet.
16-07-2015 - Hier de tentamencijfers van het hertentamen van 9 juli. Indien het tentamencijfer onvoldoende is (dus minder dan 5,5), dan is het tentamencijfer tevens het eindcijfer voor Algoritmiek. Dit staat dan als zodanig in de lijst al (afgerond) vermeld. Zo niet, dan moet nog gemiddeld worden met het gemiddelde practicumcijfer. Binnenkort zullen de eindresultaten van zowel het tentamen als het hertentamen worden berekend en in uSis worden gezet. Indien je het tentamen niet gehaald hebt moet je in principe volgend jaar weer met de reguliere tentamens meedoen. Mochten er echter zwaarwegende redenen zijn waarom je nog een extra kans zou moeten/kunnen krijgen in dit studiejaar ... meld je dan met de reden hiervoor bij de docent. Eind augustus wordt er namelijk geheel toevallig nog een extra herkansing van het vak gegeven.
07-07-2015 - De uitwerking van het tentamen van afgelopen juni staat nu op de website. Excuses dat het wat lang heeft geduurd.
06-07-2015 - Er is vandaag een kleine update geweest van de practicumcijfers. Zie hieronder (15 juni).
27-06-2015 - Met enige moeite heb ik het bestand met tentamencijfers van het juni-tentamen op de site weten te zetten. Je kunt zelf je eindcijfer uitrekenen. In de sheets van het eerste college staat hoe je eindcijfer berekend wordt. Studenten die de minor doen hebben niet de aanvullende eis dat zowel practicum als tentamen voldoende moeten zijn; alle andere studenten moeten wel aan die eis voldoen.
26-06-2015 - Het tentamen van juni is nu voor driekwart volledig nagekeken en becijferd. Van een kwart moet nog de tweede correctie gedaan worden. Het is de bedoeling dat morgen (27/6) af te hebben en de tentamencijfers op de website te zetten.
15-06-2015 - Er is een overzicht beschikbaar van alle tot dusver bekende cijfers van de drie programmeeropdrachten van Algoritmiek. Mocht je iets tegenkomen dat niet klopt, laat dat dan even weten. Enkele opdrachten zijn later ingeleverd en nog niet nagekeken. Tevens zijn er nog enkele studenten die een of meer opdrachten moeten aanvullen. Zie ook de mededeling hieronder. Nagekeken werken zijn uiteraard bij mij terug te halen (kamer 151).
05-06-2015 - !!! Eind volgende week zal ik alle cijfers voor het programmerwerk -voor zover die bekend zijn- op deze site zetten. Studenten die nog opdrachten moeten aanvullen en nog geen contact daarover met mij hebben gehad moeten zich alsnog melden om e.e.a. te bespreken. De bedoeling is om uiterlijk 3 juli (eerder mag natuurlijk ook) alles wat aangevuld moest worden alsnog in verbeterde vorm in te leveren.
05-06-2015 - Het tentamen van augustus 2013 is ook weer bereikbaar! Met excuses voor het ongemak.
05-06-2015 - Zoals beloofd staat er nu ook een uitwerking van het hertentamen van 2014 op de site. Omdat ik het origineel niet heb kon ik niet de paar kleine onvolkomenheden verbeteren. Bij deze dus. In opgave 5 moeten de laatste twee koppelingen bij oplossing 14 resp. 15 zijn: (C&M, D&N) resp. (C&N, D&M). De bijbehorende succeswaarden kloppen wel. Verder in opgave 4c: het aantal vergelijkingen 2(n-1) is correct, mits we aannemen dat er geen short circuiting plaatsvindt. Dan worden altijd beide tests gedaan, ook al is blijkt de eerste False op te leveren. Met short circuiting wordt het aantal vergelijkingen iets lastiger te bepalen (ongeveer 3/2 n).
04-06-2015 - Het vragenuur zal plaatsvinden in zaal 174 van het Snellius.
26-05-2015 - Afgelopen vrijdag is een datum+tijd voor het vragenuur voor het tentamen afgesproken. Dit gaat plaatsvinden op vrijdag 5 juni a.s., aanvang 11:00 uur. De zaal wordt later bekendgemaakt.
21-05-2015 - Programmeeropdracht 2 is nu ook nagekeken (op een paar inzendingen na). Ze zullen na afloop van het werkcollege worden uitgedeeld. Vanaf vrijdag 22 mei zijn de nagekeken werken uiteraard ook via de docent terug te krijgen, bijvoorbeeld bij het college.
21-05-2015 - Tijdens het college van 22 mei zal een oud tentamen worden besproken. Het is zinvol om daar zelf alvast naar te kijken en wellicht zelfs te maken. Het werkcollege van 21 mei zal plaatsvinden in zaal B2. Het zal gaan over branch & bound en heaps / heapsort. Aangezien ten minste een van deze twee onderwerpen op het tentamen verschijnt is het verstandig om hiermee tijdens het werkcollege te oefenen.
21-05-2015 - Er zijn inmiddels (eindelijk) testgevallen beschikbaar. Zie bij de programmeeropdracht zelf.
18-05-2015 - Er zal a.s. donderdag 21 mei na het werkcollege, dus vanaf 15.30 uur, assistentie aanwezig zijn in de computerzalen om te helpen met opdracht 3, voor zover je daar nog niet uit bent gekomen. Maak daar gebruik van! Hetzelfde geldt voor vrijdagmiddag 22 mei.
18-05-2015 - Gezien gekregen vragen van studenten staan er in de tips-file nog twee opmerkingen over de manieren waarop je de uiteindelijke optimale oplossing moet terugvinden.
13-05-2015 - Er staat ook weer een file met een paar opmerkingen bij programmeeropdracht 3 op de site (zie verderop). Tevens is -zoals bij college reeds aangegeven- de deadline op vrijdag 22 mei gezet. Laat even weten of er nog een vragenuur gewenst is bij deze opdracht, dan kunnen we voor de donderdag nog wat regelen.
28-04-2015 - De derde programmeeropdracht (dynamisch programmeren) staat online. Enige toelichting volgt aanstaande vrijdag op college.
24-04-2015 - Bij college 9 is als voorbeeld van dynamisch programmeren het berekenen van
binomiaalcoefficienten gebruikt. Behalve in de sheets kun je daarover ook iets vinden in de tweede editie van het door ons gebruikte boek van Levitin.
Deze paragraaf is bij de overgang van de tweede editie naar de derde editie
uit het boek verdwenen. Een scan daarvan is hier
beschikbaar.
23-04-2015 - Zoals jullie weten is programmeeropdracht 1 nagekeken. Vorige week is nagekeken werk al bij college en werkcollege teruggegeven aan de aanwezigen. Als je je werk nog niet terughebt kun je dit bij de docent afhalen. De cijfers zullen overigens binnenkort ook op deze site worden geplaatst.
23-04-2015 - Er zijn enige uitwerkingen van opgaven van de werkcolleges toegevoegd.
23-04-2015 - Vragenuren voor de tweede programmeeropdracht deze week: donderdag 23 april om 15:30 uur en vrijdag 24 april om 15:30 uur. Computerzaal 302/304.
16-04-2015 - De opmerkingen en aanwijzingen bij de tweede programmeeropdracht zijn uitgebreid met enige belangrijke zaken betreffende de te schrijven backtracking-functies. Lezen dus!
02-04-2015 - Er zijn nu ook enige tips en opmerkingen bij de tweede programmeeropdracht verschenen. En alvast het volgende .... graag de programmacode t.z.t. in het verslag zetten en als geheel op papier inleveren. Net als bij Programmeermethoden dus.
26-03-2015 - De tweede programmeeropdracht (backtracking) staat online.
19-03-2015 - Het werkcollege is voortaan in zaal B2 als er opgaven op papier worden gemaakt.
17-03-2015 - Vragenuren voor de eerste programmeeropdracht deze week: donderdag 19 maart om 15:30 uur en vrijdag 20 maart om 15:30 uur. Computerzaal 306/308.
17-03-2015 - Er is een uitwerking van opgave 4 van werkcollege 3 beschikbaar. Dit was in 2011 een tentamenopgave.
06-03-2015 - De aanwijzingen bij de eerste programmeeropdracht zijn uitgebreid en de layout van de makefile verbeterd. Lees verder bij Programmeeropdrachten.
06-03-2015 - Inmiddels zijn de uitwerkingen van de opgaven van het bomenpracticum beschikbaar. Zie verderop op deze pagina.
05-03-2015 - Er zijn enige tips/aanwijzingen bij de eerste programmeeropdracht verschenen. Deze gaan voornamelijk over de opbouw van je programma (opdeling in klassen en files), zoals ook al even aan de orde is geweest aan het eind van het vierde college.
23-02-2015 - De aangepaste (en definitieve) versie van de eerste programmeeropdracht staat nu online. Toegevoegd zijn de normering en een stukje over de klasse-structuur van het programma. Verder is de vormgeving iets veranderd.
23-02-2015 - Zoals beloofd staat de eerste programmeeropdracht online. Er moet nog over een paar dingen worden overlegd met de docent van het vak in Den Haag, zoals over de normering. De versie die nu online staat is dus nog niet helemaal definitief. Inhoudelijk zal de opdracht niet veranderen. De definitieve versie zal morgenmiddag op deze site geplaatst worden.
13-02-2015 - Voor de liefhebbers: het originele artikel van Euler (in het Latijn!) over het
Koningsberger bruggenprobleem is te vinden via de Engelse Wikipedia.
10-01-2015 - Er is nog geen nieuws. Het eerste college is op vrijdag 06-02-2015.
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. Op de laatste pagina van de collegesheets staat overigens ook altijd welke stof uit het boek bij het betreffende college hoort. Op de sheets staat vaak meer informatie/voorbeelden, zoals over backtracking. Verder kan men hier de bij het
werkcollege behandelde opgaven vinden. (Let 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 |
| 6 februari |
Introductie |
college1 |
1.1, 1.4, 1.4 (t/m graafrepresentaties) |
12 februari |
opgaven1 |
| 13 februari |
Grafen en bomen |
college2 |
1.4 |
19 februari |
opgaven2 |
| 20 februari |
Toestand-actie-ruimte |
college3 |
4.5 (p. 189-192), 6.6 (p. 272-272) |
26 februari |
opgaven3 |
| 27 februari |
Complexiteit, brute force |
college4 |
2.1-3, 2.6-7 (lezen), 3 inl., 3.1-3 |
5 maart |
Eerste programmeeropdracht |
| 6 maart |
Exhaustive search, graafwandelingen, backtracking |
college5 |
3.4-5, 12 inl., 12.1 |
19 maart |
opgaven5 |
| 13 maart |
geen (werk)college |
--- |
herkansingen |
--- |
--- |
| 20 maart |
Backtracking, verdeel en heers |
college6 |
12.1, 5 inl., 5.1-2, 4 inl., 4.1 |
26 maart |
opgaven6 |
| 27 maart |
Verdeel en heers |
college7 |
4 inl., 4.1, 4.4, 5.2-5 deels |
2 april |
Tweede programmeeropdracht |
| 3 april |
Geen college |
Goede Vrijdag |
--- |
9 april |
opgaven8 |
| 10 april |
Dynamisch programmeren + restant V&H |
college8 |
ex. 4.5.12, 8 inl., 2.5 |
16 april |
Tweede programmeeropdracht |
| 17 april |
Dynamisch programmeren |
college9 |
8 inl., 8.1 (vb. 2), 8.2 |
23 april |
opgaven10 |
| 24 april |
Gretige algoritmen, algoritme van Dijkstra |
college10 |
... |
30 april |
opgaven11 |
| 1 mei |
Branch and bound |
college11 |
12.2 |
7 mei |
Derde programmeeropdracht |
| 8 mei |
Heap, heapsort |
college12 |
6.4 |
14 mei |
Hemelvaart |
| 15 mei |
Geen college |
----- |
--- |
21 mei |
opgaven13 |
| 22 mei |
Hertentamen 2014 |
hertentamen |
--- |
--- |
--- |
De tentamenstof bestaat uit: alles wat we gedurende het semester behandelen.
Dat komt in 2014/2015 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.
Tweede Werkcollege 2014/2015
Tijdens het tweede werkcollege wordt er een practicumopdracht worden gedaan in
de computerzalen.
Zet de PC eerst op Linux (UNIX).
Het skeletprogramma zoals dat moet worden gebruikt staat
hier.
Volg de volgende stappen om te beginnen:
- Maak een nieuwe directory, bijvoorbeeld "binairebomen" (Linux: mkdir binairebomen), en
ga daarheen (cd binairebomen).
- Pak het skeletprogramma uit (onder Linux kan dat bijvoorbeeld met "tar xvfz
bomenpracticum2015.tgz").
- Bekijk de file readme-linux of
readme-windows
voor de precieze bedoeling en werking van het programma
(onder Linux resp. Windows).
Het skeletprogramma bestaat uit een aantal files, waarvan je in het bestand "boom.cc"
enkele functies moet invullen. Het programma is de compileren via de bijgeleverde Makefile.
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 ongeveer regel 35
de functies gevonden worden die moeten worden aangepast.
Liefhebbers kunnen ook zelf bomen maken om uit te proberen.
Zie voor de gewenste codering van de bomen de bovengenoemde readme-files "readmelinux2015.txt"
of "readmewindows2015.txt".
Hier kun je
voorbeelduitwerkingen
vinden van het bomenpracticum. Uiteraard zijn andere oplossingen mogelijk, maar in principe lijken die allemaal op de functies uit de uitwerkingen.
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: maandag 23 maart 2015, 12:00 uur.
Enige aanwijzingen over de opbouw van je programma is te vinden in deze tips. Deze file zal indien nodig of gewenst uitgebreid worden met nieuwe tips, dus kijk af en toe of hij gewijzigd is.
- Programmeeropdracht 2 (backtracking).
Uiterste inleverdatum: dinsdag 28 april 2015, 10:00 uur.
Enige aanwijzingen over de opbouw en inhoud van je programma is te vinden in deze tips. Deze file met aanwijzingen en opmerkingen zal indien nodig of gewenst uitgebreid worden met nieuwe tips, dus kijk af en toe of hij gewijzigd is.
Voor de experimenten moet je random grafen kunnen genereren. Je kunt daarvoor gebruikmaken van dit programma, dat een random graaf met n knopen en m takken genereert. Gebruik het zoals het jou het beste uitkomt. Je kunt het programma bijvoorbeeld eenvoudig aanpassen zodat het meerdere grafen van een bepaalde grootte na elkaar genereert.
- Programmeeropdracht 3 (dynamisch programmeren).
Uiterste inleverdatum: vrijdag 22 mei 2015, 18:00 uur.
Enige aanwijzingen bij de programmeeropgave zijn te vinden in de tips. Deze file met aanwijzingen en opmerkingen zal indien nodig of gewenst uitgebreid worden met nieuwe tips, dus kijk af en toe of hij gewijzigd is. Enige
testvoorbeelden zijn hier te vinden.
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 2014/2015 vindt het tentamen plaats op dinsdag 9 juni 2015, 14:00-17:00 uur.
Op vrijdag 5 juni 2015 is er een vragenuur. Aanvang: 11:00 uur. Zaal: 174.
Het hertentamen is op donderdag 9 juli 2015, 10:00-13:00 uur.
De tentamens van en 2013 en 2014 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 31 juli 2015 - http://liacs.leidenuniv.nl/~graafjmde/ALGO/