Algdat Redux Fjortende forelesning Repetisjon av utvalgte emner. 1
Nå har vi en brukbar (om enn ikke helt intuitiv) definisjon av «alt» og nå ønsker vi å lage oss en liste med de problemene som er «verst av alle». Men hva betyr det? If I can make it there I ll make it anywhere 2
Vi *definerer* verstingene slik: Alt i Kan reduseres til Verstinger i NP Dvs.: Kan du løse *ett* versting-problem i polynomisk tid kan du løse *alle i NP*! Det virker jo for godt til å være sant. (Mange har prøvd, alle har feilet ) Kan løses v.h.a. «kompletthet» 3 NP Denne (definerende) egenskapen kalles altså kompletthet. Vi døper dermed denne verstingmengden
NPC, mengden av NP-komplette problemer. Alt i NP Kan reduseres til Kan løses v.h.a. Alt i NPC Dette er *definisjonen* av NPC. Merk at vi *ikke* i utgangspunktet vet noe om hvorvidt problemer i NPC kan løses i polynomisk tid! Merk at siden alle NPCproblemer ligger i NP så kan de også reduseres til hverandre. Det holder altså å løse *ett* av dem for å ha løst alle. 4 Våre verstinger (SUBSET- SUM, HAM-CYCLE, VERTEX-COVER, TSP) er i NPC (surprise, surprise). Siden ingen har løst disse kan vi altså slutte at ingen har løst noen i NPC.
Og så var det optimaliseringsproblemer, da Alt i NP Kan reduseres til Kan løses v.h.a. Verstinger i/utenfor NP Optimaliseringsproblemer som SHORTEST-PATH har også beslutnings-ekvivalenter som PATH. (Optimaliseringsvariantene er «minst like vanskelige», men med litt binærsøking etter beslutningsparameteren kan man ofte redusere optimaliseringsvarianten til beslutningsvarianten også. 5 «hardness»
Alt i NP Kan reduseres til Kan løses v.h.a. Alt i NP-hard Så: Hvis du kan redusere et NP-hardt problem (som TSP) til problemet ditt så sliter du uansett. 6
Her er noen velkjente NPkomplette (og NP-harde ) problemer (pensum), og noen naturlige reduksjons-retninger (men alle kan selvfølgelig reduseres til alle). CIRCUIT-SAT SAT 3-CNF-SAT CLIQUE SUBSET-SUM VERTEX-COVER HAM-CYCLE TSP 7
NP Slik *tror* vi det er. Vi *vet* ikke om det finnes noe i NP som ligger utenfor P/ NPC, men tror at kanskje faktorisering og/eller graf-isomorfisme ligger der. (De er ikke vist å ligge i P eller NPC, i hvert fall.) P NPC 8
(Merk at det her er en animasjon der P etter hvert overlapper med NPC uten at P = NP. Det er det som er umulig.) NP Umulig! P NPC Dette er umulig for hvis bare *ett* NPCproblem også ligger i P, så vil *alle* gjøre det og det gjelder faktisk alle problemer i NP! Det vil si P=NP i så fall. 9
P = NP = NPC Dette er altså «den andre» mulige verden der NPkomplette problemer kan løses i polynomisk tid. De fleste tror ikke dette er tilfelle. Det vil i så fall ha drastiske konsekvenser. 10
klarer du minesveiper, klarer du alt i NP Men NP er en *svær* mengde. 11
CIRCUIT- SAT Og En litt spesiell variant av minesveiper («infinite minesweeper») er vist å være Turingkomplett og så snubler vi borti The Halting Problem igjen...... U 1 1 1 1 2 2 1 1 1 1 1 1 1 1 u 1 2 3 2 3 2 1 2 3 2 1 1 u 1 1 2 4 s a 1 a 2 a 3 t 3 t t 3 2 1 2 2 1 1 4 3 2 3 2 1 1 2 t 2 2 u 2 2 4 s 3 1 1 0 1 1 1 0 0 1 2 2 1 T 2 3 u u s 2 1 1 1 1 1 1 1 1 1 t 1 1 1 1 1 2 4 5 4 4 t t 1 t t 1 t t 1 t 2 t 1 t t 1 2 3 v v r 2 1 1 1 1 1 1 1 1 1 t 1 1 1 1 1 2 v 2 2 4 r 3 1 1 0 1 1 1 0 0 1 2 2 1 1 2 2 1 1 4 3 2 3 2 1 1 2 t 2 1 v 1 1 2 4 r b 1 b 2 b 3 t 3 t t 3 2 V 1 v 1 2 3 2 3 2 1 2 3 2 1 1. 1. 1. 1 2 2 1 1 1 1 1 1 1... Figure 9: An and gate. 12 For mer: http://for.mat.bham.ac.uk/r.w.kaye/minesw/
Hvis vi reduserer et NPkomplett problem til vårt problem så er vårt også NP-komplett. Greit nok. Men hvor begynte man i sin tid? Men, men 13
Cook og Levin satt på hver sin side av jernteppet under den kalde krigen og begge viste (ved helt *andre* metoder) at (CIRCUIT-)SAT var NP-komplett. CIRCUIT SAT Vi ser ikke på deres bevis her, men antar bare at enkelte problemer (spesifikt CIRCUIT-SAT) er bevist NP-komplette. Erkeproblemet 14
Eksempel på NPC-bevis 15
Kan reduseres til SAT CLIQUE Kan løses v.h.a. Eller, i vårt tilfelle, 3-CNF-SAT (litt lettere å ha med å gjøre). Vi får en logisk formel på 3-CNF-form (konjunktiv normalform der alle leddene har 3 variable) og skal avgjøre om vi kan gi variablene en tilordning slik at formelen blir sann. Vi antar altså at vi vet at dette er i NPC. 16 Her gjelder det å finne en komplett subgraf av en viss størrelse (dvs. et sett med k noder som alle er koblet til hverandre). MAX-CLIQUE er optimaliseringsvarianten
Vi lager en «SAT-løse-maskin» med «CLIQUE-byggeklosser». For å få til en klikk av størrelse 3 må minst én variabel være sann i hver del av formelen og dermed også hele formelen. X Y Z Så: Hvis vi klarer å løse CLIQUE i polynomisk tid kan vi bruke denne teknikken for også å løse SAT. Ergo, siden SAT er i NPC må også CLIQUE være det. X X Y Y Z Z (X or not Y or not Z) and (not X or Y or Z) and (X or Y or Z) 17
Eksempel på grådighet: Velg det som er optimalt sett helt med lokale øyne. Det viktigste er da å vise at det blir korrekt (med induksjon og/eller bevis ved selvmotsigelse). Minimale spenntrær 18
Spenntrær Har V 1 kanter Har ingen sykler Er ikke nødvendigvis unike 19
Vi bygger oss et sett med kanter. Begynner med en tom mengde, og legger til én og én kant. Invariant: Foreløpig løsning er et subsett av et MST. Trenger ikke være sammenhengende. Når vi har V-1 kanter *må* det jo være riktig. 20
«Trygg» betyr bare at vi ikke bryter invarianten. Så A er et ekte subsett av et MST helt til det faktisk *er* et MST. 1. A er en tom mengde Hvordan finner vi trygge kanter? 2. Så lenge A ikke er et spenntre: a) Finn en kant som er trygg for A b) Legg kanten til i A Induksjon 21
Viktig! Anta at A ikke har noen kanter over «snittet» på figuren. Den letteste kanten er da trygg. (Vi kan ha flere.) Vises lett ved selvmotsigelse. Hvorfor kan det bli galt hvis A allerede krysser snittet? 22
A er en skog Hver trygg kant slår sammen to trær Vi trenger V 1 iterasjoner 23
Trivia: Union-find-strukturen er *supereffektiv*. Den er et eksempel på en av de få kjøretidene i pensum som er raskere enn logaritmisk, men likevel (i teorien) langsommere enn konstant. ( I teorien, fordi det vil være omtrent fysisk umulig for den å komme over 4 ) Se etter Inverse Ackermann i boka eller på nett :-) «I hytt og vær» Se på dekomponering/ reduksjon/rekursjon/ induksjon som perspektiver her Går igjennom kantene i sortert rekkefølge (etter vekt), og hopper over ulovlige kanter (de som gir sykler). Liten ekstra vanskelighet: Hvordan avgjør vi om en kant skaper en sykel? Vi må ha en lur datastruktur som tar vare på trærne i skogen så langt. Kruskals algoritme Union-find: Beskrevet mer i detalj i læreboka. Hovedprinsipp: Alle trær har en peker til sitt «super-tre»/union. 24
Finn MST Sorter kanter Bruk lovlige O(E lg V) Kruskals algoritme 25
Minner om DFS/BFS, men har en annen type «kø»/ valgmekanisme: «Jevnt og fint» Ta alltid noden som det er billigst å koble til treet du har så langt. Her har vi altså hele tiden bare ett tre i A. Traversering Prims algoritme 26
Her er snittet «rundt» treet. 27
Finn MST Traversering Neste: Kortest Raskest i praksis O(V lg V + E) Akkurat det er ikke pensum, men jeg har sett studier som tyder på det :-) (Med vanlig binær heap.) Prims algoritme 28
Substitusjon 29
«Gjett» en løsning Bevis korrekthet med induksjon 30
Induksjon Vil vise P(n) for vilkårlig n Bevis grunntilfelle, P(1) Anta P(k) for k < n Vis at dette medfører P(n) Vi har da P(1), og vet at det medfører P(2), som medfører P(3), osv. 31
T (n) = 1 if n = 1 T (n 1) + 1 if n > 1 Vil vise: T (n) = n Basis: T (1) = 1 Induksjonshypotese: T (k) = k, k < n 32
T (n) = T (n 1) + 1 IH: T (k) = k, der k = n 1 = n 1 + 1 = n QED 33
T (n) = T (n 1) + 1 IH: T (k) = k, der k = n 1 = n 1 + 1 = n QED 34
T (n) = 1 if n = 1 2T (n/2) + n if n > 1 Vil vise: T (n) = n lg n + n Basis: T (n) = 1 = 1 lg 1 + 1 Hypotese: T (k) = k lg k + k, k < n 35
T (n) = 2T ( n 2 ) + n = 2 n 2 lg n 2 + n 2 + n (IH.) = n lg n 2 + n + n = n(lg n lg 2) + n + n = n lg n n + n + n = n lg n + n QED Finurligheter og detaljer på tavla. 36
T (n) = 2T ( n 2 ) + n = 2 n 2 lg n 2 + n 2 + n (IH.) = n lg n 2 + n + n = n(lg n lg 2) + n + n = n lg n n + n + n = n lg n + n QED Finurligheter og detaljer på tavla. 37
Den eksakte formen må bevises! Hvis du ender opp med noe som er nesten det samme (f.eks. ved bruk av asymptotisk notasjon) er ikke beviset gyldig! 38
Variabelskifte 39
Flytter oss til «en enklere verden» Skift funksjon og variabel; går «opp i opp» T(n) = S(m) F.eks. m = lg n, S(m) = T(2m ) 40
T (n) = 2T ( n) + lg n [m = lg n] T (2 m ) = 2T (2 m/2 ) + m [S(m) = T (2 m )] S(m) = 2S(m/2) + m = O(m lg m) T (n) = O(lg n lg lg n) 41
T (n) = 2T ( n) + lg n [m = lg n] T (2 m ) = 2T (2 m/2 ) + m [S(m) = T (2 m )] S(m) = 2S(m/2) + m = O(m lg m) T (n) = O(lg n lg lg n) Legg merke til at alle venstresidene (og høyresidene, for den saks skyld) er like. 42
Her finnes det også (minst) en riktig rekkefølge for Relax, men den må vi oppdage litt etter hvert. Tenk vann som sprer seg i rør: Vi behandler krysningspunktene i den rekkefølgen de fylles. Det må gi oss riktige svar. Altså litt som DAG-SP, men ikke topologisk sortert vi ordner (på magisk vis) etter faktisk avstand. (Hvis vi bare tar med kanter i de korteste stiene så er grafen topologisk sortert ) Dijkstras algoritme 43
I stedet for topologisk rekkefølge: Etter stigende avstand fra s Som BFS men prioritetskø (med d[v]) i stedet for FIFO-kø Takler ikke negative kanter! 44
For spinkle grafer: Bruker binær haug som prioritetskø Må kunne endre nøkler (dvs. d[v]) underveis Må ha kobling mellom mellom noder og haug-innslag Kan evt. legge inn noder flere ganger i stedet 45
Initialiser grafen Så lenge det finnes uferdige noder: Velg u med lavest d[u] For alle kanter (u, v): Relax(u, v) 46
Hvis nodene besøkes etter stigende avstand: Kantene i korteste veier bli relaxet i riktig rekkefølge Topologisk sortering av kantene som «teller» Men Hvordan vet vi at lavest d[v] faktisk er nærmest? 47
Bokas variant av korrekthetsbeviset. Merk: Det er snakk om nok et bevis ved kontradiksjon. Vi antar at d[u] ikke er korrekt i det en node u legges til, og viser at vi får en selvmotsigelse. Den neste er kanskje forelesningens vanskeligste slide. 48
Anta at u er den første som ikke har riktig d- verdi når den legges til. Da må x ha hatt riktig d- verdi, og siden (x, y) er relaxet, så må y også ha riktig d-verdi i det u legges til. d[y] = (s, y) (s, u) d[u] Vi vet her at y forekommer før u på den korteste stien (Merk at x og y godt kan sammenfalle med s her.) Husk også at d er et overestimat av δ. Dette virker bare hvis vi ikke har negative kanter; ellers kan vi ta «snarveier» og vi vet ikke lenger hvilken node som er nærmest. 49 d[u] Men Siden u ble valgt før y så vet vi at d[u] d[y]. d[y] d[y] = (s, y) = (s, u) = d[u] Sandwitch!
Underliggende antagelse: u er den første med galt men minimalt avstandsestimat (blant de hittil ubesøkte). Vi har y med korrekt d d[y] = δ(s, y) Dette viste vi ved å se at det må finnes en y med en forgjenger x rett innenfor og som altså har fått kjørt relax på sin forgjengerkant i den korteste stien, og dermed har korrekt d. u ligger senere på korteste vei δ(s, y) δ(s, u) d[u] men besøkes likevel (feilaktig) Det er denne ulikheten som ikke gjelder hvis vi har negative kanter. Da kan en node tidligere på den korteste stien likevel ligge lenger unna startnoden. d[u] d[y] 50 Vi får altså både d[y] d[u] og d[u] d[y], dvs. d[y] = d[u], med de faktiske avstandene klemt imellom. Med andre ord: Begge avstandene er korrekte likevel og vi har en selvmotsigelse.
(Min egen variant av korrekthetsbeviset litt enklere (IMO) enn det i boka.) Hypotetisk: Vi ordner noder etter faktisk avstand. Vi har positive kanter, så bakoverkantene vil være irrelevante (selv om vi jo ikke vet hvilke de er). Med andre ord har vi en (skjult, ukjent) DAG. Vi ønsker å besøke nodene i avstandsrekkefølge *uten å kjenne til* denne rekkefølgen (eller DAG-en). Induksjon to the rescue Dette beviset antar unike/ forskjellige vekter! 0 3 7??? Vi har besøkt de k 1 første nodene, og relaxet kantene ut. Disse nodene har nå riktig avstandsestimat og det har også den neste i rekka (selv om vi ikke vet hvilken det er ennå). Det er akkurat som i DAG-shortest-path. 51 Betrakt den neste i sortert rekkefølge. Den har korrekt estimat. Alle de gjenværende har større avstand, og minst like store estimater. Dermed må den med lavest estimat være den neste, og vi har løst problemet for k.
Kjøretid avhengig av prioritetskøen. Hver Relax (det vil si, hver kant) kan måtte bruke Decrease-Key som koster O(lg V). Hver Extract-Min (dvs. for hver node) koster også O(lg V). Vi har altså: O(E lg V) + O(V lg V). Hvis alle kan nås fra starten vil E dominere, og vi får O((E+V) lg V) = O(E lg V). Kjøretid: O(E lg V) * * Hvis alle noder kan nås fra s 52
Korteste vei Én til alle Ingen neg. kanter Besøk nærmeste Relax til alle naboer Effektiv Spes. på spinkle G Kravstor O(E lg V) Dette er jo en gjenganger. Jo sterkere krav vi stiller, jo mer effektive er algoritmene. Dijkstras algoritme 53
Floyd-Warshall 54
k er muligens med Delproblem med parameter k: Kan kun gå via de k første nodene. En slik sti kan deles i to mindre delproblemer (med lavere parameter). Alle mellomliggende noder i {1 k 1} 55
! w =, ( ) " ( ) ( ) = ( ) #. +, ( ) ( ) = w " ( ) # = 56
Kubisk kjøretid, naturligvis (, ) ( ) ( ) ( ) ( ( ) 57, ( ) + ( ) ) Transitiv closure: Egentlig akkurat det samme men sjekker om det *finnes* en sti, i stedet for å beregne hvor *lang* den er. (Bruker logiske i stedet for aritmetiske operasjoner.)
k = 0 0 8 5 3 0 2 0 58
k = 1 0 8 5 3 0 8 2 0 59 0 8 5 3 0 2 0
k = 2 0 8 5 3 0 8 5 2 0 60 0 8 5 3 0 8 2 0
k = 3 0 7 5 3 0 8 5 2 0 61 0 8 5 3 0 8 5 2 0
Flyt 62
Et veldig enkelt eksempel på flyt. Hvor mange «uavhengige» stier har vi fra venstre til høyre? Eller: Hvor mange «enheter» kan vi pumpe igjennom, hvis hver kant takler én enhet? 63
64 Som for matching, prøver vi oss. Vi må begynne til venstre (i kildenoden) og ende til høyre (i sluknoden). Her har vi en «augmenting path» med bare ledige kanter.
65 Her fant vi jammen enda en forøkende sti med bare ledige kanter og nå er det fullt.
Matcheproblemet kan også løses så direkte hvis vi har flalks. Men Hva om vi har litt mindre flaks? Da må vi gå i en slags «sikk-sakk» her også. 66
Først en forøkende sti med bare ledige kanter. Men hva gjør vi nå? 67
Vi kan gå *baklengs* over opptatte kanter og oppheve dem akkurat som i matcheproblemet. En slik «bakover-oppheving» tilsvarer en slags krysskobling: Vi lager en ny start og en ny slutt, og spleiser dem sammen med en eksisterende sti (intuitivt). Logikken er egentlig akkurat som for matching. Vi kan fjerne (oppheve/gå baklengs gjennom) en innkommende «full» kant, men da må flyten til den kanten sendes et annet sted nemlig i fremover i en annen kant. Matematisk er det ekvivalent å *øke* flyten *fremover* eller å *redusere* flyten *bakover*. I en flytforøkende sti må hver kant gjøre én av delene. Merk at vi kan gå flere bakoverskritt eller fremoverskritt i rekkefølge (dvs. ikke strengt annenhver, som i «sikk-sakk». 68
69 Svaret blir det samme. Antallet enheter vi får igjennom tilsvarer antall opptatte kanter ut fra kilden (eller inn til sluket).
Det er to mulige tolkninger av dette: Vi «opphever» 5 av de 7 som går mot venstre ved å sende 5 til mot høyre. De 7 mot venstre tilsvarer 7 mot høyre, som kan økes opp mot 0. 4/9 7/8 Vi kan øke med 5 fra venstre til høyre Hva foregår «egentlig»? Ved å øke flyten inn i midt-noden fra venstre og å redusere flyten inn i noden fra høyre med samme mengde har noden samme flyt-sum, så vi ødelegger ingenting. 70
Eksempel Bruker ikke BFS her w 0/2 x 0/3 0/3 s 0/2 0/1 0/3 0/1 0/2 0/3 0/2 t y 0/3 z 71
Eksempel w 0/2 x 0/3 0/3 s 0/2 0/1 0/3 0/1 0/2 0/3 0/2 t y 0/3 z Alle kanter i stien går fremover, og minimums-kapasiteten er 2. 72
Eksempel Her er flyten økt med den maksimale ledige kapasiteten. w 2/2 x 0/3 0/3 s 2/2 0/1 2/3 0/1 2/2 0/3 2/2 t y 0/3 z 73
Eksempel Ny sti denne gangen med noen baklengskanter. I disse ser vi ikke etter ledig kapasitet, men flyt som kan kanselleres. w 2/2 x 0/3 0/3 s 2/2 0/1 2/3 0/1 2/2 0/3 2/2 t y 0/3 z Blant forover-kantene er minste ledige kapasitet 3. Blant bakover-kantene er minste flyt 2. Minimum blir altså 2. 74
Eksempel w 2/2 x 2/3 2/3 s 2/2 0/1 0/3 0/1 0/2 0/3 2/2 t y 2/3 z Igjen er flyten langs stien økt med det maksimale mulige (2). Flyt i fremoverkanter økes flyt i bakover-kanter reduseres. Totalt økes flyten fra s til t uten at vi bryter noen regler. 75
Eksempel w 2/2 x 2/3 2/3 s 2/2 0/1 0/3 0/1 0/2 0/3 2/2 t y 2/3 z Ikke mulig å finne noen flere flytforøkende stier, så vi er ferdige. 76
Eksempel w 2/2 x 2/3 2/3 s 2/2 0/1 0/3 0/1 0/2 0/3 2/2 t y 2/3 z Her er et minimalt snitt, med kapasitet lik maksflyten (4). Det er ikke mulig å presse mer flyt igjennom dette snittet. 77