Greedy algoritmes Algoritmiek
Algoritmische technieken Trucs, methoden, paradigma s voor het ontwerpen van algoritmen Dynamisch Programmeren Divide & Conquer Greedy 2
Greedy algoritme Bouwt de oplossing incrementeel op Kiest best uitziende / meest veelbelovende / grootste winst gevende stap om deeloplossing uit te breiden Telkens dus maar 1 keuze Heeft nooit twijfel over eerdere beslissingen Neemt veel risico! Wat als je keuze fout is? 3
Voorbeeld: A2B Gegeven getallen 2 A < B Je mag A met 1 verhogen (I) Je mag A verdubbelen (D) Vind het kortste rijtje I s en D s om A in B te veranderen DP gezien in eerdere college 4
Sneller met greedy Analyseer het optimale rijtje: wat is de laatste keuze? I of D? Als B oneven is, dan is laatste een I Als 2A > B, dan is laatste een I Anders, B is even en B 2A, dan is laatste een D Moeten we wel bewijzen! 5
Sneller met greedy Lemma: Als B is even en B 2A, dan eindigt een kortste rijtje op D Stel een kortste rijtje eindigt niet op D Geval 1: alleen maar I in het rijtje: I B-A Dan is I B/2-A D korter Geval 2: wel een D: DI r r is even, vanwege de D. Dan is I r/2 D korter Kortste rijtje eindigt op D 6
Sneller met greedy Als B oneven is, dan is laatste een I Als B < 2A, dan is laatste een I Anders, B is even en B 2A, dan is laatste een D 7
Greedy strategie A2Bgreedy(A,B) Initialiseer stack S while B!= A do if B oneven of B < 2A then S.push(I); B -= 1; else S.push(D); B /= 2; while not S.empty() do write(s.pop()); O(n) tijd O(grootte uitvoer) tijd! 8
Idee van greedy Slimme keuze van het volgende element in je oplossing Laat zien dat dit optimaliteit niet verstoord! Greedy choice property Eis bewijs! Ga direct de kant op van je optimale keuze Twijfel niet! 9
DP vs greedy Dynamisch programma Deelprobleem met zelfde structuur als originele probleem Bekijk alle keuzes Bewijs optimaliteit van deelproblemen en oplossingen Greedy algoritme Deelprobleem met zelfde structuur als originele probleem Bekijk één keuze Bewijs optimaliteit van keuze Vaak sneller 10
Hoe bewijs je optimaliteit? Bewijs van greedy choice property 1. Voor het optimum uitblijven Voorbeeld: pannenkoekenfeest! 2. Uitwisselen met het optimum Voorbeeld: A2B Voorbeeld: inleveropdrachten 11
Pannenkoekenfeest! 12
Pannenkoekenfeest! n opdrachten voor kinderfeestjes Opdracht i heeft begintijd s(i), eindtijd e(i) Vaste prijs van 100 euro per feestje Welke opdrachten neem je aan voor grootste mogelijke verdienste? Zoveel mogelijk opdrachten aannemen 13
14
15
Wat is je topkeuze? 16
First2Finish strategie Kies het feestje dat als eerste eindigt while er is een feestje Kies feestje dat als eerste eindigt Verwijder alle feestjes met een conflicterende tijd O(n log n) tijd 17
First2Finish strategie Kies het feestje dat als eerste eindigt! Waarom optimaal? We doen het telkens beter dan het optimum Vergelijk optimum O en greedy oplossing G Elementen O 1 O k en G 1... G k Geordend op (oplopende) eindtijd Lemma: e(g i ) e(o i ) voor iedere i m 18
Bewijs lemma O 1 O k en G 1... G m geordend op eindtijd Lemma: e(g i ) e(o i ) voor iedere i m Bewijs: Gebruik inductie! O i-1 O i Basis: i = 1: correct per definitie G i-1 keuze Stap: Er geldt e(g j ) e(o j ) voor iedere j<i O i kan na O i-1 en G i-1, want e(g i-1 ) e(o i-1 ) Greedy keuze eindigt niet later dan O i 19
Bewijs O 1 O k en G 1... G m geordend op eindtijd Lemma: e(g i ) e(o i ) voor iedere i m Stel dat G < O, d.w.z. m < k Dan geldt e(g m ) e(o m ) Omdat O 1... O k geordend is op eindtijd, kan O m+1 nog achter G m aan Tegenspraak, dus G = O G m O m O m+1 20
Uitbreidingen Verschillende opbrengst per feestje Online algoritmes Je weet niet alle feestjes van tevoren, opdrachten worden langzaam bekend Online scheduling: groot vakgebied 21
Inleveropdrachten n inleveropdrachten Opdracht i heeft deadline d i, vereist w i uur werk Als je opdracht i op tijd s(i) begint, dan is het klaar op tijd s(i) + w i Dat is L i = max {0, s(i) + w i d i } te laat Minimaliseer max { L i }: niet te laat zijn! 22
Voorbeeld Opdracht 1 2 3 Deadline 2 2 4 Werk 1 2 2 Optimaal 1 2 3 4 5 1 2 3 Max 1 uur te laat 3 2 1 Max 3 uur te laat 23
Wat is je topkeuze? Opdracht 1 2 3 Deadline 2 2 4 Werk 1 2 2 Optimaal 1 2 3 4 5 1 2 3 Max 1 uur te laat 3 2 1 Max 3 uur te laat 24
Vroegste deadline Doe opdracht met vroegste deadline eerst! while we een opdracht kunnen uitvoeren do voer opdracht uit met vroegste deadline Looptijd: O(n log n) 25
Uitwisselargument Pas optimum aan zodat het doet wat greedy zou doen Bewijs dat dit zonder verlies van optimaliteit kan Bij A2B zagen we dit al B is even en B 2A, dan is laatste een D Lieten zien dat we optimum konden aanpassen 26
Vroegste deadline Doe opdracht met vroegste deadline eerst! while we een opdracht kunnen uitvoeren do voer opdracht uit met vroegste deadline Looptijd: O(n log n) 27
Vroegste deadline Schema is een functie s die zegt, begin opdracht i op tijd s(i) Bewering: alle schema s die vroegste deadline eerst gebruiken zijn even laat Bewijs: Merk op: er wordt altijd gewerkt We zijn alleen geïnteresseerd in de onderlinge volgorde van opdrachten met dezelfde deadline 28
Vroegste deadline Bewering: alle schema s die vroegste deadline eerst gebruiken zijn even laat Bewijs: Merk op: er wordt altijd gewerkt We kijken alleen naar onderlinge volgorde van opdrachten met dezelfde deadline De laatheid wordt bepaald door de eindtijd van laatste opdracht, maar die is altijd hetzelfde, onafhankelijk van die volgorde 29
Vroegste deadline Bewering: alle schema s die vroegste deadline eerst gebruiken zijn even laat Het volstaat dus te bewijzen dat er een optimale oplossing bestaat die het principe vroegste deadline eerst gebruikt Dan is greedy net zo goed met gebruik van de bewering 30
Opdracht uitwisselen Schema is een functie s die zegt, begin opdracht i op tijd s(i) De foutenlast is aantal opdrachten i,j waarvoor s(i) < s(j) maar niet d(i) d(j) `vroegste deadline eerst schema heeft last 0 O 1 2 3 D 2 2 4 1 2 3 Last = 0 W 1 2 2 3 2 1 Last = 2 31
Opdracht uitwisselen De foutenlast is aantal opdrachten i,j waarvoor s(i) < s(j) maar niet d(i) d(j) `vroegste deadline eerst schema heeft last 0 Schema met last 0 volgt principe `vroegste deadline eerst Maar heeft optimum foutenlast 0? 3 2 1 32
Opdracht uitwisselen De foutenlast is aantal opdrachten i,j waarvoor s(i) < s(j) maar niet d(i) d(j) Kies O als een optimale oplossing met kleinste foutenlast Als foutenlast 0 is, dan is greedy optimaal Stel dus dat foutenlast groter dan 0 is 3 2 1 33
Opdracht uitwisselen O heeft foutenlast groter dan 0 Observeer: er zijn opeenvolgende opdrachten a,b gepland die fout zijn (dwz niet d(a) d(b)) Ga van links naar rechts tot je de fout vindt Observeer 2: als we a en b omwisselen, dan neemt de foutenlast af a en b staan nu goed; rest is onveranderd 34 309 a b 45 34
Opdracht uitwisselen O heeft foutenlast groter dan 0 Observeer: er zijn opeenvolgende opdrachten a,b gepland die fout zijn (dwz niet d(a) d(b)) Ga van links naar rechts tot je de fout vindt Observeer 2: als we a en b omwisselen, dan neemt de foutenlast af a en b staan nu goed; rest is onveranderd 34 309 b a 45 35
Opdracht uitwisselen Opeenvolgende a,b zijn fout: niet d(a) d(b) Bewering: als we a en b omwisselen, dan zijn we niet later dan we al waren b is niet later dan voorheen J 34 34 309 3 2 a 1 b 45 309 b a 45 36
Opdracht uitwisselen Opeenvolgende a,b zijn fout: niet d(a) d(b) Bewering: als we a en b omwisselen, dan zijn we niet later dan we al waren a eindigt nu op tijd wanneer b eerst eindigde d(b) < d(a), dus dat is minder erg J 34 34 309 3 2 a 1 b 45 309 b a 45 37
Opdracht uitwisselen Opeenvolgende a,b zijn fout: niet d(a) d(b) Bewering: als we a en b omwisselen, dan zijn [oude eindtijd b] d a < we niet later dan we al waren a eindigt nu op tijd wanneer b eerst eindigde d(b) < d(a), dus dat is minder erg J [nieuwe laatheid a] = [nieuwe eindtijd a] d a = [oude eindtijd b] d b = [oude laatheid b] 34 34 309 3 2 a 1 b 45 309 b a 45 38
Opdracht uitwisselen O is opt. oplossing met kleinste foutenlast > 0 Opeenvolgende a,b zijn fout: niet d(a) d(b) Bewering: als we a en b omwisselen, dan zijn we niet later dan we al waren Observeer 2: én de foutenlast neemt strict af We vinden een opl. met kleinere foutenlast Optimum heeft geen foutenlast, dus greedy is optimaal 39
Vroegste deadline Doe opdracht met vroegste deadline eerst! Door een uitwisselargument konden we aantonen dat er een optimale oplossing is die ook vroegste deadline eerst gebruikt 40
Huffman codes Stel we hebben een tekst die we willen coderen als bitstring Sommige letters komen veel vaker voor dan andere Besparen in lengte door: Slim codes (in {0,1}*) toewijzen aan letters Niet elke letter hoeft een code die even lang is 41 Algoritmiek
Voorbeeld abcaaaacabaabaaabaaaac a komt vaak voor, b en c weinig dus: a wordt 0 b wordt 10 c wordt 11 01011000011010001000010000011 42 Algoritmiek
Voorbeeld abcaaaacabaabaaabaaaac a komt vaak voor, b en c weinig dus: a wordt 0 b wordt 10 c wordt 11 01011000011010001000010000011 Waarom niet als code a: 0 b: 00 c:01? 43 Algoritmiek
Huffman code Beeld elke letter a af op een bitstring m(a) Geen enkel symbool heeft een code die een prefix (beginstuk) is van de code van een ander symbool (prefix vrij) 44 Algoritmiek
Prefix-vrije codes te representeren als boom 0 1 0 1 0 1 c d 0 1 b c: 00 d: 01 a: 100 e: 101 b: 11 a e 45 Algoritmiek
Kosten Elk symbool a heeft frequentie f(a) Voor prefix-vrij mapping m: kosten zijn f(a)* m(a) (.. geeft lengte van string) Totale kosten: som van alle a in alphabet van f(a)* m(a) Minimaliseer de totale kosten 46 Algoritmiek
Broerbladen Als we 1 of 2 symbolen hebben: triviaal Als we minstens 3 symbolen hebben: er zijn twee broer-bladen : We kunnen zien welke symbolen we het liefst als broerbladen zien nl.: de twee symbolen met de laagste frequentie 0 1?? 47 Algoritmiek
Lemma Stel a en b zijn de twee symbolen met de laagste frequentie. Er is een boom waar a en b bladen zijn die dezelfde ouder hebben (broerbladen zijn). Bewijs: Kijk naar een blad met grootste diepte. Die heeft een broer (anders kan je de ouder weglaten, en betere Huffman-code krijgen). Verwissel a en b met symbolen in die bladeren: de kosten kunnen gelijk blijven of dalen. 48 Algoritmiek
Simplificatie-stap Stel a en b zijn symbolen met de laagste frequentie. Verander alfabet: Laat a en b weg Neem nieuw symbool, zeg c, met frequentie f(a) +f(b) Bewering: de minimale kosten van een Huffman-boom voor het nieuwe alfabet is gelijk aan de minimale kosten van een Huffman-boom voor het oude alfabet 49 Algoritmiek
Bewijs simplificatiestap Bewering: de minimale kosten van een Huffmanboom voor het nieuwe alfabet + f(a)+f(b) is gelijk aan de minimale kosten van een Huffman-boom voor het oude alfabet => Neem een boom voor het nieuwe alfabet. Waar c stond, neem nu een deelboompje als volgt c 0 1 Kosten stijgen precies met f(a)+f(b) a b 50 Algoritmiek
Bewijs vervolg Bewering: de minimale kosten van een Huffman-boom voor het nieuwe alfabet + f(a) +f(b) is gelijk aan de minimale kosten van een Huffman-boom voor het oude alfabet <= We weten: er is een boom waar a en b broederbladen zijn. Vervang het gedeelte van a en b en hun ouder door een knoop voor c 51 0 1 a b Algoritmiek c Kosten dalen precies met f(a)+f(b)
Algoritme Herhaal tot we 1 symbool over hebben: Zoek de twee symbolen met laagste frequentie, zeg a i en a j. Kies een nieuw symbool a r Haal a i en a j uit alphabet, voeg a r toe met f(a r ) = f(a i )+f(a j ) Zet het triple (i,j,r) op een stack S Maak een boom met 1 knoop van het resulterende symbool Herhaal tot S leeg is: (i,j,r) = Pop(S); Vervang het symbool a r in de boom door een knoop met kinderen a i en a j 52 Algoritmiek
Voorbeeld op bord Letter a b c d e f Freq % 45 13 12 16 9 5 53 Algoritmiek
Huffman Algoritme is correct: gebruikt greedy / simplificatie Hoeveel tijd: met bijv. een heap kan dit in O(n log n) tijd als we n symbolen hebben in het alfabet 54 Algoritmiek
Conclusies Greedy geeft soms handige snelle algoritmen Bewijs nodig voor optimaliteit Greedy choice property Greedy levert soms geen optimale oplossing, maar wel vaak een heuristiek Soms zelfs met bewijsbare kwaliteit 55 Algoritmiek
Ingredienten voor greedy algoritme Werkt voor optimaliseringsprobleem. Een doelfunctie (objective function) geeft elke oplossing een waarde; we zoeken een oplossing met beste (kleinste/grootste) waarde De oplossingsverzameling wordt incrementeel opgebouwd Functie solution test of de oplossingsverzameling een oplossing is Functie feasible (doenbaar / mogelijk) test of een element aan de oplossingsverzameling toegevoegd kan worden Vaak gebruikt om ondoenbare elementen al te verwijderen Een functie select selecteert het meest veelbelovende element. 56 Algoritmiek