Affrontare l'intrattabilità: problemi NP-completi


43

Supponiamo che io sia un programmatore e ho un problema NP completo che devo risolvere. Quali metodi sono disponibili per affrontare i problemi degli NPC? C'è un sondaggio o qualcosa di simile su questo argomento?


4
Sarà utile indicare quale problema hai.
Dave Clarke,

2
Questa domanda non riguarda un problema specifico. Voglio conoscere le tecniche in modo da poterle applicare in futuro, se necessario.
Anonimo

1
È come chiedere: come posso risolvere un problema in termini polinomiali in generale? Ci sono miliardi di problemi e ognuno ha la sua soluzione specializzata.
Dave Clarke,

3
@DaveClarke: ci sono tecniche consolidate, quindi penso che la domanda sia valida; una domanda più mirata potrebbe essere migliore, però.
Raffaello

Risposte:


54

Esistono diverse strategie ben studiate; quale è il migliore nella tua applicazione dipende dalle circostanze.

  • Migliora il runtime nel caso peggiore
    Utilizzando informazioni specifiche del problema, puoi spesso migliorare l'algoritmo ingenuo. Ad esempio, esistonoalgoritmi per Vertex Cover con c < 1.3 [1]; questo è un enorme miglioramento rispetto all'ingenuo Ω ( 2 n ) e potrebbe rendere trattabili le dimensioni delle istanze rilevanti per te.O(cn)c<1.3Ω(2n)

  • Migliora il tempo di esecuzione previsto
    Utilizzando l'euristica, puoi spesso elaborare algoritmi veloci in molti casi. Se quelli includono la maggior parte di quelli che incontri in pratica, sei d'oro. Esempi sono SAT per i quali esistono solutori abbastanza coinvolti e l'algoritmo Simplex (che risolve un problema polinomiale, ma comunque). Una tecnica di base che è spesso utile è il ramo e il limite .

  • Limita il problema
    Se puoi fare più ipotesi sui tuoi input, il problema potrebbe diventare semplice.

    • Proprietà strutturali I
      tuoi input potrebbero avere proprietà che semplificano la risoluzione del problema, ad es. Planarità, bipartolarità o mancanza di un minore per i grafici. Vedi qui per alcuni esempi di classi di grafici per i quali CLIQUE è facile.

    • O(2knm)kmkn
    • Limitare le quantità di input
      Inoltre, alcuni problemi ammettono algoritmi che vengono eseguiti in tempi pseudo-polinomiali , ovvero il loro runtime è limitato da una funzione polinomiale in un numero che fa parte dell'input; il controllo ingenuo della primalità è un esempio. Ciò significa che se le quantità codificate nelle tue istanze hanno dimensioni ragionevoli, potresti avere semplici algoritmi che si comportano bene per te.
  • Indebolimento del risultato
    Ciò significa che si tollerano risultati errati o incompleti. Esistono due gusti principali:

Consultare Algorithmics for Hard Problems di Hromkovič per un trattamento completo.


  1. La semplicità è bellezza: miglioramento dei limiti superiori per la copertura dei vertici di Chen Jianer, Iyad A. Kanj, Ge Xia (2005)

4
naturalmente è molto improbabile che un algoritmo di Monte Carlo o Las Vegas possa essere eseguito in un momento polifunzionale su un problema NP-difficile
Sasho Nikolov,

12

Altre risposte hanno affrontato questo aspetto da una prospettiva più teorica. Ecco un approccio più pratico.


Per i "tipici" problemi di decisione NP completi ( "esiste qualcosa che soddisfa tutti questi vincoli?" ), Questo è ciò che proverei sempre per primo:

  1. Scrivi un semplice programma che codifica l'istanza del problema come istanza SAT .

  2. Quindi prendi un buon solutore SAT , eseguilo (usando il computer multi-core più veloce che ti capita di avere) e vedi cosa succede.

Prova prima con istanze più piccole per avere un'idea di quanto tempo potrebbe richiedere.


Sorprendentemente spesso, questo approccio è molto meglio che cercare di implementare il proprio risolutore in modo specifico per il problema attuale:

  • I solutori SAT sono molto intelligenti e ottimizzati. Superano facilmente la tua implementazione della ricerca di backtracking (non importa quanto tempo sprechi a ottimizzare il tuo codice). Inoltre, superano facilmente molte alternative, come i solutori di programmazione lineare interi.

  • Ciò richiede pochissima programmazione. Il passaggio 1 è relativamente semplice e non è critico per le prestazioni; puoi usare linguaggi di scripting come Python. Qualcun altro si è già preso cura di implementare tutto ciò di cui hai bisogno per il passaggio 2.


Per i tipici problemi di ottimizzazione NP-hard ( "trova la cosa più piccola che soddisfa tutti questi vincoli" ) questo approccio può o meno funzionare.

