COMPUTABILITY BERÄKNINGSBARHET Källa: Goldschlager, Lister: Computer Science A Modern Introduction 2. upplaga 1988, Prentice Hall Den centrala frågan: givet ett problem, kan det ha en algoritmisk lösning? Every definite mathematical problem must necessarily be susceptible of an exact settlement either in the form of an actual answer to the question asked, or by the proof of the impossibility of its solution and therewith the necessary failure of all attempts [...] one of the things that attracts us most when we apply ourselves to a mathematical problem is precisely that within us we always hear the call: here is the problem, search for the solution; you can find it by pure thought, for in mathematics there is nothing which cannot be known. Hade Hilbert rätt? David Hilbert (1862-1943) Hilberts mål: att utveckla ett formellt matematiskt system där man exakt kunde formulera alla problem i termer av satser som antingen är sanna eller falska. Att hitta en algoritm, som given en av dessa satser skulle bestämma om satsen var sann eller falsk (Entscheidungsproblem). Exakt formulerad sats Hilberts algoritm sant falskt Introduktion till datateknik/cs4, A. Soini 1
Matematisk forskning på 1930-talet före de första datorerna! - har visat att Entscheidungsproblemet inte är beräkningsbart (computable). Dvs., ingen sådan algoritm som Hilbert ville utveckla existerar eller kan existera. Church-Turing tes: 1)Alla (vettiga) definitioner av 'algoritm' är ekvivalenta. 2)Alla (vettiga) definitioner av algoritm som någon någonsin kommer att framföra, kommer att visa sig vara ekvivalenta med de redan kända definitionerna. Alla datorer är ekvivalenta. Om man kan exekvera en algoritm på en dator, så kan den exekveras på vilken dator som helst. Alla datorer kan simulera varandra. (Universality). Tesen är allmänt accepterad ingen har kommit med motbevis. Ett exempel på ett oberäkningsbart problem (ingen algoritm existerar eller kan existera) the halting problem: Eviga loopar är tråkiga. Tänk så praktiskt det skulle vara, om vi kunde skriva ett testprogram, halttester, som testar om ett givet program P kan gå i en evig loop. När vi nu vill testa ett nytt program, ger vi programmet P med testdata D som input till halttester: P D halttester(p,d) skriv 'OK' (P(D) stannar) skriv 'BAD' (P(D) loopar evigt) och stanna och stanna. Introduktion till datateknik/cs4, A. Soini 2
Halttester själv måste alltså stanna så att vi får vettiga resultat utav det. Tänk nu, att vi vill använda själva programkoden P som testdata för P (det kan verka suspekt, men program som opererar på andra program eller t o m sig själva är inte alls ovanliga). Vi vill alltså veta, om P stannar med input P: P halttester(p,p) P(P) stannar P(P) stannar inte skriv 'OK' och stanna skriv 'BAD' och stanna Detta nya program som testar P med sin egen kod kan vi kalla newhalttester. Koden för den blir enkel: program newhalttester(p) {anrop till} halttester(p,p); Med dessa två trevliga testprogram kan vi nu konstruera ett till: program funny(p) if newhalttester(p) skriver 'BAD' then halt else loop forever; Funny gör alltså inte så mycket vettigt; om programmet P är ok, så går funny i en evig loop, men om P har en evig loop, så stannar funny: Introduktion till datateknik/cs4, A. Soini 3
P Funny: stannar P(P)? Ja gå i en evig loop Nej stanna Detta var alltså funny(p) funny med indata P. Som sista steg vill vi testa vad som händer, om vi matar koden för själva funny till funny, alltså funny(funny): funny funny(funny) stannar det? Om det testade programmet stannar, ska ju funny loopa evigt. Och om det testade programmet innehåller en evig loop, så ska funny stanna. Så... Ja och loopa evigt! Nej och stanna! Om funny alltså stannar så loopar det för evigt. Och om det inte stannar så Introduktion till datateknik/cs4, A. Soini 4
stannar det. Vi har kommit fram till en logisk omöjlighet alltså måste vi ha ett fel i premisserna. Men det ena enda vi antagit är att programmet halttester existerar... Således: med bevismetoden reductio ad absurdum har vi bevisat att halttester inte kan existera. Antagandet av dess existens leder till absurditeter. Ett annat omöjligt problem är ex. en algoritm som skulle testa om två program, P1 och P2, alltid fungerar på exakt samma sätt. Det går att bevisa att vi inte kan skriva ett sådant testprogram heller. Introduktion till datateknik/cs4, A. Soini 5
Infeasible problems väldigt opraktiska problem: Om vi lämnar de problem som inte kan ha en algoritmisk lösning, och koncentrerar oss till dem som har en sådan, måste vi dock konstatera att en stor del av dessa lösningar inte är till någon nytta. De kan vara korta, enkla och eleganta, men de kräver astronomiska tider för att exekvera. De tillhör effektivitetsklassen O(2 n ) eller ett konstant c upphöjt till n. Så fort n (antalet dataenheter att analysera) hamnar i exponentposition har vi alltså problem; så fort n inte längre är trivialt litet, blir exekveringstiden astronomisk. Bin-packing problem: Vi har ett antal lastbilar med maximumkapacitet w kg, och en hel hög olika tunga paket som borde lastas på bilarna. Frågan är: kan vi klara av att transportera alla paketen med T stycken bilar? 3 3 4 5 8 5 T = 2 w = 14 ton Som du ser, borde nog kapaciteten räcka till. Men hur ska bilarna lastas? Vilken algoritm ska man tillämpa? Hur skulle man komma fram till en allmän lösning? Introduktion till datateknik/cs4, A. Soini 6
Largest crate first skulle ge den första bilen 8+5 ton, men de resterande småpaketen skulle väga tillsammans 3+3+4+5=15 ton, ett för mycket. 3+3+8 4+5+5 När antalet kollin och bilar är så här litet är det inget problem att beräkna alla tänkbara permutationer, och testa vilka som passar. Annat blir det med större antal bil och kollin som ska transporteras. Det existerar ingen polynomiell algoritm som skulle lösa frågan. Den stora teoretiska frågan är om det överhuvudtaget kan existera en sådan. Därom strida de lärda... Introduktion till datateknik/cs4, A. Soini 7
Ett annat opraktiskt problem - Traveling salesman: Vi har en handelsresande som borde besöka ett antal städer. Givet en karta med N städer, är det möjligt att besöka dem alla exakt en gång, inom en viss kilometerbegränsning? Ett relaterat problem är den hamiltonska cykeln: är det överhuvudtaget möjligt att besöka varje stad exakt en gång, givet en karta? Inga flygresor är tillåtna... Inget av dessa problem har en polynomiellt bunden lösning. Men vi vet inte om de kan ha en... Hur skulle du gå till väga för att lösa problemet? Introduktion till datateknik/cs4, A. Soini 8
Problemen vi tittade på ovan som saknar polynomiellt bundna algoritmer (dvs. sådana där n hoppar ner från exponentpositionen) hör till en specialklass som kallas NP-kompletta. NP-kompletta problem har en trevlig egenskap gemensamt: om vi på ett eller annat sätt hittar en lösning som fungerar, då finns det en polynomiell, snabb algoritm som kan verifiera att lösningen i fråga är korrekt. Tyvärr hjälper denna algoritm oss inte att finna nya lösningar... Stephen Cook (1971): Om man finner en polynomiellt bunden lösning till ett av problemen i mängden av de NP-kompletta dito, då får man en lösning till alla problemen i denna mängd. Återigen, ingen har ännu kommit med denna lösning. Men, å andra sidan, ingen har lyckats bevisa att en sådan algoritm inte kan existera. Introduktion till datateknik/cs4, A. Soini 9