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?
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?
Risposte:
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.
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.
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.
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:
Scrivi un semplice programma che codifica l'istanza del problema come istanza SAT .
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:
Codifica il tuo problema come istanza MAX-SAT (ponderata) .
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.
Un modo per attaccare l'intrattabilità è pensare al problema nel contesto della complessità parametrizzata.
Questi sono alcuni esempi in diverse classi della gerarchia W:
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:
È 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), ...
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:
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).
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.
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.