De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

Algoritmiek 2015 / 2016 Algoritmiek1. Waarom dit vak? Omdat –Mensen ongeduldig zijn … –Het belangrijk is dat antwoorden (van berekeningen door computers)

Verwante presentaties


Presentatie over: "Algoritmiek 2015 / 2016 Algoritmiek1. Waarom dit vak? Omdat –Mensen ongeduldig zijn … –Het belangrijk is dat antwoorden (van berekeningen door computers)"— Transcript van de presentatie:

1 Algoritmiek 2015 / 2016 Algoritmiek1

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 Algoritmiek2

3 Docent en team Docent: –Hans Bodlaender Buys Ballotgebouw Maandags afwezig Werkcollegeleiders: –Tom van der Zanden (practicum) –Dirk Thierens (werkcollegeopgaven) Studentassistenten (werkcollege, clarifications domjudge): –Martijn Boom –Jan Posthoorn –Jordi Vermeulen –Richard Versteeg En Gerard Tel als gastdocent Algoritmiek3

4 Onderdelen College Werkcollege Practicum Tentamens Algoritmiek4

5 Onderdelen College –Twee keer per week, belangrijke aanvulling op stof uit boek –Powerpoints op website Werkcollege Practicum Tentamens Algoritmiek5

6 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 Algoritmiek6

7 Onderdelen College Werkcollege Practicum –6 opgaven met Domjudge (straks meer) Tentamens Algoritmiek7

8 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) Algoritmiek8

9 Cijfer Beide deeltentamens tellen even zwaar Eindcijfer: –Hooguit 3 practicumopgaven goed: onvoldoende –4 practicumopgaven goed: gemiddeld tentamencijfer afgerond –5 practicumopgaven goed: gemiddeld tentamencijfer afgerond –6 practicumopgaven goed: gemiddeld tentamencijfer afgerond + 1 Afronding: 5.5 gaat naar 6, 5.49 naar 5. Boven de 6 op halve punten afgerond. Algoritmiek9

10 Herkansingsregeling Voor details zie website Je kan 1 practicumopgave inhalen, of hertentamen doen, als je minstens een 4 of 4.5 hebt (zie website voor details) Algoritmiek10

11 Practicum 6 opgaven, inleveren via Domjudge 1e opgave niet triviaal, maar veel makkelijker dan de rest Latere opgaven veel moeilijker. Je moet er minstens 4 halen. Let op de deadlines! Te laat is te laat… Algoritmiek11

12 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 Je mag wel kort met elkaar praten over het practicum, maar niet: –Code of pseudocode van elkaar bekijken (of inkijken, uitwisselen, geven, in ontvangst nemen, debuggen, inleveren, etc.) 12Algoritmiek

13 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 Algoritmiek13

14 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 dealine Programma te langzaam: –Gebruik je het goede algoritme? –Gebruik je de goede constructies uit C#? (Bijvoorbeeld: ingebouwde functies kunnen grote complexiteit hebben) Algoritmiek14

15 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 Algoritmiek15

16 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 Algoritmiek16

17 Dynamisch Programmeren I Algoritmiek

18 18 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’

19 Algoritmiek19 Inhoud Voorbeelden De techniek –Het stappenplan Nog meer voorbeelden, en ingewikkelder toepassingen van Dynamisch Programmeren Implementatie details

20 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? Algoritmiek20

21 Recursief Method Fibonacci (integer i) –If i == 0 then return 0 –If i == 1 then return 1 –Return Fibonacci(i – 1) + Fibonacci(i – 2) Algoritmiek21

22 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] Algoritmiek22

23 Algoritmiek23 De driehoek van Pascal Function C(n,k) If (k == 0) or (k == n) Then return 1 Else return C(n – 1, k – 1) + C(n – 1, k)

24 Algoritmiek24 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  (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) Function C(n,k) If (k == 0) or (k == n) Then return 1 Else return C(n – 1, k – 1) + C(n – 1, k)

25 Algoritmiek25 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 …

26 Algoritmiek26 Initialisatie buiten de hoofdloop gehaald: dit is net iets efficienter 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)

27 Algoritmiek27 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(n,k)

28 Algoritmiek

29 Algoritmiek29 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)

30 Algoritmiek30 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)

31 Algoritmiek31 * j: aantal steentjes blauwe speler i: aantal van rode speler /36 85/144

32 Algoritmiek32 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)

33 Algoritmiek33 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)

34 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) Algoritmiek34

