Tato stránka obsahuje moje poznámky z přednášky Jiřího Sgalla z akademického roku 2021/2022 (MFF UK). Pokud by byla někde chyba/nejasnost, nebo byste rádi něco přidali, tak stránku můžete upravit pull requestem (případně mi dejte vědět na mail).
Základní definice
Definice (Optimalizační problém) je I,F,f,g
I… množina všech vstupů/instancí
množina všech ohodnocených grafů
∀I∈I:F(I)… množina přípustných řešení
pro daný ohodnocený graf všechny kostry
∀I∈I,A∈F(I):f(I,A)… účelová funkce
součet hran na kostře
g… bit (zda chceme maximalizovat nebo minimalizovat)
maximalizujeme
Definice (NP-Optimalizační problém) je I,F,f,g, pro které platí stejné věci jako pro normální optimalizační problémy, ale navíc
délka přípustných řešení ≤poly(∣I∣).
jazyk dvojic (I,A),I∈I,A∈F(I) je v P (rychle umíme ověřit, zda je řešení přípustné)
f počitatelná v polynomiálním čase
Pro minimalizační zajišťujeme, že naše je vždy dostatečně malé.
Pro maximalizační zajišťujeme, že je vždy dostatečně velké.
Definice: algoritmus A je R-aproximační alg., pokud:
v polynomiálním čase v ∣I∣ na vstupu I najde A∈F(I)
pro minimalizační problém: ∀I:f(A)≤R⋅OPT(I)
pro maximalizační problém: ∀I:f(A)≥OPT(I)/R
Pravděpodobnost v algoritmech
algoritmy s chybou: někdy dělají chybu, ale většinou ji neudělají
bez chyb, běží v průměrném čase polynomiálním
třída NP: jazyky, pro které existuje polynomiální algoritmus A, který ověří správnost:
∀a∈L∃b:A(a,b)=1
∀a∈L∀b:A(a,b)=0
třída RP: jazyky, pro které existuje polynomiální algoritmus A, který ověří správnost:
∀a∈LPrb[A(a,b)]≥21
∀a∈LPrb[A(a,b)]=0
Metrický TSP
Vstup: metrika V,d na úplném ohodnoceném grafu
metrika ≡ vrcholy splňují následující:
trojúhelníkova nerovnost
symetrie
d(x,y)=0⟺x=y
pokud by to nebyla metrika, tak poly algoritmus neexistuje (jde převést na normální TSP)
Výstup: cyklus C na všech vrcholech V
Cíl: minimalizovat d(C)
Kostrový algoritmus
Algoritmus (kostrový):
najdeme minimální kostru
navštívíme všechny vrcholy (například přes DFS), čímž dostaneme tah přes všechny vrcholy
zkrátíme ji na cyklus tak, že vynecháme opakující-se vrcholy
Věta:algoritmus je 2-aproximační.
Důkaz: kostra je nejvýše tak velká, jako optimální řešení a tenhle algoritmus je lepší než 2 kostry (díky trojúhelníkové nerovnosti a symetrii – procházíme i tam i zpět)
Christofidesův algoritmus
(👀): brát hrany dvakrát je plýtvání – pospojujeme liché vrcholy přes minimální párování, abychom nemuseli chodit tam a zpět
najdeme minimální kostru T
najdeme minimální perfektní párování M na vrcholech s lichými stupni v T
vždy existuje, jelikož máme úplný graf a vrcholů s lichým stupňem je sudý počet
zkrátíme na cyklus T∪M
děláme je tak, že vybereme dvě hrany incidentní s vrcholem a nahradíme je za jednu
Věta:algoritmus je 3/2-aproximační.
Důkaz:ALG≤d(T)+d(M)≤OPT+21OPT
Důkaz d(M)≤21OPT uděláme obrázkem:
Alespoň jeden z párování v cylku bude ≤21OPT, jelikož celý cyklus je lepší optimální řešení.
Poznámka:
v realitě se algoritmus chová výrazně lépe, například až k faktoru 1.1
dnes umíme (23−ε)-aproximaci
TSP v rovině: existuje (1+ε)-aproximační schéma (ale stále je NP těžký)
Quicksort
Algoritmus (quicksort):
∣S∣≤1… konec, vystoupíme S (base case)
jinak vybereme uniformě náhodně p∈S
A={x∈S∣x<p},B={x∈S∣x>p}
posloupnost má všechny prvky rozdílné, takže chceme ostrá nerovnítka
rekurzivně se zavoláme na A,B
vystoupíme A,p,B
Věta:quicksort má průměrnou časovou složitost n⋅logn.
Pro připomenutí:
E[Xi,j]=Pr[Ai,j] (indikátorová veličina)
E[X+Y]=E[X]+E[Y]
Důkaz: počítáme Ai,j=Pr[porovnaˊme i-tyˊ a j-tyˊ prvek]
Důkaz: to, že se dva prvky porovnají musí znamentat, že jeden z jich byl pivot, ale žádný mezi nimi pivot nebyl (jelikož by je to rozdělilo). Musíme tedy vybrat právě jeden z těchto dvou z intervalu [i,j], kde je celkově j−i+1 čísel.
Sečtením přes všechny dvojice i<j dostaváme následující:
E[#porovnaˊnıˊ]=i=1∑n−1j=i+1∑nXi,j=i=1∑n−1j=i+1∑nj−i+12=i=1∑n−1k=2∑n−ik2≅n⋅HnHn…harmonickaˊ posloupnost≅n⋅logn
Konflikty v distribuovaných systémech
n procesorů se snaží o přístup k jednomu zdroji
přímá komunikace není možná
v každém cylku může každý procesor požadovat přístup
povede se pouze, když o něho žádá jeden
Algoritmus:
v každém cylku zkus s pravděpodobností p přistoupit ke zdroji
p si nastavíme tak, aby to vyšlo hezky
opakuj, dokud se ti to nepovede
Věta:algoritmus s p=n1 s pravděpodobností alespoň 1−n1 uspěje po t=2enlnn cyklech.
Důkaz: modifikujme algoritmus, aby zkoušel přistupovat i po té, co ho získal (lehčí počítání, které pouze zhorší pravděpodobnost úspěchu).
Nechť Ai,r je jev, že i-tý proces upěl v r-tém cyklu. Pak
Pr[Ai,r]=p⋅(1−p)n−1=n1(1−n1)n−1≥en1
Nyní počítáme Fi,t které říká, že i-tý proces neuspěje v žádném z t=2enlnn cyklů:
Pr[Fi,t]=r=1∏t(1−Ai,r)≤(1−en1)t=((1−en1)en)ent≤n−2
To, že neexistuje proces, který neuspěje, odhadneme jako
Pr[i=1⋃nFi,t]≤i=1∑nPr[Fi,t]≤n⋅n−2=n−1=n1
Globální minimální řez
Vstup: neorientovaný graf (V,E)
Výstup: řez F⊆E
Cíl: minimalizovat ∣F∣
Přímočarý algoritmus
Algoritmus:
převedeme graf na ohodnocený s jednotkovými cenami
zafixujeme vrchol s
pro všechny ostatní vrcholy t najdeme minimalní s−t řez
vrátíme minimum
umíme vyřešit řádové v O(n3)
Spojující algoritmus
Algoritmus:
vybereme náhodnou hranu a její vrcholy spojíme do jednoho
opakujeme, dokud nemáme pouze dva vrcholy
zbylé hrany na konci jsou náš řez
idea je to, že hran v minimálním řezu je málo a nejspíš se do nich netrefíme
pracujeme s multigrafy – při kontrakci zachováváme hrany
umíme ho implementovat rychle (řádově O(n2⋅logn))
opravdu produkuje řez, protože vrcholy mezi výslednými komponentami danými vrcholy nemizí
(👀): multigraf s n vrcholy a min. řezem velikosti k má alespoň nk/2 hran.
každý vrchol sám o sobě tvoří řez, pak stačí přes všechny posčítat…
Věta:pravděpodobnost, že najdeme daný minimální řez C je alespoň (2n)−1=n⋅(n−1)2.
Důkaz: nechť Ai jev, že v prvních i iteracích jsme nevybrali hranu z C.
Prostě přesouváme stroje, které končí nejpozději někam, aby začínaly dříve a zlepšujeme tím maximum.
Algoritmus (lokální prohledávání):
najdi libovolný rozvrh bez mezer (i na začátku)
vezmi libovolné j s maximálním cj
pokud existuje stroj i s délkou rozvrhu <sj, tak přesuň j na is minimální délkou
jinak vystup aktuální rozvrh
(👀):cminneklesaˊ
(👀): Každou úlohu přesuneme nejvýše jednou.
Důkaz: jelikož ji přesouváme na stroj s minimální délkou, tak by musel existovat nějaký s ještě menší, což by byl spor s tím, jak algoritmus funguje (dáváme na nejmenší).
Důsledek: algoritmus je polynomiální.
Věta (silnější odhad pro lokální algoritmus):algoritmus je (2−m1)-aproximační.
Largest Processing Time (LPT)
Algoritmus (LPT):
úlohy uspořádáme tak, že p1≥p2≥…≥pn
použijeme hladový algoritmus
Věta:LPT je (34−3m1)-aproximační algoritmus.
Důkaz: BUNO předpokládejme, že pn určuje délku rozvrhu (kdyby ne tak na další úlohy zapomenu a řešení se tím nezmění). Rozlišíme 2 případy:
pn≤31OPT – stejný výpočet jako předtím, jen silnější nerovnost:
ALG=T+pn, T+mpn≤OPT
stejným výpočtem jako předtím máme ALG≤OPT+(1−m1)31OPT
pn>31OPT – LPT vygeneruje optimální rozvrh
víme, že délka poslední, a tedy každé úlohy je alespoň OPT/3
žádný počítač nebude mít 3 úlohy, jelikož by pak byl větší než optimum
chceme argumentovat, že LPT udělá stejné dvojice jako optimální rozvrh:
pm+pm+1≤OPT – uvážíme-li pouze prvních m+1 úloh, tak optimální rozvrh bude mít alespoň 2 na jednom počítači a ty rozhodně nebudou kratší než dvě nejkratší
tento rozvrh s méně úlohami je jistě ≤OPT, proto nerovnost platí
pm−1+pm+2≤OPT – v optimálním rozvrhu budou mít alespoň 2 počítače dvojici úloh; v jedné z nich bude čtvrtá nejmenší (pm−1), která tam bude s nejmenší (pm+2)
obdobně dostaneme všechny další dolní odhady…
Odbočka: online algoritmy
vstup přichází postupně
řešení musíme konstruovat postupně po krocích a pak už neměníme
hladový je online, lokální prohledávání není
pro m=2: lepší než 3/2-aproximační neexistuje (úlohy délky {1,1,2})
pro m=3 je opět hladový nejlepší
pro m>3 to už tak není (existují lepší)
Bin packing
Vstup:a1,…,an≥0
Výstup: rozklad {1,…,n}=I1∪…∪Im tak, že ∀i:∑j∈Iiaj≤1
součet věcí v každém koši může být nejvýše 1
Cíl: minimalizovat m (počet košů)
Algoritmus (first fit): dej aj do prvního koše, do kterého se vejde.
Algoritmus (best fit): dej aj do nejplnějšího koše, do kterého se vejde.
Věta:oba algoritmy jsou 1.7-aproximační (a je to těsný odhad).
Věta:Je NP těžké najít R-aproximační algoritmus pro R≤3/2
Důkaz: Je NP těžké rozhodnout, zda OPT=2, jelikož pomocí něho můžeme přímočaře vyřešit problém dělení množiny na dvě časti se stejným součtem (nastavíme velikost košů na tenhle součet), což je NP těžké.
Věta:Existuje asymptotické aproximační schéma, t. j. (∀ε)(∃ALG)(∀I)ALG(I)≤(1+ε)OPT(I)+1
Algoritmus (any fit): dej aj do nějakého neprázdného koše; pokud nelze, dej ho do nového.
zahrnuje jak best fit, tak first fit
Věta:každý any fit algoritmus má aproximační poměr ≤2.
Důkaz: Pro OPT=1 triviální. Jinak nechť Bi=∑j∈Iiaj. Musí platit, že (∀i,j,i=j)Bi+Bj>1 (jinak spor s během algoritmu). Posčítáním pro všechny dvojice dostáváme 2m<i=1∑mBi=j=1∑naj≤OPT
Hledání disjunktních cest
Vstup:
graf G=(V,E) (orientovaný/neorientovaný)
dvojice vrcholů (s,t),…,(sk,tk)
kapacita hran c
Výstup:
I⊆{1,…,k} (dvojice které spojíme cestou)
cesty Pi,i∈I,Pi cesta z si do ti tak, že každá hrana e∈E leží na nejvýše c cestách Pi
Cíl: minimalizovat ∣I∣
Jednotkové kapacity
Algoritmus (hladový):
najdeme nejkratší cestu mezi nespojenou dvojicí (přes všechna i)
pokud neexistuje, tak vystoupíme
odebereme použité hrany
(👀): hladový algoritmus nemá aproximační poměr lepší než O(m):
Délka s1↦t1 je O(k). Abychom tuto cestu nezvolili, tak musejí mít ostatní alespoň O(k) hran a celkově jich tedy musí být řádově m=O(k2). Naše řešení je tedy o k=O(m) horší.
Věta:Hladový algoritmus s c=1 je O(m)-aproximační.
Důkaz: BUNO OPT≥1 (jinak bychom hned skončili)
pak ∣I∣=ALG≥1 (také nějakou najdeme)
Nechť I∗,{Pi∗∣i∈I∗} je optimum. Počítejme cesty:
dlouhé cesty: ∣Pi∗∣>m
je jich ≤m (jinak bych měl více než m hran)
ty mi tedy nic nekazí, jelikož nám stačí, že algoritmus najde nějakou cestu
krátké cesty:
i∈I… vše ok
i∈I…Pi∗ má nějakou společnou hranu s nějakou cestou Pj t. ž. ∣Pj∣≤m
ve chvíli, kdy algoritmus poprvé vybral cestu delší než m už nemohl vybrat Pi∗, protože tu blokovala nějaká cesta, kterou již předtím zvolil (a ta musí být krátká)
Tedy počet krátkých cest Pi∗≤∣I∣(m+1)
1 – náš algoritmus a optimum vybrali stejnou cestu
m – krátká cesta v našem řešení zablokuje nejvýše m ostatních krátkých
OPT=∣I∗∣≤dlouheˊm+kraˊtkeˊ∣I∣(m+1)≤O(m)∣I∣=O(m)ALG
Nejednotkové kapacity
Algoritmus (hladový pro nejednotkovou kapacitu):
zvolíme β=⌈mc+11⌉
najdeme nejkratší cestu mezi nespojenou dvojicí (přes všechna i)
pokud neexistuje nebo d(Pi)≥βc, vystoupíme
přenásobíme délku hran nejkratší cesty faktorem β a opakujeme
(👀): algoritmus nepoužije e s d(e)≥m
Důsledek: výsledné řešení je přípustné
po c použitích hrany e je d(e)=βc≈mc+1c<m, dále algoritmus hranu nepoužívá
Důsledek: algoritmus je polynomiální.
Věta:Hladový algoritmus je O(β)-aproximační.
pro c=1 máme β=mc+11=m, což odpovídá
Důkaz: BUNO optimum ≥1 (jinak bychom hned skončili)
pak ∣I∣=ALG≥1 (také nějakou najdeme)
Opět si rozmyslíme to, když cesta je v našem algoritmu a když není:
i∈I… vše ok
i∈I… na konci algoritmu je d(Pi∗)≥βc (jinak by ji algoritmus použil)
Nyní nejprve zesdola odhadneme d(E) na konci algoritmu:
βc(∣OPT∣−∣I∣): dolní odhad na délku cest, které algoritmus nespojil ale optimální ano
každá cesta má na konci delku alespoň βc a je jich alespoň ∣OPT∣−∣I∣
d(E)≥βc(∣OPT∣−∣I∣)/c: každou hranu můžeme použít c-krát
Poté odhadneme d(E) zeshora (opět na konci algoritmu):
na začátku d(E)=m (délky hran jsou jednotkové)
po výběru Pi…d(Pi)≤βc⋅β=βc+1
na konci d(E)≤m+∣I∣βc+1≤(∣I∣+1)βc+1
∣I∣ je počet kroků, v každém jsme zvětšili délku vybrané cesty na βc+1
druhá úprava je pouze z definice
Po spojení nerovnic dostáváme:
βc(∣OPT∣−∣I∣)∣OPT∣−∣I∣∣OPT∣≤c⋅d(E)≤c(∣I∣+1)βc+1≤βc(∣I∣+1)≤O(β)∣I∣
Splnitelnost (MAX-SAT)
Vstup:C1∧…∧Cn, každá klauzule je disjunkcí kj≥1 literálů
každá Cj má váhu wj (=1 by default)
Výstup: ohodnocení a∈{0,1}n
Cíl: maximalizovat ∑wi (pro wj=1 je to počet splněných klauzulí)
Poznámka:
MAX-3SAT: kj≤3: NP těžké
2SAT: orientovaný graf, ve kterém různé literály implikují jiné
x1∧x2 implikuje x1⟹x2 (a obrácené)
testujeme tedy, zda graf neobsahuje cyklus (protože by pak nešel splnit)
MAX-2SAT: NP těžké
Předpokládáme:
žádný literál se v klauzuli neopakuje
nejvýše jeden z xi,xi se vyskytuje v klauzuli
RAND-SAT
Algoritmus (RAND-SAT):
vybereme nezávisle náhodně všechny literály (p=1/2)
profit?
Věta:RAND-SAT je 2-aproximační algoritmus.
Důkaz: pro každou klauzuli zavedeme indikátorovou proměnnou Yj.
pravděpodobnost, že Cj není splňená je 2k1
Díky tomu, že k≥1 máme E[Yj]=Pr[Cjis satistied]=1−2k1≥21 a tedy:
E[j=1∑mwjYj]=linearita21j=1∑mwj≥21OPT
Poznámka: pro k=3 dostáváme po dosazení 78-aproximaci
∀ε>0:(78−ε)-aproximace MAX-3SATu ne NP úplná
Předchozí algoritmus měl problémy s krátkými klauzulemi, jelikož je menší šance, že nějakou splní. Zkusíme to napravit tím, že jim budeme dávat preferenci.
BIASED-SAT
předpoklad: ∀i:∑j:Cj=xiwj≥∑j:Cj=xiwj
chceme preferovat splnění krátkých kladných před splněním krátkých záporných
pokud nevychází, tak literál všude znegujeme
Algoritmus (BIASED-SAT):
vybereme nezávisle náhodně všechny literály
true: p>21, jinak false; hodnotu p najdeme později
Věta:BIASED-SAT je (ϕ=25−1)-aproximační algoritmus.
Uvažme Cj (a opět indikátorové veličiny Yj):
kladný literál: Yj=p
kj≥2: Yj=1−pa(1−p)b≥p>211−pa+b≥kj≥21−p2
a je počet kladných a b počet záporných literálů
Po vyřešení p=1−p2 dostáváme p=ϕ=25−1.
Nechť U množina klauzulí bez záporných jednotkových.
(👀):OPT≤∑j∈Uwj
zde používáme předpoklad – kladné literály je splňovat lepší než záporné
Nás zajímá splnění, tedy:
Pr[Cjje splneˇnaˊ]≥1−(1−kjzj∗)kjf(zj∗)≥B[1−(1−kj1)kj]zj∗≥C(1−e1)zj∗
Pro fakt B jsme pozorovali, že a=f(0)=0 a také že druhá derivace je nekladná. Pak:
E[j=1∑mwjYj]=j=1∑mwjE[Yj]≥j∈U∑wj⋅Pr[Cjje splneˇnaˊ]≥j∈U∑wj⋅(1−e1)zj∗=(1−e1)OPT
BEST-SAT
Algoritmus (BEST-SAT):
při přizazení s pravděpodobností 1/2 použijeme RAND-SAT, jinak použijeme BEST-SAT
zažijeme existenční krizi z toho, že takovýhle algoritmus funguje a je asymptoticky optimální
Věta:BEST-SAT je 43-aproximační.
Důkaz: chceme dokázat, že Pr[Cjje splneˇnaˊ]≥43zj∗.
Podívejme se, s jakou pravděpodobností splní klauzuli algoritmy:
RAND-SAT: 1−2k1 (alespoň jedna musí být splněná a volíme s p=1)
LP-SAT: [1−(1−k1)k]zj∗ (formulka z minulého důkazu těsně před odhadem)
kj
RAND-SAT
LP-SAT
BEST-SAT
1
21≥21zj∗
1⋅zj∗
2121+21zj∗≥43zj∗
2
≥43zj∗
43⋅zj∗
≥43zj∗
≥3
≥87zj∗
≥(1−e1)⋅zj∗
>43zj∗
Poznámka (derandomizace metodou podmíněných pravděpodobností): postupně plníme klauzule tak, že náhodně vybíráme pravděpodobnosti. Jelikož počet splnění určuje to, jak hodnoty vybereme, tak je můžeme vybírat (podmíněně se rozhodujeme, jak to dopadne, když xi=0 nebo xi=1 a vybereme si to lepší). Aproximační poměr si neshoršíme, jelikož vždy vybírám větší z pravděpodobností.
Pokrývací problémy
Vrcholové pokrytí
Vstup: graf G, ceny vrcholů cv≥0
Výstup:W⊆V tak, že ∀e∈E:e∩W=0
Cíl: minimalizovat c(W)=∑v∈Wcv
Algoritmus (LP relaxace):
vytvoř celočíselný lineární program:
proměnné jsou binární podle vrcholů, které vybíráme
podmínky jsou ∀(u,v)∈E:xu+xv≥1 (chceme pokrýt všechny hrany)
minimalizujeme ∑v∈Vxvcv
zrelaxuj lineární program (proměnné jsou teď reálné)
použij ho při řešení – zvol v když xv≥21
dává správné řešení, jelikož pro splnění podmínek je vždy alespoň jeden z (xu,xv)≥21
Věta:algoritmus je 2-aproximační.
Důkaz: proměnné jsme z ≥21 zaokrlouhlovali na 1, čímž jsme řešení max. zdvojnásobili.
Množinové pokrytí
Máme množiny, které mají nějaké ceny. Chceme je vybrat tak, aby jejich sjednocení obsahovalo všechny prvky a aby cena byla minimální.
Vstup: množiny S1,…,Sm⊆{1,…,n}, ceny c1,…,cm≥0
Výstup:I⊆{1,…,m} t. ž. ⋃i∈ISi={1,…,n}
Cíl: minimalizovat ∑i∈Ici
Pro rozbor budeme potřebovat ještě dva parametry:
v kolika nejvíce množinách je nějaký prvekf=maxe=1n∣{j∣e∈Sj}∣
velikost největší množinyg=maxj=1m∣Sj∣≤n
(👀): vrcholové pokrytí je množinové pokrytí s f≤2
Program pro vrcholové pokrytí:
proměnné jsou binární podle vrcholů, které vybíráme
podmínky jsou ∀(u,v)∈E:xu+xv≥1 (chceme pokrýt všechny hrany)
minimalizujeme ∑v∈Vxvcv
f-aproximační algoritmy
Algoritmus (LP relaxace):
vytvoř celočíselný lineární program:
proměnné jsou x1,…,xm≥0 podle množin
podmínky jsou ∀e∈{1,…,n}:∑j∣e∈Sixj≥1 (chceme pokrýt všechny prvky univerza)
minimalizujeme ∑i∈{1,…,m}xici
zrelaxuj lineární program (proměnné jsou teď reálné)
použij ho při řešení – zvol v když xv≥f1
dává správné řešení – argument je stejný jako u vrcholového pokrytí
Věta:algoritmus je f-aproximační.
Důkaz: proměnné opět zvětšuji z f1 na 1, řešení tedy zhorším nejvýše f-krát.
Význam primáru (sběratel): jak můžu nejlevněji nakoupit balíčky známek tak, abych měl všechny známky.
Význam duálu (procejce): kolik můžu nejvíce účtovat za každou známku, aby byl obchod ochotný kupovat známky a tvořit z nich balíčky.
(👀): duál programu vypadá následně:
proměnné jsou y1,…,yn≥0 pro každý prvek
podmínky jsou ∀e∈{1,…,m}:∑e∈Sjye≤cj
maximalizujeme ∑e∈Sjye
(👀): podmínky komplementarity:
∀j:xj∗=0∨∑ye∗=cj
pokud by prodejce na obálce vydělal, tak ji sběratel nekoupí
pokud prodejce na známce nevydělává, tak ji sběratel koupí
∀e:ye∗=0∨∑j∣e∈Sjxj∗=1
pokud prodejce prodává známku zdarma, tak jí sběratel nakoupí trochu více
pokud prodejce známku zdarma neprodává, tak jí sběratel nekoupí víc než potřeba
Algoritmus (primárně-duální algoritmus):
y1,…,yn=0;I=∅,E=∅
dokud existuje nepokryté e∈E, tak zvyšíme ye „co nejvíce“:
δ=minj∣e∈Sj(cj−∑e∈Sjye)
zvyšujeme tak, abychom splnili tu nejpřísnější duální podmínku
ye=ye+δ
∀j:e∈Sj a ∑e∈Sjye=cj přidám j do pokrytí (I=I∪{j}) a E=E∪Sj
do algoritmu přidáme ty množiny, jejichž podmínky komplementarity jsme naplnili
(👀): po přidání do algoritmu se ye prvku nezmění (ostře splníme nějakou rovnost)
q je vektor indexovaný prvky, pomůže nám při analýze algoritmu
odpovídá ceně za pokrytí daného prvku
opakovaně ber „nejlepší“ množinu: přidáme množinu s minimálním (pj=∣Sj∖E∣cj)
pj odpovídá tomu, kolik zaplatíme za pokrytí nového prvku
∀e∈Sj∖E:qe=pj (uložíme cenu nově pokrytých prvků)
I=I∪{j},E=E∪Sj (přidáme tuto množinu a pokryté prvky)
Věta:algoritmus je (Hg≈lng≤lnn)-aproximační
(👀): algoritmus nemůže být lepší (viz následující protipříklad):
(👀):ALG=∑e=1nqe
vyplývá z toho, že jsme cenu pj při přidávání rozdělili do qe
Lemma:q=Hg1⋅q je přípustné řešení duálního LP
Důkaz: chceme dokázat, že ∑e∈Sjqe≤cj (přímo podmínka v duálu). Nechť Sj={e1,…,ek}
očíslujeme tak, že ek je první pokrytý, ek−1 druhý, až e1 poslední
(👀):qei≤icj
v i-tém kroku ještě nejsou pokryté prvky 1,…,i
z definice vybíráme nejlevnější možnou množinu
Nyní dostáváme
e∈Sj∑qee∈Sj∑qe=1∑kqei≤1cj+2cj+…=Hk⋅cj=Hg1e∈Sj∑qe≤Hg1⋅Hk⋅cj≤cj
Maximální nezávislá množina
Vstup: graf G=(V,E)
Výstup:I⊆V nezávislá množina, maximální vzhledem k inkluzi
největší moc dobře řešit nejde (ani aproximovat)
Nás zajímá najít rychlý paralelní algoritmus:
operací chceme udělat řádově O(logn)
k dispozici máme řádově m procesorů (každý vrchol/hrana má jeden)
povolujeme procesorům najednou šahat na data a najednou měnit data na stejnou věc
Algoritmus (rychlý paralelní):
I=∅
dokud V=∅, tak každý následující krok děláme paralelně:
∀v∈E pokud je stupeň 0, pak přidáme do I a vymažeme z V
∀v∈E označ v (přidej do S) s pravděpodobností 2dv1 (nezávisle)
∀u,v∈E pokud u i v jsou označené, odeber značku nižšího stupně
nižší stupeň proto, abychom odebírali hran co nejvíce
přidej označené vrcholy do I a odeber je a jejich sousedy (a odpovídající hrany) z V
sousedy množiny S značíme N(S)
Chceme, aby se graf v každé iteraci zmenšil o nějakou část a iterací bylo tedy logaritmicky. Uděláme to počítání toho, že máme hodně dobrých hran a že jich hodně zmizí.
Definice: vrchol je dobrý, jestliže má ≥3dv sousedů stupně ≤dv
má velkou pravděpodobnost, že ho vyřešíme výběrem souseda, protože má hodně sousedů malého stupně
analogicky špatný vrchol a dobrá (obsahuje dobrý vrchol) a špatná hrana
Lemma:alespoň polovina hran je dobrá.
Důkaz: hrany zorientujeme od menšího k většímu stupni (rovnost řešíme libovolně)
v špatný ⟹dvin<3dv
z definice – vstupující jsou stejného nebo menšího stupně, takže jich má málo, jinak by byl dobrý
>32dv vstupuje a platí dvin≤21dvout
„za každou špatnou hranu nejvýše dvě dobré“
Nyní počítáme
∣sˇpatneˊ hrany∣≤vsˇpatnyˊ∑dvin≤vsˇpatnyˊ∑21dvout≤v∈E∑21dvout≤21∣E∣//sˇpatnaˊ hrana jde do sˇpatneˊho vrcholu//nerovnost vyˊsˇe
Tedy dobrých je ≥21.
Pravděpodobnost, že dobrý vrchol odstraním (buď označením toho vrcholu samotného nebo nějakého jeho souseda) je α>0.
Lemma:existuje α>0 t. ž. ∀vdobrý platí Pr[v∈S∪N(S)]≥α
přímo z toho plyne to, co chceme, jelikož dobré hrany jsou pouze u dobrých vrcholů
Důkaz: Pro dobrý vrchol v platí následující:
Pr[vmaˊ souseda oznacˇeneˊho v kroku 2]≥1−w∈N(v)∏(1−2dw1)neoznacˇıˊme zˇaˊdneˊho souseda≥1−(1−2dv1)3dv//lemma vyˊsˇe=konstanta
Může být špatné, když by se hodně ze sousedů dobrého vrcholu odstranilo. To dokážeme, že se nestane tím, že ukážeme, že u libovolného vrcholu v odstraníme značku s ≤ konstantní pravděpodobností (jen pozor, v Pr používáme podmíněně, že v byl označený):
Pr[odstranıˊme znacˇku]=Pr[je oznacˇenyˊ soused s veˇtsˇıˊm stupneˇm]=Pr[∃u∈N(v):du≥dw∧ubyl oznacˇenyˊ]≤u∈N(v)∣du≥dv∑Pr[ubyl oznacˇenyˊ]≤w∈N(v)∑dw⋅2dw1≤21
Nikde v důkazu nepočítáme s pravděpodobností označení dobrého vrcholu, což nepotřebujeme.
Věta:očekávaný počet fází algoritmu je ≤O(logn)
Důkaz: nechť Mi= počet hran po i fázích. Platí, že E[∣Mi+1∣]≤(1−2α)E[∣Mi∣]
podle lemmatu je ≥Mi/2 hran dobrých a dobrá hrana je odebrána s p=α
Tedy po logaritmicky mnoho krocích (v m nebo n) odstraníme všechny hrany pravděpodobností alespoň 21.
Hashovací funkce
2-Univerzalita: pro dva rozdílné prvky máme pro náhodnou hashovací funkci z rodiny omezenou pravděpodobnost, že se namatchují na stejnou hodnotu.
Silná 2-univerzalita: zahashované hodnoty x1,x2 tvoří dvě náhodné po dvou nezávislé veličiny. Takže kromě toho, že jsou univerzální (když zafixuju jeden, tak se tím druhým trefím s pravděpodobností n1 to platí i pro libovolnou dvojici, na kterou prvky mapuju.
Definice: nechť M,∣M∣=m,N,∣N∣=n,H⊆{f∣f:M↦N}
systém H je 2-univerzální, jestliže
(∀x1,x2∈M,x1=x2)Prh∈H[h(x1)=h(x2)]≤1/n
systém H je silně2-univerzální, jestliže
(∀x1,x2∈M,x1=x2)(∀y1,y2∈N)Prh∈H[h(x1)=y1∧h(x2)=y2]=1/n2
Příklad: pro M=N je těleso máme silně 2-univerzální systém
H={ha,b∣a,b∈N}ha,b:x↦ax+b
Příklad: pro ∣M∣≫∣N∣ můžeme vzít H⊆{f∣f:M↦M} a vytvořit z něho H⊆{f∣f:M↦N} tím, že budeme brát funkce modn
H silně 2-univerzální ⟹H univerzální
pokud n∣m, tak máme silnou univerzalitu
Dynamický slovník
Příklad (dynamický slovník): universum M, ∣M∣=2d, slovník S⊆M,∣S∣=s
reprezentujeme S tabulkou N,∣N∣=n=O(s)
operace (trvá průměrně O(1)):
vložení do S
vyhledávání x v S
vymazání x z S
Zvolíme n∈[s,2s],H,h∈H náhodně uniformně:
h(x) je očekávaná pozice v poli
kolize se přidávají do spojového seznamu pole (ni je počet prvků)
Lemma:pokud n=O(s), tak průměrná doba operace je O(1)
Důkaz: chceme (∀x∈S)E[nh(x)]=O(1). Budeme počítat počet kolizí na jeden prvek:
nechť Xy={10h(y)=h(x)jinak
jelikož (∀x,y,x=y)h(x),h(y) jsou nezávislé, tak E[Xy]=n1:
chceme, aby operace vyhledání běžela v maximálním čase O(1)
to jsme předtím neměli – seznam mohl být dlouhý a maximální počet operací velký
použijeme tabulky dvě:
hashujeme dvakrát – jednou pro index do první tabulky, ta určí funkci pro druhé hashování
v první budeme chtít ≤n kolizí, ve druhé =0
vybereme h∈H tak, že má ≤n kolizí
kolize C={{x,y}∣x,y∈M,x=y,h(x)=h(y)}
Lemma:existuje h∈H s počtem kolizí ≤n.
Důkaz:E[∣C∣]≤2−univ(2s)n1≤s≤n(2n)⋅n1≤2n
jelikož je průměrný počet kolizí ≤2n, tak musí existovat hodně takových, že ≤2n
Lemma:existuje hi∈H s počtem kolizí 0.
Důkaz:E[∣Cni∣]≤(2ni)⋅ni21≤21
jelikož je průměrný počet kolizí ≤21, tak musí existovat hodně takových, že 0
(👀):∣C∣=∑i=1n(2ni)=∑2ni2−∑2ni
počet prvků kolidující do daného políčka je ni, počet dvojic je tedy výraz nahoře
Výpočtem dostáváme ∑ni2≤2∣C∣+∑ni≤2s+s=O(s)
Testování
Násobení matic
pomalé násobení: O(n3)
nejlepší známé: O(nω)
ω=2.37
Vstup:A,B,C⊆Kn×n (pro těleso K)
Výstup: ANO, pokud A⋅B=C, jinak NE
Lemma:nechť a∈Kn,a=0 a x∈{0,1}n uniformně náhodný. Pak Prx[aT⋅x=0]≥21
Důkaz: uvažme poslední nenulovou souřadnici ak. Ta má hodnotu 0 nebo ak, podle vybraného bitu. 0 bude tedy právě tehdy, když součet předchozích vyšel ak (a opakujeme s k−1,…).
Věta:existuje pravděpodobnostní algoritmus s jednostrannou chybou pro testování maticového násobení v čase O(n2)
když platí, tak vždy řekne že platí
když neplatí, tak se netrefí s nějakou pravděpodobností (konkrétně ≥21)
Algoritmus:
vezmi náhodný x∈{0,1}n
vstup ANO, jestliže A⋅B⋅x=C⋅x, jinak NE
(👀): algoritmus trvá O(n2) kroků
(👀): algoritmus řekne ano ⟺(A⋅B−C)⋅x=D⋅x=0
D je nenulová matice (jelikož A⋅B=C), má tedy nenulový řádek
podle lemmatu platí Prx[D⋅x=0]≥21
Nulovost polynomů (Polynomial Identity Testing)
nezajímá nás, jestli je identicky nulový, ale zda je nulový v tělese, ve kterém pracujeme
uvažujeme více proměnných
d… celkový stupeň (t. j. součet stupňů v nějakém nenulovém monomu)
převeditelné na to, zda je výrok tautologie (jdou na sebe převést) ⟹ NP těžké
Budeme používat trochu divný vstup:
Vstup: matice polynomů proměnných, determinant určuje náš polynom
Výstup: ANO, jestliže je polynom identicky nulový, jinak NE
Lemma:nechť P(x1,…,xn) je nenulový polynom nad K stupně ≤di a S⊆K konečná. Nechť x1,…,xn∈S unif. náhodně. Pak Prx[P(x)=0]≤∣S∣d
n=1… polynom má nejvýše d kořenů, ať zvolíme s jakkoliv
je to dost šikovné, protože podle ∣S∣ si volíme přesnost algoritmu (pro ∣S∣≥2d máme ≥21)
Důkaz: pro n=1 platí. Nyní indukcí podle n. Rozdělíme polynom na A a B, kde stupeň v B je ostře menší k. To umíme tím, že vytkneme nějakou proměnnou:
P(x)=x1k⋅A(x2,…,xn)+B(x)
A je identicky nulový (podle IP) s pravděpodobností ≤∣S∣d−k
chci dokázat, že Pr[P(x)=0∣A(x2,…,xn)=0]≤∣S∣k
při konkrétních hodnotách x2,…,xn se mi polynom vyhodnotí na nějaké číslo a zbytek polynomu P(x) bude αx1k+β, což nebude mít více než k kořenů
Nyní si uvědomíme, že Pr[P(x)=0]≤α+β≤∣S∣d−k+∣S∣k=∣S∣d
Perfektní párování
Nechť (U,V,E) je bipartitní graf, n=∣U∣=∣V∣. Pak Edmondsova matice grafu je n×n matice B s
Bu,v={xu,v0uv∈Euv∈E
za každou hranu bude v matici jedna proměnná
(👀):det(B) je polynom, jehož monomy vzájemně jednoznačně odpovídají perfektním párovaním.
sčítáme součin permutace matice a když se zrovna trefíme do párovaní, tak máme monom
Algoritmus (test existence PP):
zvolme uniformně náhodně nezávisle xu,v∈{1,…,2n}
2n kvůli tomu, aby nám vyšlo NE správně s pravděpodobností ≥21
spočítáme determinant
pokud je nenulový, párování určitě existuje
pokud je nulový, tak párování neexistuje s pravděpodobností ≥21
Izolující lemma
Prvky ai budou hrany v grafu a množiny Sj budou perfektní párování.
Chceme nějak zvolit váhy a ukázat, že nám nějak jednoznačně identifikují nějakou z množin (tedy perfektních párování).
Věta:Nechť máme systém množin S1,…,Sn⊆{a1,…,am} s náhodně zvolenými vahami w(a1),…,w(am)∈R,∣R∣=r. Pak Pr[∃praˊveˇ jedinnaˊSjs minimaˊlnıˊw(Sj)]≥1−rm
pro naše použití budeme chtít r=2m
Důkaz:Ai… jev, že existují Sk,Sl tak, ze w(Sk)=w(Sl)=minjw(Sj) a ai∈Sk,ai∈Sl
existují dvě minimální množiny, které se liší v prvku i (špatný jev)
když nenastane žádný s jevů Ai, pak máme vyhráno, jelikož dvě minimální neexistují
Ukážeme, že Pr[Ai]≤r1. S1,…,Sn rozdělíme na dvě množiny podle i:
S0={j∣ai∈Sj}
S1={j∣ai∈Sj}
Pokud Ai nastane, pak platí
pro Sk: k∈S0,w(Sk)=minj∈S0w(Sj)
pro Sl: l∈S1,w(Sl)=minj∈S1w(Sj)
Pak (když zafixujeme všechny váhy a vybíráme váhu ai) platí Prw(ai)∈R[w(Sk)=w(Sl)∣w(ai′),i′=ivybraˊna]≤r1
Součtem pro všechny množiny a dostáním opačného jevu dostáváme hledanou nerovnost.
Algoritmus (rychlý paralelní algoritmus pro PP):
zvolíme rovnoměrně náhodně váhy w(uv)∈{1,…,2m} pro každou hranu
zasubstituujeme do Edmondsovy matice následně: xuv=2w(uv)
det(C)… příspěvek PP je ±2w(M)=±∏uv∈M2w(uv)
z definice determinantu (permutace nějakých indexů matice)
najdeme W tak, že 2W je maximální číslo tvaru 2α dělící det(C)
zajímá nás poslední index, kde má determinant jedničku, jelikož to odpovídá unikátnímu PP (všechny PP jsou ve tvaru 0b1w(uv)0000)
pro uv∈E spočítáme d=det(Cuv)
jestliže 2W−w(uv) je max. číslo tvaru 2α dělící d, pak přidáme uv do M
odpovídá tomu, zda párování přežilo odstranění hrany – pokud ne, tak ho přidáme
zkontrolujeme, že M je PP (mohli jsme vygenerovat nesmysl)
TODO: algoritmus pro obecné grafy přes Tutteho matici