Vi har skrivit om effektiva algoritmer för att lösa komplexa problem, som kortaste vägen, Euler graph, minimum spänner träd, etc. Det var alla framgångshistorier för algoritmdesigners. I det här inlägget diskuteras felhistorier om datavetenskap.
kan alla beräkningsproblem lösas av en dator? Det finns beräkningsproblem som inte kan lösas med algoritmer även med obegränsad tid. Till exempel Turing stoppande problem (givet ett program och en ingång, om programmet så småningom kommer att stanna när det körs med den inmatningen, eller kommer att köras för alltid). Alan Turing visade att allmän algoritm för att lösa stoppproblemet för alla möjliga programinmatningspar inte kan existera. En viktig del av beviset är att Turing machine användes som en matematisk definition av en dator och ett program (Källstoppsproblem).
Status för NP kompletta problem är en annan felberättelse, NP kompletta problem är problem vars status är okänd. Ingen polynomal tidsalgoritm har ännu upptäckts för något NP-fullständigt problem, och ingen har ännu kunnat bevisa att ingen polynomaltidsalgoritm finns för någon av dem. Den intressanta delen är, om någon av NP kompletta problem kan lösas i polynom tid, då alla av dem kan lösas.
vad är NP, P, NP-complete och NP-Hard problem?
P är en uppsättning problem som kan lösas av en deterministisk Turingmaskin i Polynomtid.
NP är en uppsättning beslutsproblem som kan lösas av en icke-deterministisk Turingmaskin i Polynomtid. P är delmängd av NP (alla problem som kan lösas av deterministisk maskin i polynomtid kan också lösas av icke-deterministisk maskin i polynomtid).informellt är NP uppsättning beslutsproblem som kan lösas med en polynomtid via en” lycklig algoritm”, en magisk algoritm som alltid gör rätt gissning bland den givna uppsättningen val (källa Ref 1).
NP-kompletta problem är de svåraste problemen i NP set. Ett beslutsproblem L är NP-komplett om:
1) L är i NP (en given lösning för NP-kompletta problem kan verifieras snabbt, men det finns ingen effektiv känd lösning).
2) varje problem i NP är reducerbart till L i polynomtid (reduktion definieras nedan).
ett problem är NP-hårt om det följer egenskap 2 som nämns ovan, behöver inte följa egenskap 1. Därför är NP-Complete set också en delmängd av NP-Hard set.
beslut vs optimeringsproblem
NP-fullständighet gäller sfären av beslutsproblem. Det inrättades på detta sätt eftersom det är lättare att jämföra svårigheten med beslutsproblem än optimeringsproblem. I verkligheten kan vi dock lösa ett beslutsproblem i polynomtid ofta tillåta oss att lösa motsvarande optimeringsproblem i polynomtid (med hjälp av ett polynomantal samtal till beslutsproblemet). Så att diskutera svårigheten med beslutsproblem motsvarar ofta verkligen att diskutera svårigheten med optimeringsproblem. (Källa Ref 2).
tänk till exempel på vertex cover-problemet (med en graf, ta reda på den minsta vertexuppsättningen som täcker alla kanter). Det är ett optimeringsproblem. Motsvarande beslutsproblem är, givet oriktad graf G och k, finns det ett vertexskydd av storlek k?
vad är reduktion?
låt L1 och L2 vara två beslutsproblem. Antag att algoritm A2 löser L2. Det vill säga, om y är en ingång för L2 kommer algoritm A2 att svara ja eller nej beroende på om y tillhör L2 eller inte.
tanken är att hitta en omvandling från L1 till L2 så att algoritmen A2 kan vara en del av en algoritm A1 för att lösa L1.
lärande minskning i allmänhet är mycket viktigt. Om vi till exempel har biblioteksfunktioner för att lösa vissa problem och om vi kan minska ett nytt problem till ett av de lösta problemen sparar vi mycket tid. Tänk på exemplet på ett problem där vi måste hitta minsta produktväg i en given riktad graf där produkt av väg är multiplikation av vikter av kanter längs vägen. Om vi har kod för Dijkstras algoritm för att hitta kortaste vägen, kan vi ta logg över alla vikter och använda Dijkstras algoritm för att hitta minsta produktväg snarare än att skriva en ny kod för detta nya problem.
hur bevisar man att ett givet problem är NP komplett?
från definitionen av NP-complete verkar det omöjligt att bevisa att ett problem L är NP-Complete. Per definition, det kräver oss att visa varje problem i NP är polynom tid reducerbar till L. Lyckligtvis, Det finns ett alternativt sätt att bevisa det. Tanken är att ta ett känt NP-komplett problem och minska det till L. Om polynomtidsminskning är möjlig kan vi bevisa att L är NP-komplett genom transitivitet av reduktion (om ett NP-komplett problem är reducerbart till L i polynomtid, då är alla problem reducerbara till L i polynomtid).
vad var det första problemet visade sig vara NP-komplett?
det måste finnas några första NP-komplett problem bevisat per definition av NP-kompletta problem. SAT (Boolean satisfiability problem) är den första NP-komplett problem bevisas av Cook (se CLRS bok för bevis).
det är alltid användbart att veta om NP-fullständighet även för ingenjörer. Antag att du blir ombedd att skriva en effektiv algoritm för att lösa ett extremt viktigt problem för ditt företag. Efter en hel del tänkande, Du kan bara komma upp exponentiell tid strategi som är opraktiskt. Om du inte vet om NP-fullständighet kan du bara säga att jag inte kunde komma med en effektiv algoritm. Om du vet om NP-fullständighet och bevisa att problemet som NP-komplett, kan du stolt säga att polynom tidslösning är osannolikt att existera. Om det finns en polynomtidslösning möjlig, löser den lösningen ett stort problem med datavetenskap många forskare har försökt i flera år.
Vi kommer snart att diskutera fler NP-kompletta problem och deras bevis för NP-fullständighet.