35 Algoritmiek35 De ontwerpmethode (1) 1.Identificeer `deelproblemen’. 2.Ontwerp een recurrente betrekking voor het probleem: druk het probleem uit in termen van (andere) deelproblemen. –Geef ook basisgevallen 3.Wat is de berekeningsvolgorde? (Mag geen cycle hebben…) 4.Bereken in volgorde de waardes voor de deelproblemen. 5.Eventueel: geheugenbesparing of constructieve versie.

36 Algoritmiek36 Voorbeeld 3 Gepast betalen Stel, we hebben munten van waardes a 1, … a r 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’.

37 Algoritmiek37 Gepast betalen: probleemstelling Gegeven: positieve gehele getallen a 1, …, a r, niet negatief geheel getal b Gevraagd: op welke manier kan b verkregen worden door zo min mogelijk munten van waardes a 1, …, a r ? –Munten mogen ieder niet-negatief aantal keren gebruikt worden. –Totale som moet b zijn. –We zoeken dus x 1, …, x r in N= {0,1,…} met enzo klein mogelijk

38 Algoritmiek38 Deelproblemen Gegeven a 1, …, a r, b, schijf –W(i,c) als het minimum aantal munten Nodig om bedrag c te krijgen Als we alleen munten a 1, …, a i 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)

39 Algoritmiek39 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)

40 Algoritmiek40 Recurrente betrekkingen W(x, 0) = 0 voor alle x  0. W(0, x) = +  voor alle x > 0. Als x > 0 en y > 0 en a x > y, dan W(x, y) = W( x – 1, y) –Munt a x kan niet gebruikt worden om y te betalen) Als x > 0 en y > 0 en a x  y, dan W(x, y) = min ( W( x – 1, y), W(x, y – a x ) + 1) –Munt a x kan wel gebruikt worden. Als je de munt niet gebruikt moet je y maken met de eerste x-1 munten; anders moet je y – a x maken en nog een munt a x erbij. Bekijk beide en neem de beste (minimum). Basisgevallen

41 Algoritmiek41 Recursief programma Wissel( Array A, integers x, y) If (y == 0) then return 0; If (x == 0) then return maxint; If (a x > y) then return Wissel(A, x – 1, y); Return min (Wissel(A, x – 1, y), Wissel(A,x, y – a x ) + 1)

42 Algoritmiek42 Voor berekeningen nodig: Element met i-1 en element met j-a i i: munten j: bedrag

43 Algoritmiek43 Uitrekenen in volgorde Function Wissel(A[1…x], y) Maak 2-dim array W[0…x, 0…y]. W[0,0]=0. For j=1 to y do W[0,j] = +  For i=1 to x do For j=0 to y do Bereken W[i,j]. Return W[x,y] Straks preciezer

44 Algoritmiek44 Algoritme Function WisselDP(A[1…x], y) Maak 2-dim array W[0…x, 0…y]. W[0,0]=0. For j=1 to y do W[0,j] = +  For i=1 to x do For j=0 to y 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[x,y]

45 Algoritmiek45 Analyse WisselDP gebruikt O(x y) tijd. Als y niet te groot is, is dit snel.

46 Algoritmiek46 Niet altijd integer functies Wisselbaar –Gegeven munten met waardes a 1, …, a r, 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.

47 Algoritmiek47 DP algoritme voor Wisselbaar probleem Function Wisselbaar(A[1…x], y) Maak 2-dim array van Booleans W[0…x, 0…y]. W[0,0]=true. For j=1 to y do W[0,j] = false  For i=1 to x do For j=0 to y 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]

48 Algoritmiek48 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.

49 Uitwisselargumenten Algoritmiek49

50 Wat is een goede keuze van deelproblemen Vaak werkt dit: 1.Hoe ziet een oplossing voor de hele input eruit? 2.Als we naar een deel (bijv. beginstuk) van de input kijken, wat zien we dan van zo’n oplossing (definieer een notie deeloplossing) 3.Wat is essentieel om te weten van een deeloplossing voor mogelijke uitbreiding tot een ‘hele’ oplossing? Algoritmiek50

51 Algoritmiek51 Twee broers moeten een stel voorwerpen verdelen van waarde a 1, a 2, …, a n. Hoe doen ze dat zo eerlijk mogelijk? (D.w.z., verdeel a 1, a 2, …, a n 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.) Eerlijke Boedelverdeling

52 Algoritmiek52 Stappenplan voor DP Stap 1: Identificeer deelproblemen –Vaak werkt volgende strategie: Welke rij gebeurtenissen of beslissingen is er? Deelprobleem is: –Beginstuk van gebeurtenissen of beslissingen + –Situatie na een stel gebeurtenissen en beslissingen

53 Algoritmiek53 Boedelprobleem Stap 1 1 e 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 1 e twee voorwerpen zegt niets over eerlijkste verdeling alle drie voorwerpen mislukt

54 Algoritmiek54 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)

55 Algoritmiek55 Welke deelproblemen zijn relevant?

56 Algoritmiek56 Stap 2 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-a i ) or Verdeel(i-1,c+a i ) –i de voorwerp naar 1e of 2e broer

57 Algoritmiek57 Stap 3 Wat is de berekeningsvolgorde? Hier: kolomsgewijs, d.w.z, stijgend aantal voorwerpen i: voorwerpen c: verschil

58 Algoritmiek58 Stap 4 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-a i ] or V[i-1,c+a i ] Nu nog het antwoord vinden… Eigenlijk fout: neem een false voor elt die niet in de array zitten

59 Algoritmiek59 Vervolg stap 4: 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 5.

60 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? Algoritmiek60

61 Het kortste (A,B)-rijtje 1.Wat zijn de deelproblemen? 2.Recurrente betrekking a)Uitdrukking in kleinere deelproblemen b)Basisgeval(len) 3.Berekeningsvolgorde 4.Programma voor lengte van kortste rijtje 5.Versie voor constructie van het kortste rijtje Algoritmiek61 Lengte van kortste rijtje … Kortste rijtje Lengte van kortste rijtje … Kortste rijtje

62 Algoritmiek62 Wordt vervolgd Vinden van oplossingen in plaats van waardes van oplossingen Memorisatie Besparen van geheugenruimte Andere toepassingen van dynamisch programmeren –Ingewikkelder structuren


Download ppt "Algoritmiek 2015 / 2016 Algoritmiek1. Waarom dit vak? Omdat –Mensen ongeduldig zijn … –Het belangrijk is dat antwoorden (van berekeningen door computers)"

Verwante presentaties


Ads door Google