Se riesci facilmente a trasformarlo in un problema di decisione ( "esiste un oggetto di dimensione 4 che soddisfa tutti questi vincoli?" , "Che dire di dimensione 3?" ), Ottimo, segui lo stesso approccio di cui sopra con problemi di decisione.

Altrimenti, potresti voler ricorrere a un risolutore euristico che cerca di trovare una soluzione di piccole dimensioni (non necessariamente la soluzione più piccola ). Per esempio:

  1. Codifica il tuo problema come istanza MAX-SAT (ponderata) .

  2. Utilizzare i solutori euristici dal pacchetto UBCSAT . I risolutori euristici si parallelizzano banalmente; prova a trovare un cluster di computer con centinaia di computer. Puoi eseguire i solutori tutto il tempo che vuoi e quindi prendere la migliore soluzione che hai trovato finora.


8

Complessità parametrizzata

Un modo per attaccare l'intrattabilità è pensare al problema nel contesto della complessità parametrizzata.

kf(k)p(n)kf(k)

O(nf(k))

Questi sono alcuni esempi in diverse classi della gerarchia W:

  1. La copertura dei vertici è FPT (così come i percorsi dei vertici disgiunti sui grafici non indirizzati)
  2. Set indipendente e Clique sono entrambi completi di W [1]
  3. Il set dominante è W [2] -Complete.

Questi sono un altro livello di complessità per classificare i problemi NP in modo più preciso e se vuoi di più puoi guardare la complessità dei circuiti parametrizzati e la Gerarchia W di Downey et al (1998).

E se vuoi ancora di più è bene leggere la teoria della complessità parametrizzata di Flum e Grohe .

E infine:

Complessità parametrizzata rispetto agli algoritmi di approssimazione:

È noto che se il problema ha FPTAS ( schema di approssimazione completamente polinomiale ), allora è anche FPT (che è ovvio) Ma non c'è nulla di ben noto nella direzione opposta, ci sono anche alcuni lavori sulla relazione di PTAS e XP, ma lì non è una relazione molto stretta tra PTAS e gerarchia W (almeno non lo so in questo momento).

Inoltre, in alcuni casi possiamo fissare alcuni parametri diversi, ad esempio: la lunghezza di un percorso più lungo nel grafico è limitata e la dimensione di una soluzione è limitata (ad esempio nel set di vertici di feedback), ...

Esempi di usi pratici:

Alcune persone credono che la complessità parametrizzata sia inutile nella pratica. Ma questo è sbagliato. Molti algoritmi parametrizzati vengono scoperti in applicazioni del mondo reale, quando è possibile correggere alcuni parametri, ecco un esempio:

  1. 2...2O(n)2O(k)k=10

  2. Uno degli algoritmi euristici più veloci e accurati per TSP è: fusione dei tour e decomposizione dei rami , che utilizza la parametrizzazione del problema (non direttamente, ma la decomposizione dei rami e l'approccio di programmazione dinamica che hanno usato si basa su alcuni buoni presupposti).


5

La completezza NP riguarda l'intrattabilità del caso peggiore. A seconda del problema su cui si sta lavorando, molte classi di istanze potrebbero essere risolvibili in un tempo ragionevole in pratica (anche se potrebbe essere necessario un algoritmo più specializzato per ottenere i buoni tempi di autonomia).

Considera di vedere se esiste una riduzione efficiente dal tuo problema a un problema con buoni risolutori disponibili, come Boolean Satisfiability o Integer Linear Programming.


4

vivjvkGGutilizzare un algoritmo tollerabile per risolvere il problema in tempo esponenziale . Tra gli algoritmi esponenziali, il tempo di esecuzione di alcuni di essi può essere tollerabile quando la dimensione di input del problema è inferiore a un valore specifico.


2

Anche se brevemente accennato in alcune delle risposte, vorrei sottolineare che in pratica, i problemi NP-completi sono risolti (o approssimati) in ogni momento. Il motivo principale per cui in pratica è possibile risolvere problemi NP-completi è:

Le istanze riscontrate nella pratica non sono "il caso peggiore".

Un altro motivo per la discrepanza è:

È difficile analizzare formalmente algoritmi euristici.

In pratica, usi algoritmi euristici per risolvere i tuoi problemi NP-completi e speri per il meglio. I risultati sono spesso sorprendenti.

Un altro problema affrontato in altre risposte è:

A volte gli algoritmi esponenziali sono abbastanza veloci.

Questo ovviamente dipende dal problema. Quando sono coinvolti i big data, abbiamo la massima opposta:

A volte gli unici algoritmi possibili sono quasilinear.


Temo che la folla qui sia piuttosto teoricamente propensa. Potresti ottenere risposte migliori sul sito principale di stackexchange.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.