Gerandomiseerde algoritmes Dat was random… Algoritmiek
Gerandomiseerde algoritmes Gebruiken getallen uit toevalsgeneratoren De toevalsgetallen sturen twee dingen: hoe lang het algoritme zoekt in welk deel van de oplossingsruimte het algoritme zoekt Algoritmiek
Waarom randomiseren? Probleem snel(ler) oplossen Vaak zijn gerandom. algoritmes sneller dan niet-gerandom. algoritmes Een goede benadering van het optimum te vinden Het juiste antwoord te vinden Dit alles met een zekere kans natuurlijk Algoritmiek
Oppervlakteberekening (anti-aliasing of image-scaling) Hoe kan je de oppervlakte van het groene gebied berekenen? Vorig jaar had ik dit een kwart slag gedraaid. Toen leek ‘t een beetje op een konijntje. Algoritmiek
Oppervlakteberekening (anti-aliasing of image-scaling) 11/30 Kies n keer een willekeurig punt in het gebied van het vierkant. Tel hoe vaak (zeg m) keer zo’n punt in het groene gebied valt. Geschatte oppervlakte: m/n * oppervlakte vierkant. Maar ‘t is te gemeen om met hagel op een konijntje te schieten… Algoritmiek
Eigenschappen 11/30 Hoe meer punten, hoe kleiner de kans je ver van het juiste antwoord af zit. Implementatie makkelijk Wel nodig: snelle test of gegeven punt in ‘t gebied zit. Er zijn snellere en (vaak) betrouwbaardere methoden, maar … geen simpelere. Algoritmiek
Gerandomiseerde algoritmes Twee dingen zijn belangrijk bij randomisatie: Wat is de kans dat het algoritme een (in)correct antwoord geeft? Wat is de (verwachte) looptijd van het algoritme? Algoritmiek
Las Vegas algoritme Geeft altijd een correct ja/nee antwoord of oplossing Verwachte looptijd is eindig/beperkt Intuïtie: we gokken met hoeveel rekentijd we gebruiken, maar niet met het antwoord Algoritmiek
Monte Carlo algoritme Geeft niet altijd een correct antwoord Eenzijdige fout of tweezijdige fout Wel grote kans op goed antwoord Worst-case looptijd is eindig/beperkt Intuïtie: we gokken met het antwoord, maar niet met hoeveel looptijd wel nodig hebben Algoritmiek
Voorbeeld: meerderheid Algoritmiek
Meerderheid 1 Gegeven een array A met n elementen Tenminste de helft van alle elementen in A is hetzelfde element a, en alle andere elementen zijn verschillend Wat is a? 1 2 5 6 Algoritmiek
Meerderheid 1: deterministisch O(n) tijd: loop array door totdat twee gelijke elementen gevonden zijn Dit algoritme kost W(n) tijd als eerste n/2 elementen die je bekijkt allemaal verschillend zijn Randomisatie: O(1) verwachte tijd Algoritmiek
Meerderheid 1: Las Vegas do kies i≠j uniform at random uit {1,…,n} while A[i] ≠ A[j] return A[i] Er zijn juiste i,j maar wanneer vinden we die? Kans op succes in één ronde: ~1/4 (½n/n)*((½n-1)/n-1) Verwacht aantal rondes tot succes: 4 (Bernoulli) Verwachte looptijd: O(1) Met kans 0 stopt ie niet Algoritmiek
Las Vegas algoritme Geeft altijd een correct ja/nee antwoord of oplossing Verwachte looptijd is eindig/beperkt O(1) hier Intuïtie: we gokken met hoeveel rekentijd we gebruiken, maar niet met het antwoord Algoritmiek
Meerderheid 2 Gegeven een array A met n elementen Deze array is van één van twee types: tenminste de helft van alle elementen in A is hetzelfde, en alle andere elementen zijn verschillend alle elementen zijn verschillend 1 2 5 6 1 2 3 5 4 6 Algoritmiek
Meerderheid 2: deterministisch O(n) tijd: loop array door totdat twee gelijke elementen gevonden zijn of niet Dit algoritme kost W(n) tijd als eerste n/2 elementen die je bekijkt allemaal verschillend zijn Algoritmiek
Meerderheid 2: Monte Carlo kies i≠j uniform at random uit {1,…,n} if A[i] = A[j] return “type 1” else return “type 2” Als input “type 2”, uitvoer correct Als input “type 1”, uitvoer misschien fout Wat is de kans? Correct: kans ~1/4 Incorrect: kans ~3/4 Looptijd: O(1) Algoritmiek
Monte Carlo algoritme Geeft niet altijd een correct antwoord Eenzijdige fout of tweezijdige fout Hier: eenzijdige fout-kans van ≤ 3/4 Wel grote kans op goed antwoord Worst-case looptijd is eindig/beperkt Hier: O(1) Intuïtie: we gokken met het antwoord, maar niet met hoeveel looptijd wel nodig hebben Algoritmiek
Las Vegas Selecteren Algoritmiek
Selectie probleem Gegeven array A met n verschillende getallen Wat is het k-de kleinste element? Hoe snel deterministisch? Deterministisch: O(kn) of O(n log n) k keer grootste element vinden of eerst sorteren k=2 2 k=4 4 1 2 3 5 4 6 Algoritmiek
Selectie: algoritme Algoritme: SplitSelectie(A, k) Kies een element a uit A Splits A in A<a (getallen in A < a) en A>a (getallen in A > a) if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k - |A<a| - 1) Algoritmiek
Selectie: algoritme SplitSelectie(A, k) Kies een element a uit A Splits A in A<a en A>a if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k-|A<a|-1) Dit algoritme geeft altijd het juiste antwoord, ongeacht hoe we a kiezen Bij k = 1 idd het kleinste getal in A Looptijd: T(n) ≤ cn + T(…) Hangt af van a Algoritmiek
Selectie: algoritme Looptijd: T(n) ≤ cn + T(…) a is mediaan van A SplitSelectie(A, k) Kies een element a uit A Splits A in A<a en A>a if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k-|A<a|-1) Looptijd: T(n) ≤ cn + T(…) a is mediaan van A T(n) ≤ cn + T(n/2) Dan T(n) ≤ 2cn a deelt A op stukken van grootte ≥ 𝛜 n T(n) ≤ cn + T((1-𝛜)n) T(n) ≤ cn/𝛜 Algoritmiek
Selectie: algoritme Looptijd: T(n) ≤ cn + T(…) SplitSelectie(A, k) Kies een element a uit A Splits A in A<a en A>a if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k-|A<a|-1) Looptijd: T(n) ≤ cn + T(…) Hoe weten we welke a goed is? Kies a uniform at random! Algoritmiek
Selectie: algoritme Las Vegas! Geeft altijd correct antwoord SplitSelectie(A, k) Kies random element a uit A Splits A in A<a en A>a if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k-|A<a|-1) Las Vegas! Geeft altijd correct antwoord Looptijd: T(n) ≤ cn + T(…) ?? Doel/hoop: a ligt dicht genoeg bij mediaan in buurt Algoritmiek
Selectie: algoritme Kijk naar A<a en A>a SplitSelectie(A, k) Kies random element a uit A Splits A in A<a en A>a if |A<a| = k-1 then return a elseif |A<a| ≥ k then return SplitSelectie(A<a, k) else return SplitSelectie(A>a, k-|A<a|-1) Kijk naar A<a en A>a a is goed als |A<a| en |A>a| beide ≥ n/4, dus beide ≤ 3n/4 Wat is de kans dat a goed is? 1/2 Verwachting: 2 keer a kiezen voor goede keus Algoritmiek
Looptijd in fases Algoritme is in fase j als de grootte van A tussen (3/4)j n en (3/4)j+1 n is Hoeveel rekenstappen zetten we naar verwachting in fase j? Iedere recursieve aanroep: ≤ c (3/4)j n Naar verwachting ≤ 2 recursieve aanroepen in fase j Dus ≤ 2 c (3/4)j n Algoritmiek
Verwachte looptijd Verwachte looptijd is som van looptijden in fase j voor alle j Σj 2 c (3/4)j n ≤ 8 cn = O(n) Algoritmiek
Verdieping Er is ook een deterministische manier om selectie in O(n) tijd te doen (zie boek) Selectie lijkt op Quicksort. Wat te denken van Quicksort met random gekozen ‘pivot’? Verwachte looptijd: O(n log n) Idee vrijwel hetzelfde, zie boek Algoritmiek
Snijden met monte carlo Algoritmiek
Minimum Snede Gegeven graaf G=(V,E), een snede is een partitie (A,B) van V De grootte van de snede is het aantal kanten met 1 einde in A en andere in B Probleem: vind een snede van minimum grootte A B Grootte = 4 Algoritmiek
Hoe bereken ik een snede? Partitie (A,B) van V zdd aantal kanten met 1 einde in A en 1 einde van B zo klein mogelijk is O(n+a), want minimum snede heeft grootte gelijk aan minimum graad O(n3) d.m.v. Floyd-Warshall algoritme O(n2a) met slim gebruik Ford-Fulkerson algoritme NP-volledig A B Grootte = 4 Algoritmiek
Snede berekenen Stelling: Minimum Snede kan berekend worden in O(n2a) tijd Bewijs: Stel (A,B) is minimum snede Kies s een willekeurige knoop (zeg in A) en t een willekeurige knoop aan de andere kant (zeg B) Dan is de grootte van (A,B) gelijk aan de grootte van een minimum s,t-snede Probeer voor vaste s alle mogelijkheden voor t en bereken een minimum s,t-snede met Ford-Fulkerson in O(na) tijd (max stroming is hoogstens n, waarom?) Geef de kleinst gevonden snede terug Algoritmiek
Minimum snede: sneller? Kan dit sneller? Ja veel sneller Sneller dan maximum stroming vinden Gebruik geen maximum stromingsalgoritme Nog slimmer idee: randomisatie! Algoritmiek
Multigrafen We werken met multigrafen Meerdere kanten tussen zelfde paar knopen toegestaan Maar geen self-loop (kant tussen zelfde knoop) Contractie van kant e = (u,v): gooi kanten {u,v} weg en verenig u en v Algoritmiek
Contractie Contractie van kant e = (u,v): gooi kanten {u,v} weg en verenig u en v Superknoop w. Met S(w) geven we de verzameling knopen aan die door w opgegeten is In dit geval: S(w) = {u,v} x a x a w u v y b y b Algoritmiek
Contractie-algoritme Laat (A,B) een minimum snede zijn en e = (u,v) Idee: als u,v beide in A of beide in B, dan veranderd de grootte van de minimum snede niet na contractie van e u A B v Algoritmiek
Contractie-algoritme Laat (A,B) een minimum snede zijn en e = (u,v) Idee: als u,v beide in A of beide in B, dan veranderd de grootte van de minimum snede niet na contractie van e Dus contraheer een kant en hoop op goede afloop A B w Algoritmiek
Afloop contractie algoritme Lemma: Als G verbonden is en (A,B) een minimum snede is, dan is zowel deelgraaf A als deelgraaf B verbonden A B Algoritmiek
Afloop contractie algoritme Lemma: Als G verbonden is en (A,B) een minimum snede is, dan is zowel deelgraaf A als deelgraaf B verbonden Bewijs: anders kan ik een component van A naar B verplaatsen (of visa versa) A B Algoritmiek
Afloop contractie algoritme Lemma: Als G verbonden is, deelgraaf A is verbonden, en beide eindpunten van kant e liggen in A, dan zijn G en A na contractie van e ook verbonden Bewijs: ieder pad tussen twee knopen dat de kant e gebruikte, kan nu via de superknoop lopen Algoritmiek
Afloop contractie algoritme Lemma: Stel (A,B) is een minimum snede van een verbonden graaf. Dan bestaat er een serie kanten zdd dat het contraheren van deze serie kanten leidt tot een graaf met twee knopen x, y met S(x) = A en S(y) = B Bewijs: contraheer de kanten in deelgraaf A (die verbonden is) en contraheer daarna de kanten in deelgraaf B (die verbonden is) Algoritmiek
Afloop contractie-algoritme We contraheren kanten at random totdat er twee knopen x, y over zijn Antwoord dat we geven is het aantal kanten tussen deze twee knopen, ofwel de snede (S(x),S(y)) Stelling: De kans dat het algoritme een minimum snede oplevert is minstens 1/n2 Algoritmiek
Bewijs (1) Stelling: De kans dat het algoritme een minimum snede oplevert is minstens 1/n2 Bewijs: Stel minimum snede heeft k kanten en tot nu is er daar nog geen van gecontraheerd Dan heeft iedere knoop minstens graad k Voor een knoop v met graad minder dan k heeft de snede (S(v), S(V\{v})) grootte k Dus G heeft minstens kn/2 kanten Algoritmiek
Bewijs (2) G heeft minstens kn/2 kanten De kans dat we in huidige iteratie een kant van de minimum snede kiezen is hoogstens k/(kn/2) = 2/n De kans dat we nooit een fout maken is dus ≥ (1 - 2/n) (1 - 2/(n-1)) … (1 - 2/3) = ((n-2) / n) ((n-3)/(n-1)) ((n-4)/(n-2)) ... = 2 / (n (n-1)) Stelling: De kans dat het algoritme een minimum snede oplevert is minstens 1/n2 Algoritmiek
Verdieping (1) Contractie-algoritme: kans op goed antwoord is niet zo groot Door herhalen kun je de kans op een goed antwoord vergroten n2 keer herhalen: kans op fout antwoord ≤ 1/e Nu niet meer sneller dan Ford-Fulkerson n2 ln n keer herhalen: kans op fout antwoord ≤ 1/n Wel slechtere looptijd Algoritmiek
Verdieping (2): random Methode Random, die een willekeurig element geeft uit een verzameling Volgens bepaalde kansverdeling; meestal uniform Bijv: random getal uit [0,1), uniform verdeeld Of: random getal uit {1,2,3,4,5,6} elk met kans 1/6. Praktijk: Pseudo-random generatoren Rij x0, x1, … , met bijv.: xi = axi-1 + b mod n, geschikte a, b, n Zal periodiek zijn! a, b, n zodat periode zo lang mogelijk is. Echte random generatoren: bijv. met radio-actief verval. Algoritmiek