În teoria complexității computaționale, duritatea NP (duritatea polinomială de timp nedeterministă) este o proprietate definitorie a unei clase de probleme care sunt, în mod informal, „cel puțin la fel de grele ca cele mai grele probleme din NP ”. Un exemplu simplu de problemă NP-hard este problema sumei subsetului .
Definiție formală: O problemă de solubilitate este NP-hard dacă orice problemă din NP poate fi redusă în timp polinomial la . O condiție echivalentă necesită ca fiecare problemă din NP să poată fi rezolvată în timp polinomial cu un oracol pentru [1] [2] . Ca o consecință, un algoritm în timp polinomial pentru rezolvarea oricărei probleme NP-hard va produce algoritmi în timp polinomial pentru toate problemele din NP.
Se crede că nu există algoritmi de timp polinomial pentru problemele NP-hard, dar acest lucru nu a fost dovedit (vezi problema P≠NP ) [3] . Mai mult, clasa P , în care toate problemele sunt rezolvate în timp polinomial, este cuprinsă în clasa NP [4] .
Unele probleme de optimizare NP-hard pot fi aproximate polinomial la un factor de aproximare constant (constant) (în special în APX ) sau chiar la orice factor de aproximare (în PTAS sau FPTAS ).
Problemele NP-hard nu trebuie să fie elemente ale clasei de complexitate NP. Deoarece clasa NP este o clasă cheie în teoria complexității computaționale , este folosită ca bază pentru următoarele clase:
NP O clasă de probleme de decizie computațională pentru care orice decizie pozitivă dată poate fi verificată ca soluție în timp polinomial de o mașină Turing deterministă (sau rezolvată de o mașină Turing nedeterministă în timp polinomial). NP-hard (NP-hard) O clasă de probleme care nu sunt mai puțin dificile decât cele mai grele probleme din NP. Problemele care sunt NP-hard nu trebuie să fie elemente ale NP; de fapt, astfel de probleme pot fi chiar insolubile. NP-complet (NP-complet) O clasă de probleme de rezolvare care conține cele mai dificile probleme din NP. Fiecare problemă NP-completă trebuie să fie în NP și să se reducă la orice altă problemă NP-completă. NP-intermediar (NP-intermediar) O clasă de probleme de solubilitate intermediară între P și NP-complet, presupunând că clasele P și NP sunt diferite. (Dacă P=NP, atunci nu există NP-intermediare, deoarece fiecare problemă din NP (și P) în acest caz se reduce la NP-complete, care la rândul lor în acest caz se află în NP și, în consecință, în P)Problema sumei submulțimii: Un anumit set de numere întregi are un subset nevid al acestora care se însumează până la zero? Aceasta este o problemă de solubilitate și este NP-complet.
Problema vânzătorului ambulant este o problemă de optimizare a găsirii unei rute ciclice cu cel mai mic cost prin toate nodurile unui grafic ponderat. Aceasta este o problemă NP-hard [5] .
O problemă de oprire este o problemă care este NP-hard, dar nu NP-completă. Sarcina este: „Având în vedere un program și intrarea acestuia, programul se va opri?” Este ușor de demonstrat că problema de oprire este NP-hard, dar nu NP-completă - problema de satisfacție booleană poate fi redusă la o problemă de oprire prin convertirea ei într-o descriere a unei mașini Turing care încearcă toate intrările posibile și atunci când găsește una care satisface formula, se oprește, altfel intră într-o buclă infinită. De asemenea, problema opririi nu este conținută în NP, deoarece toate problemele din NP sunt rezolvabile într-un număr finit de operații, iar problema opririi este indecidabilă .
Există probleme NP-hard care nu sunt nici NP-complete, nici indecidabile . De exemplu, limbajul formulelor booleene cuantificate adevărate este decidabil în spațiu polinomial , dar nu în timp polinomial nedeterminist (dacă NP ≠ PSPACE este adevărat ) [6] .
Problemele NP-hard sunt întâlnite cel mai des în domenii precum: