Download de presentatie
De presentatie wordt gedownload. Even geduld aub
GepubliceerdAdriaan Christiaens Laatst gewijzigd meer dan 6 jaar geleden
1
Algoritmiek 2016 / 2017 Algoritmiek
2
Waarom dit vak? Omdat Mensen ongeduldig zijn …
Het belangrijk is dat antwoorden (van berekeningen door computers) snel / op tijd komen (en juist zijn) Dus leren we Algoritmische technieken kennen, toepassen, analyseren Belangrijke algoritmen voor centrale problemen kennen en begrijpen Algoritmiek
3
Docenten Hans Bodlaender Buys Ballotgebouw 503 030-2534409
Maandags afwezig Erik Jan van Leeuwen Werkt bij UU vanaf midden maart Algoritmiek
4
Team werkcollege en practicum
Werkcollegeleider: Tom van der Zanden Studentassistenten (werkcollege, clarifications domjudge): Gerben Aalvanger Casper Hagenaars Max Hessey Jan Posthoorn Algoritmiek
5
Onderdelen College Werkcollege Practicum Tentamens Algoritmiek
6
Onderdelen College Twee keer per week, belangrijke aanvulling op stof uit boek Powerpoints op website Werkcollege Practicum Tentamens Algoritmiek
7
Onderdelen College Werkcollege Twee keer per week: let op de tijden
Belangrijk: oefenen van stof is belangrijker dan er naar luisteren Twee keer een “autodiagnostische toets” (proeftentamen Vragen over: opgaven, practicum (maar zonder naar code te kijken) Practicum Tentamens Algoritmiek
8
Onderdelen College Werkcollege Practicum
6 opgaven met Domjudge (straks meer) Tentamens Algoritmiek
9
Onderdelen College Werkcollege Practicum Tentamens
Twee deeltentamens, elk over ongeveer helft van de stof Je mag meenemen: 4 kantjes A4 (2 vel A4 aan beide zijden beschreven, 4 vel A4 aan 1 kant beschreven, normaal lettertype, zelfgemaakt) Algoritmiek
10
Cijfer Beide deeltentamens tellen even zwaar Eindcijfer:
Hooguit 3 practicumopgaven goed: onvoldoende 4 practicumopgaven goed: gemiddeld tentamencijfer afgerond 5 practicumopgaven goed: gemiddeld tentamencijfer afgerond + 0.5 6 practicumopgaven goed: gemiddeld tentamencijfer afgerond + 1 Afronding: 5.5 gaat naar 6, 5.49 naar 5. Boven de 6 op halve punten afgerond. Algoritmiek
11
Herkansingsregeling Je kan of: 1 practicumopgave inhalen
2 practicumopgaven inhalen Hertentamen doen 1 practicumopgave inhalen en hertentamen doen Hertentamen vervangt laagste deeltentamencijfer en gaat over de hele stof Algoritmiek
12
Practicum 6 opgaven, inleveren via Domjudge
1e opgave niet triviaal, maar veel makkelijker dan de rest Latere opgaven veel moeilijker. Opgave 6 is het moeilijkst Je moet er minstens 4 halen. Let op de deadlines! Te laat is te laat… Dus: begin op tijd! Algoritmiek
13
Alleen werken Je moet de opgaven alleen maken
Er wordt gecontroleerd op fraude, en bij een vermoeden van fraude wordt de regeling van de Universiteit Utrecht gevolgd en is het eindcijfer van dit vak een 1 Je mag wel kort (1.5 minuut) met elkaar praten over het practicum, maar niet: Code of pseudocode van elkaar bekijken (of inkijken, uitwisselen, geven, in ontvangst nemen, debuggen, inleveren, etc.) Algoritmiek
14
Domjudge Je kan een opgave tot de deadline zo vaak inleveren als je wilt Tot in het redelijke… Je ingeleverde code wordt: Gecompileerd en gedraaid met een aantal geheime testinvoeren Je krijgt te horen: Code compileert niet goed Code geeft runerror Code geeft fout antwoord op testinvoer Code gebruikt te veel tijd Correct programma In het algemeen geldt: bij correct programma heb je de opgave gehaald; anders kan je je programma verbeteren en opnieuw inleveren Algoritmiek
15
Tips en hulp Test je programma ook met eigen testinvoeren en die van de website Clarifications: Vragen over je programma kan je stellen via clarificationssysteem in domjudge aan studentassistenten Verwacht niet altijd en niet direct antwoord Zorg voor leesbare code Hulp door clarifications heeft grenzen… Geen clarifications dag voor de deadline Programma te langzaam: Gebruik je het goede algoritme? Gebruik je de goede constructies uit C#? (Bijvoorbeeld: ingebouwde functies kunnen grote complexiteit hebben) Let op: Geheime inputs Tijd Algoritmiek
16
Allerlei vragen Over organisatie van vak, cijfers van tentamens, etc: docent Hans Bodlaender Over practicum (cijfers, inloggen, …): Tom van der Zanden Over inhoud: werkcollege, of docent in de pauze Algoritmiek
17
Inhoud Algoritmiek Algoritmische technieken: Dynamisch programmeren
Divide and Conquer Greedy Algorithms Randomized algorithms Analyse van algoritmen Geamortiseerde analyse (o.a. Union-Find datastructuur) NP-volledigheid Grafen en netwerken Kortste paden Opspannende bomen Stroming en snedes Algoritmiek
18
Dynamisch Programmeren I
Algoritmiek
19
Dynamisch programmeren
Een algoritmische techniek Werkt voor veel verschillende problemen Soms snel, soms langzaam Soms makkelijk, soms moeilijk Algoritme wordt gemaakt door volgen van een `stappenplan’ Het maken van een DP algoritme vereist: methodisch werken: volg de ontwerpmethode; inzicht in de structuur van het op te lossen probleem, en wat geduld en creativiteit. Algoritmiek
20
Inhoud Voorbeelden De techniek Het stappenplan
Nog meer voorbeelden, en ingewikkelder toepassingen van Dynamisch Programmeren Implementatie details Algoritmiek
21
Eerste voorbeeld Fibonaccigetallen F(0) = 0; F(1) = 1
Als i > 1, dan is F(i) = F(i – 1) + F(i – 2) Hoe reken je F(6) uit? Algoritmiek
22
Recursief Method Fibonacci (integer i) if i == 0 then return 0;
Return Fibonacci(i – 1) + Fibonacci(i – 2) Algoritmiek
23
Beter: een ‘dynamisch programma’
Method FibonacciDP (integer i) if i == 0 then return 0 if i == 1 then return 1 Maak een integer array F[0 … i] aan F[0]=0; F[1]=1; for j == 2 to i do F[j]=F[j – 1]+F[j – 2] enddo. Return F[j] Algoritmiek
24
De driehoek van Pascal 1 2 3 4 6 Function C(n,k)
if (k == 0) or (k == n) then return 1 else return C(n – 1, k – 1) + C(n – 1, k) Algoritmiek
25
Recursief of met Memorisatie?
In functionele taal als bijv. Haskell (hangt af van compiler): Iedere term C(i,j) wordt maar 1 keer uitgerekend. Kost O((n+1)(k+1)) tijd, zeg O(nk). In imperatieve taal: Verschillende termen worden vaker dan 1 keer uitgerekend Kost veel tijd: berekenen van C(n,k) kost Q(C(n,k)) tijd!! Function C(n,k) if (k == 0) or (k == n) then return 1 else return C(n – 1, k – 1) + C(n – 1, k) Even voorbeeld uitwerken op het bord. Voor het Haskell programma: iedere aanroep kost O(1) tijd als we de tijd in de recursieve aanroepen niet bij die aanroep tellen. C(i,j) wordt aangeroepen Voor alle waarden i tussen 0 en n en alle waarden j tussen 0 en k; dat zijn er dus (n+1)(k+1). Algoritmiek
26
Driehoek van Pascal Imperatief
Function C(n,k) Neem 2-dimensionaal array A(0…n, 0…k) for i=0 to n do for j=0 to min(i,k) do if (j == 0) or (j == i) then A(i,j) = 1 else A(i,j) = A(i – 1, j – 1) + A(i – 1, j) Return A(n,k) Zelfde stappen als in recursief algoritme, maar … Algoritmiek
27
Equivalent Function C(n,k) Neem 2-dimensionaal array A(0…n, 0…k)
for i=0 to n do A(i,0) = 1; for i=0 to k do A(i,i) = 1; for i=0 to n do for j=0 to min(i,k) do A(i,j) = A(i – 1, j – 1) + A(i – 1, j) Return A(n,k) Initialisatie buiten de hoofdloop gehaald: dit is net iets efficienter Algoritmiek
28
Analyse dynamisch programmeer algoritme
O(nk) tijd Kan in O(k) geheugenruimte door maar twee regels van array te gebruiken Function C1(n,k) Neem arrays A(0…k) en B(0 … k) for i=0 to n do for j=0 to min(i,k) do if (j == 0) or (j == i) then A(j) = 1 else A(j) = B( j – 1) + B(j) for j=0 to k do B(j) = A(j) Return A(k) Algoritmiek
29
1 2 3 4 6 5 10 15 20 7 21 35 Overigens: de waarde n over k kan ook in O(n) tijd worden uitgerekend door gewoon de basisformule te volgen. Dit kan wel lastiger worden als n en k relatief groot zijn, en we zonder afrondingen willen werken. Algoritmiek
30
Voorbeeld 2: Simplified Risk
Deel van spel: Twee `legers’: i rode steentjes en j blauwe steentjes. Beide spelers gooien een dobbelsteen. Als de rode speler meer dan de blauwe speler gooit, dan gaat er 1 blauw steentje weg, anders 1 rood steentje. Een speler wint als de tegenstander geen steentjes meer heeft P(i,j) is kans dat rode speler wint. P(i,j) = 15/36 * P(i,j – 1) + 21/36 * P(i – 1, j) Function P(i,j) if (i == 0) then return 0 else if (j == 0) then return 1 else return 15/36 * P(i,j – 1) + 21/36 * P(i – 1, j) Risk is a trademark of Parker Brother / Hasbro. Algoritmiek
31
Simplified Risk (2) Met Memorisatie (functioneel): snel
Recursief imperatief: Te veel tijd Function P(i,j) if (i == 0) then return 0 else if (j == 0) then return 1 else return 15/36 * P(i,j – 1) + 21/36 * P(i – 1, j) Algoritmiek
32
j: aantal steentjes blauwe speler
1 2 4 3 * 1 1 15/36 i: aantal van rode speler 85/144 2 3 4 Algoritmiek
33
Berekeningsvolgorde Function SRP(i,j) Maak 2 dim array P(0 … i,0 … j)
for r = 0 to i do for b = 0 to j do Bereken P(r,b) Return P(i,j) Algoritmiek
34
DP algoritme voor Simplified Risk
Function SRP(i,j) Maak 2 dim array P(0 … i,0 … j) for r = 0 to i do for b = 0 to j do if (r == 0) then P(r,b) = 0 else if (b == 0) then P(r,b) = 1 else P(r,b) = 15/36 * P(r,b – 1) + 21/36 * P(r – 1, b) Return P(i,j) Algoritmiek
35
Basisidee Dynamisch Programmeren
Reken iets niet voor de tweede keer uit ‘iets’: deelprobleem Twee mogelijkheden: `Klassiek’ DP: vul datastructuur met antwoorden voor deelproblemen, zodat nodige gegevens al eerder zijn berekend Memorisatie: kijk of we ‘t al eerder hebben uitgerekend – zo ja, geef dat antwoord; zo nee: reken uit en sla antwoord op in datastructuur (bijvoorbeeld array of hashtabel) Algoritmiek
36
De ontwerpmethode (1) Identificeer `deelproblemen’, waarbij helpt
Wat is de `rij van keuzes die leidt tot een oplossing’? Wat is de `top choice’ (laatste keuze)? Ontwerp een recurrente betrekking voor het probleem: druk het probleem uit in termen van (andere) deelproblemen. Geef ook basisgevallen Top choice helpt (vaak: gevalsonderscheid) Wat is de berekeningsvolgorde? (Mag geen cycle hebben…) Bereken in volgorde de waardes voor de deelproblemen. Eventueel: geheugenbesparing of constructieve versie. Algoritmiek
37
Voorbeeld 3 Gepast betalen
Stel, we hebben munten van waardes a1, … ar en we willen b betalen. Hoe kunnen we dit doen met zo min mogelijk munten? Euro’s kunnen greedy (komt later deze collegeserie), maar andere sets munten niet altijd. Greedy: geef steeds grootst mogelijke munt terug, bijv: 84: 50 (34), 20 (14), 10 (4), 2 (2), 2. Met munten van 1, 10, 25 geeft greedy niet altijd goede antwoord: Greedy geeft voor 30 cent: 25, 1, 1, 1, 1, 1 (6 munten), maar optimaal is: 10, 10, 10 (3 munten) Hier: DP algoritme voor `wisselgeld probleem’. Algoritmiek
38
Gepast betalen: probleemstelling
Gegeven: positieve gehele getallen a1, …, ar, niet negatief geheel getal b Gevraagd: op welke manier kan b verkregen worden door zo min mogelijk munten van waardes a1, …, ar ? Munten mogen ieder niet-negatief aantal keren gebruikt worden. Totale som moet b zijn. We zoeken dus x1 , … , xr in N= {0,1,…} met en zo klein mogelijk Algoritmiek
39
Rij van keuzes Hoeveel nemen we van de eerste munt?
Hoeveel nemen we van de tweede munt? … Hoeveel nemen we van de laatste munt? Oftwel: x1 , … , xr Top choice: xr Algoritmiek
40
Hoe ziet de situatie eruit als we al een aantal keuzes gemaakt hebben?
Stel we hebben al van de eerste q munten besloten hoeveel te nemen. Situatie kan je karakteriseren met: q Aantal munten tot nu toe gebruikt Totaalbedrag van de tot nu toe gebruikte munten Dus: (q, , ) Algoritmiek
41
Deelproblemen Gegeven a1, …, ar, b, schijf
W(i,c) als het minimum aantal munten Nodig om bedrag c te krijgen Als we alleen munten a1, …, ai mogen gebruiken Vb: Munten van waarden 1, 5, 8, 20 W(1,7) = 7 (we mogen alleen munt 1 gebruiken) W(2,7) = 3 (beste oplossing is 5, 1, 1) W(3,7) = W(4,7) = 3 (nog steeds) W(1,23) = 23; W(2,23) = 7; W(3,24) = 5 (met: 8,8,5,1,1); W(4,23) = 4 (met: 20,1,1,1) Algoritmiek
42
Speciale gevallen Munten met waardes 3, 5, 10, 30
W(*,0) = 0: geen munten nodig om 0 te betalen. W(4,7) = +¥ (kan niet gemaakt worden) W(0,5) = +¥ (geen munten dus kan niet gemaakt worden) Algoritmiek
43
Recurrente betrekkingen
W(i, 0) = 0 voor alle i ³ 0. W(0, y) = +¥ voor alle y > 0. Als i > 0 en y > 0 en ai > y, dan W(i, y) = W( i – 1, y) Munt ai kan niet gebruikt worden om y te betalen. Als i > 0 en y > 0 en ai £ y, dan W(i, y) = min ( W( i – 1, y) , W(i, y – ai) + 1) Munt ai kan wel gebruikt worden. Als je de munt niet gebruikt moet je y maken met de eerste i – 1 munten; anders moet je y – ai maken en nog een munt ai erbij. Bekijk beide en neem de beste (minimum). Basisgevallen Gevalsonderscheid met de top-choice Algoritmiek
44
Recursief programma Wissel( Array A, integers i, y)
If (y == 0) then return 0; If (i == 0) then return maxint; If (ai > y) then return Wissel(A, i – 1, y); Return min (Wissel(A, i – 1, y), Wissel(A,i, y – ai ) + 1) Algoritmiek
45
Voor berekeningen nodig: Element met i-1 en element met y-ai
i: munten Voor berekeningen nodig: Element met i-1 en element met y-ai y: bedrag Algoritmiek
46
Uitrekenen in volgorde
Function Wissel(A[1…r], b) Maak 2-dim array W[0…r, 0…b]. W[0,0]=0. for j=1 to b do W[0,j] = +¥. for i=1 to r do for j=0 to b do Bereken W[i,j]. Return W[r,b] Straks preciezer Algoritmiek
47
Algoritme Function WisselDP(A[1…r], b) Maak 2-dim array W[0…r, 0…b].
for j=1 to b do W[0,j] = +¥. for i=1 to r do for j=0 to b do if (A[i] > j) then W[i,j] = W[i-1,j] else W[i,j] = min (W[i-1,j],W[i,j-A[i]]+1) Return W[r,b] Algoritmiek
48
Analyse WisselDP gebruikt O(rb) tijd.
Als b niet te groot is, is dit snel. Algoritmiek
49
Niet altijd integer functies
Wisselbaar Gegeven munten met waardes a1, …, ar, kan hiermee een bedrag b betaald worden? Wisselbaar({3,5,11},6) = true Wisselbaar({3,5,11},16) = true Wisselbaar({3,5,11},7) = false Zelfde soort algoritme als voor Wissel: nu met Booleans. Algoritmiek
50
DP algoritme voor Wisselbaar probleem
Function Wisselbaar(A[1…r], b) Maak 2-dim array van Booleans W[0…r, 0…b]. W[0,0]=true. for j=1 to b do W[0,j] = false. for i=1 to r do for j=0 to b do if (A[i] > j) then W[i,j] = W[i-1,j] else W[i,j] = W[i-1,j] or W[i,j-A[i]] Return W[x,y] Algoritmiek
51
Het optimaliteitsprincipe
Dynamisch programmeren lukt vaak als: Het niet uitmaakt hoe je er gekomen bent, maar alleen waar je bent Preciezer: Als een oplossing optimaal is, dan zijn diens deeloplossingen ook optimaal. Algoritmiek
52
Uitwisselargumenten Algoritmiek
53
Wat is een goede keuze van deelproblemen
Vaak werkt dit: Hoe ziet een oplossing voor de hele input eruit? Als we naar een deel (bijv. beginstuk) van de input kijken, wat zien we dan van zo’n oplossing (definieer een notie deeloplossing) Wat is essentieel om te weten van een deeloplossing voor mogelijke uitbreiding tot een ‘hele’ oplossing? Algoritmiek
54
Eerlijke Boedelverdeling
Twee broers moeten een stel voorwerpen verdelen van waarde a1, a2, …, an. Hoe doen ze dat zo eerlijk mogelijk? (D.w.z., verdeel a1, a2, …, an in twee verzamelingen waarvan de som zo weinig mogelijk verschilt.) 1, 5, 8, 10, 11 {8, 10} en {1, 5, 11} is eerlijkste verdeling (verschil 1.) Ook wel eens: twee rovers willen een buit verdelen. Algoritmiek
55
Stappenplan voor DP Stap 1: wat is de rij van keuzes?
Voor de hand liggend: Welke broer krijgt voorwerp 1? Welke broer krijgt voorwerp 2? … Welke broer krijgt voorwerp n? Top choice: welke broer krijgt voorwerp n? Algoritmiek
56
Stappenplan voor DP Stap 3: Identificeer deelproblemen
Vaak werkt volgende strategie: Deelprobleem is: Beginstuk van gebeurtenissen of beslissingen + Situatie na een stel gebeurtenissen en beslissingen Algoritmiek
57
Boedelprobleem Stap 1 1e poging
Beslissingen: welke broer krijgt voorwerp 1; welke broer krijgt voorwerp 2; etc. Idee voor deelproblemen: Wat is de eerlijkste verdeling van de eerste i voorwerpen? Hiermee is geen DP algoritme te maken: optimaliteitsprincipe geldt niet. Voorwerpen 1, 5, 6: eerlijkste verdeling 1e twee voorwerpen zegt niets over eerlijkste verdeling alle drie voorwerpen mislukt Algoritmiek
58
Waarom werkt dit niet? Er zijn mogelijke begin-keuzes die tot een optimale oplossing leiden die niet in een deelprobleem `gevangen worden’ Voorwerpen 1, 5, 6, 10 Begin: (1 en 5, 6) is geen deel van de optimale oplossing (1 en 10, 5 en 6) Algoritmiek
59
Boedelprobleem Stap 1 Verdeel(i, c): is er een verdeling van de eerste i voorwerpen met verschil in waarde precies c? 1,5,8,10,11: Verdeel(2,4) = true Verdeel(2,5) = false Verdeel(2,6) = true (1,5 vs niets) Verdeel(3,2) = true (1,5 vs 8) Algoritmiek
60
Welke deelproblemen zijn relevant?
Algoritmiek
61
Stap 3 Ontwerp recurrente betrekking die oplossing van deelprobleem uitdrukt in oplossingen van andere deelproblemen. Verdeel(0,0) = true Voor c ¹ 0: Verdeel(0,c) = false Voor i>0: Verdeel(i,c) = Verdeel(i-1,c-ai) or Verdeel(i-1,c+ai) ide voorwerp naar 1e of 2e broer: gevalsonderscheid op de top-choice Algoritmiek
62
Stap 4 i: voorwerpen Wat is de berekeningsvolgorde?
Hier: kolomsgewijs, d.w.z, stijgend aantal voorwerpen c: verschil Algoritmiek
63
Stap 5 Bereken de deelproblemen met behulp van de recurrente betrekking in de gevonden volgorde. Bereken T = Maak array V[0…n, –T…T] for i = 0 to n do for c = -T to T do if i=0 and c=0, then V[i,c]= true else if i=0 and c ¹ 0 then V[i,c]=false else V[i,c] = V[i-1,c-ai] or V[i-1,c+ai] Nu nog het antwoord vinden… Eigenlijk fout: neem een false voor elt die niet in de array zitten Algoritmiek
64
Vervolg stap 5: Antwoord vinden: poging 1
for c = 0 to T do if V[n,c] == true then return c Dit vindt het kleinst mogelijke verschil in de waarde van de verdeling tussen de broers. Maar… nog niet de eerlijkste verdeling zelf? Hoe dat te doen is Stap 6. To be continued… Algoritmiek
65
Practicumsom 1: een variant
Aantal rijtjes van A naar B A en B getallen, en een rijtje is een rij met D’s en I’s: D: twee keer ‘t vorige getal; I: plus 1 Bijvoorbeeld: 5 met IIDI geeft 15 (6, 7, 14, 15) Practicumsom: gegeven A en B, wat is het aantal (A,B)-rijtjes. Hier: wat is het kortste (A,B)-rijtje? Algoritmiek
66
Het kortste (A,B)-rijtje
Lengte van kortste rijtje … Kortste rijtje Het kortste (A,B)-rijtje Wat is de rij keuzes? Wat is de laatste keuze? Wat zijn de deelproblemen? Recurrente betrekking Uitdrukking in kleinere deelproblemen Basisgeval(len) Berekeningsvolgorde Programma voor lengte van kortste rijtje Versie voor constructie van het kortste rijtje Algoritmiek
67
Wordt vervolgd Vinden van oplossingen in plaats van waardes van oplossingen Memorisatie Besparen van geheugenruimte Andere toepassingen van dynamisch programmeren Ingewikkelder structuren Algoritmiek
Verwante presentaties
© 2024 SlidePlayer.nl Inc.
All rights reserved.