Algoritmer, datastrukturer och komplexitet Övningsmästarprovsövning 2 Anton Grensjö grensjo@csc.kth.se 20 november 2017 1
Dagordning 1. Genomgång av uppgiftens lösning 2. Genomgång av bedömningskriterier och bedömningsprotokollet 3. Enskild kamraträttning av skriftlig lösning 4. Diskussion av bedömningarna och utvärdering 5. Rast! 6. Andra timmen: mer NP-fullständighetsbevis och konstruktionsreduktioner Jag kommer gå runt och ta närvaro under steg 3-4. 2
Bevis av NP-fullständighet Säg att vi vill visa att problemet A är NP-fullständigt. Då bör vi utföra följande steg: 1. Visa att A NP. a) Föreslå vad en lösning kan vara. b) Visa att om svaret är ja så kan lösningen verifieras. c) Visa att verifikationen tar polynomisk tid (med avseende på indatastorleken). 2. Visa att A är NP-svårt. a) Hitta ett känt NP-fullständigt problem B att reducera. b) Hitta och beskriv en karp-reduktion av B till A. c) Bevisa att reduktionen är polynomisk (med avseende på indatastorleken). d) Bevisa att reduktionen är korrekt. i) Visa att ja-instanser mappas till ja-instanser och nej-instanser till nej-instanser. Vi vet sedan att B p A. 3. Nu har vi visat att A är NP-fullständigt! 3
Lösning till övningsmästarprov 2
Kortaste omblandade texten Kom ihåg problemet från övningsmästarprov 1: Vi har en text bestående av n ord, med längder w 1,..., w n. Texten ska nu skrivas ner på ett antal rader, där det får plats precis len tecken på varje rad. Ordens ordning får ej ändras. Två ord som står direkt efter varandra på samma rad måste skiljas med ett mellanslag. Vad är det minimala antalet rader som krävs för att skriva ner hela texten? Nu plockar vi bort kravet att orden måste placeras i samma ordning som i indata. Nytt problem: Vad är det minimala antalet rader av längd len som de n orden kan rymmas på om det är tillåtet att blanda om orden? 4
Kortaste omblandade texten Vad är det minimala antalet rader av längd len som de n orden kan rymmas på om det är tillåtet att blanda om orden? Formulera om detta optimeringsproblem som ett beslutsproblem (genom att införa ett mål). Bevisa sedan att beslutsproblemet är NP-fullständigt. Formulering av beslutsproblem: Inför ett mål K. Indata: Ordlängder {w i } n i=1, radlängd len, mål K. Alla tal är positiva heltal och alla ordlängder är högst len. Ny fråga: Går det att pussla in alla n ord på K rader av längd len så att det finns ett mellanslag mellan varje par av närliggande ord på samma rad? 5
Kortaste omblandade texten - NP-tillhörighet Låt oss visa att problemet ligger i NP. För varje ja-instans ska en lösning kunna verifieras i polynomisk tid. Låt lösningen vara en utplacering av orden på K rader, representerad som en funktion f : {1, 2,..., n} {1, 2,..., K}, som för varje ord anger vilken rad det ska placeras på. För att verifiera denna lösning, kolla att längden på varje rad inte blir större än len (inklusive mellanslag). Om K n finns det trivialt en lösning (ett ord på varje rad), så i detta fall kan vi direkt returnera true. 6
Kortaste omblandade texten - NP-tillhörighet 1: function TextPackningVerify({w i } n i=1, len, K, f : {1,.., n} {1,.., K}) 2: if K n then 3: return true 4: rowlen heltalsarray av längd K 5: for i 1 to K do 6: rowlen[i] 0 7: for i 1 to n do 8: row f(i) 9: if rowlen[row] > 0 then om raden inte är tom 10: rowlen[row] rowlen[row] + 1 lägg till mellanslag 11: rowlen[row] rowlen[row] + w i 12: if rowlen[row] > len then 13: return false 14: return true Tidskomplexitet: O(n) med enhetskostnad (OBS rad 2-3 viktiga!). 7
Kortaste omblandade texten - NP-tillhörighet Tidskomplexitet: O(n) med enhetskostnad. Hur blir det med bitkostnad? Låt m vara antalet bitar i indata. Alla additioner och jämförelser görs på O(m) tid, och således ligger tidskomplexiteten i O(nm). Notera även att n O(m), eftersom det finns n ordlängder i indata, och varje ordlängd måste bestå av minst en bit. Alltså ligger tidskomplexiteten även i O(m 2 ), och är således polynomisk med avseende på indatas längd. 8
Kortaste omblandade texten - NP-svårt Det återstår att visa att problemet är NP-svårt. Vi väljer att reducera problemet mängdpartitionering. Givet en multimängd positiva heltal, går det att partitionera talen i två delar som har samma summa? Idé: Låt varje tal i indata till mängdpartitionering motsvaras av en ordlängd i textpackningsproblemet. Låt K = 2. De två raderna i textpackningsproblemet får då en liknande funktion som de två mängderna i mängdpartitionering. Tanken är att det ska gå att placera alla ord på två rader om och endast om vi kan partitionera talen i två mängder med samma summa. Välj en radlängd så att alla orden precis får plats, utan något överblivet utrymme. Om orden kan placeras måste då antalet bokstäver vara samma på bägge raderna, vilket motsvarar att de två mängderna har samma summa. 9
Kortaste omblandade texten - NP-svårt Problem: vi måste ha mellanslag mellan efterföljande ord på samma rad Låt ordlängden vara 1 mindre än motsvarande tal från mängdpartitionering. Inklusive mellanslag blir då längden samma. Att inget mellanslag krävs sist på en rad kan vi korrigera för genom att minska radlängden med 1. Problem: alla ord måste ha positiv längd i textpackningsproblemet, men med nuvarande idé kommer talet 1 att ge ordlängden 0. Börja med att multiplicera alla tal med 2 (eller någon annan heltalskonstant större än 1). På så sätt kommer vi alltid fortfarande ha ett positivt tal när vi subtraherar 1. 10
Kortaste omblandade texten - NP-svårt 1: function Mängdpartitionering({s i } n i=1 ) 2: σ 0 3: for i 1 to n do 4: w i 2s i 1 5: σ σ + s i 6: len σ 1 7: K 2 8: return TextPackning({w i } n i=1, len, K) Tidskomplexitet: Låt m vara antalet bitar i indata. n O(m) eftersom varje s i utgör minst en indatabit. Alla tals storlek begränsade av m, så alla additioner och subtraktioner går på O(m) tid med bitkostnad. = tidskomplexiteten ligger i O(m 2 ) och är alltså polynomisk med avseende på indatas längd. 11
Kortaste omblandade texten - NP-svårt Korrekthet för reduktionen: Vi ska visa att 1. Varje ja-instans av mängdpartitionering transformeras till en ja-instans av textpackning 2. Varje nej-instans av mängdpartitionering transformeras till en nej-instans av textpackning Punkt 2 är ekvivalent med att för varje ja-instans av textpackning som kan skapas av transformationen så är motsvarande instans av mängdpartitionering också en ja-instans. 12
Kortaste omblandade texten - NP-svårt Visa ja-instans av mängdpartitionering = ja-instans av textpackning Antag att vi har en ja-instans av mängdpartitionering, dvs det finns en partitionering av {s i } n i=1 i A och B, så att summan av talen i A är lika med summan av talen i B. Låt σ = n i=1 s i. Eftersom A och B har samma summa måste denna summa vara σ/2. Konstruera nu en textpackningsinstans enligt reduktionen, dvs med K = 2 och len = σ 1. Placera talen i A på första raden och talen i B på andra raden. Varje radlängd blir då 2(σ/2) 1 = σ 1. 2(σ/2) eftersom vi summan av de ursprungliga talen var σ/2, varje ord inkl. mellanslag är lika långt som motsvarande tal, och vi dubblerade alla tal. 1 eftersom sista ordet på varje rad inte har något mellanslag efter sig. Textpackningen uppfyller alltså villkoret! 13
Kortaste omblandade texten - NP-svårt Visa att om vi fick en ja-instans av textpackning från vår reduktion så var den ursprungliga instansen av mängdpartitionering en ja-instans. Antag att vi har en textpackning på två rader av längd σ 1. Lägg till ett mellanslag efter sista ordet på varje rad. Summan av alla ordlängder på varje rad inklusive mellanslag är nu högst σ, och motsvarande tal har då summan högst σ/2. Eftersom summan av alla tal är σ måste summan av talen som placerades på respektive rad vara exakt σ/2. Således får vi en jämn partitionering om vi låter A vara talen som motsvarar orden på första raden, och B övriga. Eftersom reduktionen är korrekt och polynomisk är textpackning NP-svårt. Vi visade även innan att textpackning ligger i NP, och således är problemet även NP-fullständigt. 14
Bedömning av övningsmästarprovet
Kamratbedömning! OBS: kom ihåg att man inte behöver bli godkänd på övningsmästarprovet för att få sin bonuspoäng. 1. Leta reda på personen med samma siffra som du. 2. Byt lösningar med varandra inom gruppen. 3. Bedöm din kamrats lösning enligt instruktionerna och fyll i bedömningsprotokollet. 4. När båda är klara ska ni diskutera med varandra inom gruppen: Förklara varför ni bedömde som ni gjorde Försök att komplettera lösningarna så de skulle blivit godkända vid en ny bedömning 5. Fyll i utvärderingen. 6. Lämna in era lösningar och utvärderingar. Vi fortsätter med vanlig övning efter pausen, preliminärt kl 14:15. Då kommer vi ta fler exempel på NP-fullständighetsbevis och konstruktionsreduktioner. 15
Mer NP-fullständighetsbevis
Konspirationsdetektionsproblemet Detta problem var uppgift 2 på Mästarprov 2 år 2015. Du ska hjälpa Foliehattarnas Riksförbund att hitta möjliga konspirationer i sociala nätverk. Ett socialt nätverk består i denna uppgift av en uppsättning personer, tillsammans med information om vilka par av personer som är bekanta med varandra. En konspiration består av en mängd konspiratörer, samt en spindel i nätet, och uppfyller följande: Spindeln i nätet är bekant med alla konspiratörer. Ingen av konspiratörerna är bekant med någon annan konspiratör. Varje person som inte redan är konspiratör eller spindeln i nätet är bekant med någon av konspiratörerna. Att avgöra om en viss person kan vara spindeln i nätet för en möjlig konspiration är svårt. Visa att detta problem är NP-fullständigt. 16
Konspirationsdetektionsproblemet Anta att nätverket består av en mångd personer P och en mängd bekanskapspar A av personer som är bekanta med varandra. Den förmodade spindeln kallas X. Tillhör problemet NP? Låt oss visa att en ja-lösning till beslutsproblemet kan verifieras i polynomisk tid. Låt lösningen vara mängden konspiratörer, C P. Vi behöver kontrollera följande: Att ingen konspiratör är bekant med en annan konspiratör. Att varje konspiratör är bekant med spindeln. Att varje persion i nätverket som inte redan är konspiratör eller spindeln är bekant med minst en konspiratör. 17
Konspirationsdetektionsproblemet Tidskomplexitet: Om vi representerar A som en boolesk P P -matris tar verifikationen tid O( P 2 ), vilket är polynomiskt. Alltså ligger konspirationsdetektionsproblemet i NP. 18
Konspirationsdetektionsproblemet Visa att problemet är NP-svårt. Vilket problem ska vi reducera? 3CNF-SAT För varje variabel x i skapar vi två personer som är bekanta med varandra en som representerar x i och en som representerar x i. Vi skapar en spindel, som är bekant med alla variabelpersoner. Alltså blir varje variabelperson en möjlig konspiratör, men de två personer som representerar samma variabel kan inte båda vara konspiratörer. Vi skapar också en person för varje klausul. Varje klausulperson är bekant med personerna som motsvarar de literaler som ingår i klausulen. 19
Konspirationsdetektionsproblemet Tidskomplexitet: linjär i n och m. Eftersom både n och m begränsas av indatas längd är reduktionen polynomisk. 20
Konspirationsdetektionsproblemet Korrekthet: 1. Visa att om det ϕ är satisfierbar så finns det en konspiration. Antag att det finns en variabeltilldelning som satisfierar ϕ. Låt konspiratörerna vara de n personer som motsvarar variabeltilldelningen, dvs Om x k är sann så ska xp k vara konspiratör. Om x k är falsk så ska xn k vara konspiratör. Dessa konspiratörer är alla bekanta med spindeln men inte med varandra. Eftersom varje klausul är satisfierad, så är motsvarande klausulperson bekant med minst en konspiratör den konspiratör som motsvarar den sanna literalen i klausulen. Alltså har vi en konspiration! 21
Konspirationsdetektionsproblemet 2. Visa att om vår reduktion resulterade i en ja-instans av konspirationsdetektion så är den ursprungliga 3CNFSAT-formeln ϕ satisfierbar. Antag att vi har en konspiration. xp k och xn k är bekanta med varandra och med spindeln men inte med någon annan potentiell konspiratör. Alltså måste exakt en av dem vara konspiratör. Om xp k är konspiratör låter vi x k vara sann, och om xn k är konspiratör låter vi x k vara falsk. Detta ger oss en variabeltilldelning. För varje j: Tilldelningen satisfierar klausulen c j eftersom klausulpersonen cl j (som inte är en konspiratör) måste vara bekant med någon konspiratör, och de enda konspiratörer cl j är bekant med motsvarar tilldelade variabler. Således satisfierar variabeltilldelningen hela formeln ϕ. Slutsats: konspirationsdetektionsproblemet är NP-fullständigt. 22
Vänner och fiender Detta problem kommer från ett mästarprov år 2003. Du ska bjuda in till fest, men har svårt att bestämma dig för vilka personer du ska bjuda. Din bekantskapskrets kan representeras som en oriktad graf G med två olika sorters kanter: vänkanter och fiendekanter. G = (V, E v, E f ), där V är personer/hörn, E v är mängden vänkanter, E f är mängden fiendekanter. Gästlistan L till din fest måste uppfylla följande krav: Om v bjuds in så måste också alla vänner till v bjudas in (annars blir de ledsna). Om v bjuds in så får inga fiender till v bjudas in (annars blir det dålig stämning). 23
Vänner och fiender G = (V, E v, E f ), där V är personer/hörn, E v är mängden vänkanter, E f är mängden fiendekanter. Gästlistan L till din fest måste uppfylla följande krav: Om v bjuds in så måste också alla vänner till v bjudas in (annars blir de ledsna). Om v bjuds in så får inga fiender till v bjudas in (annars blir det dålig stämning). Fråga: Givet en bekantskapskretsgraf, vilket är det största antalet personer du kan bjuda till festen? Formulera som beslutsproblem, samt bevisa att beslutsproblemet är NP-fullständigt. 24
Vänner och fiender Vi inför ett mål K, och frågar oss istället: kan vi bjuda minst K personer till festen? Visa att problemet tillhör NP: Låt lösningen bestå av en mängd L av gäster. För att verifiera lösningen, gör följande: Kontrollera först att L K. Gå igenom varje vänkant (u, v) och verifiera att antingen både u och v eller ingen av dem är bjuden. Gå igenom varje fiendekant (u, v) och verifiera att högst en av u och v är bjuden. Detta går att göra på polynomisk tid. 25
Vänner och fiender Visa att problemet är NP-svårt. Vilket problem ska vi reducera? Oberoende mängd! Givet en instans av oberoende mängd, som är en graf G = (V, E), vill vi skapa en instans av Vänner och fiender. Låt V vara hörnen, låt E vara mängden fiendekanter, och låt den tomma mängden vara vänkanterna. Låt målet K vara detsamma. 1: function IndependentSet(V, E, K) 2: return FriendsAndEnemies(V,, E, K) Reduktionen går på konstant tid, och är alltså polynomisk med avseende på indatas längd. 26
Vänner och fiender Korrekthet: 1. Visa att om vi har en ja-instans av oberoende mängd så kommer vår reduktion ge en ja-instans av Vänner och fiender. Antag att det existerar en oberoende mängd L i indatagrafen. Det inte finns någon kant mellan något par av noder i L. L är då också en giltig gästlista, ty: Det finns inga vänner i nätverket, så det första kravet är trivialt uppfyllt. Eftersom den ursprungliga kantmängden är samma som mängden fiendekanter och L är en oberoende mängd så finns det inget par av personer på listan som är fiende med varandra. 27
Vänner och fiender 2. Visa att om vi får ut en ja-instans av Vänner och fiender från vår reduktion så måste den ursprungliga instansen av oberoende mängd vara en ja-instans. Antag att det finns en giltig gästlista L. Den uppfyller att inget par av personer på listan är fiender med varandra. L är då också en giltig oberoende mängd, eftersom mängden fiendekanter är samma som den ursprungliga kantmängden i instansen av oberoende mängd. Slutsats: problemet är NP-svårt. Eftersom det även ligger i NP är det dessutom NP-fullständigt. 28
Konstruktion av Vänner och fiender Betrakta återigen problemet Vänner och fiender. Antag att det finns en algoritm FriendsEnemies(V, E v, E f ) som löser beslutsproblemet. Konstruera en polynomisk turingreduktion av konstruktionsproblemet till beslutsproblemet. I konstruktionsproblemet ska man konstruera (skriva ut) en gästlista av maximal storlek. 29
Konstruktion av Vänner och fiender Först behöver vi kunna lösa optimeringsproblemet för att hitta det maximala möjliga antalet gäster. Vi reducerar optimeringsproblemet till beslutsproblemet genom att binärsöka över målet K från 0 till V (se föreläsning 20 för detaljer). Givet detta, hur löser vi konstruktionsproblemet? Idén är samma som i problemet Konstruktion av kappsäckslösning från övning 10: Använd beslutsproblemet för att avgöra om ett element är nödvändigt i en optimal lösning. Vi vill alltså för en viss nod v kunna testa: finns det en optimal lösning om inte innehåller v? För kappsäckskonstruktionen kunde vi bara plocka bort ett föremål för att testa om det var nödvändigt. Det fungerar inte här. Varför inte? 30
Konstruktion av Vänner och fiender För kappsäckskonstruktionen kunde vi bara plocka bort ett föremål för att testa om det var nödvändigt. Det fungerar inte här. Varför inte? Att plocka bort en nod ur grafen kan få stora konsekvenser för probleminstansen. Till exempel kan det maximala antalet gäster öka om man plockar bort en nod (se exempel på tavlan)... Vi måste alltså hitta en annan metod för att kolla detta. Idéer? Hint: gadget 31
Konstruktion av Vänner och fiender Inför en gadget bestående av tre noder: Gud, Djävulen och Judas. Gud och Djävulen är fiender, men Judas är vän med båda. Judas kan alltså aldrig vara med i en giltig vänlista. = någon som känner Judas kan aldrig vara med i en giltig vänlista. Att koppla ihop en nod v med Judas och sedan anropa beslutsproblemet är alltså ett bra sätt att kontrollera om det finns en maximal vänlista som inte innehåller v. 32
Konstruktion av Vänner och fiender 1: function FriendsEnemiesConstruction(V, E v, E f ) 2: K opt FriendsEnemiesOpt(V, E v, E f ) 3: V V {v G, v D, v J } 4: E v E v {(v J, v G ), (v J, v D )} 5: E f E f {(v G, v D )} 6: L V 7: for varje nod v V do 8: if FriendsEnemies(V, E v {(v, v J )}, E f ) then 9: L L {v} 10: return L Vi gör O( V + log V ) = O( V ) anrop av beslutsproblemet, och reduktionen är bortsett från detta linjär i storleken på grafen. Alltså är detta en polynomisk turingreduktion. 33
Konstruktion av Vänner och fiender Korrekthet Det finns en delmängd till L som är en lösning, ty detta är dels uppfyllt innan slingan, och dels efter varje iteration. L innehåller inga överflödiga element, ty for-slingan löper över alla element i V och tar bort de som vi kan klara oss utan. = L är en lösning 34
Nästa gång Hur kan vi hantera NP-fullständiga problem i praktiken? Approximationsalgoritmer Mina slides ligger på Canvas under Moduler/Antons övningsmaterial. 35