Perché non ci sono algoritmi di approssimazione per SAT e altri problemi decisionali?


18

Ho un problema decisionale NP-completo. Data un'istanza del problema, vorrei progettare un algoritmo che genera SÌ, se il problema è fattibile e, NO, altrimenti. (Naturalmente, se l'algoritmo non è ottimale, commetterà errori.)

Non riesco a trovare alcun algoritmo di approssimazione per tali problemi. Stavo cercando specificamente SAT e ho trovato nella pagina Wikipedia sull'algoritmo di approssimazione quanto segue: Un'altra limitazione dell'approccio è che si applica solo a problemi di ottimizzazione e non a problemi di decisione "puri" come la soddisfacibilità, sebbene spesso sia possibile .. .

Perché, ad esempio, non definiamo il rapporto di approssimazione come qualcosa di proporzionale al numero di errori che l'algoritmo commette? Come possiamo effettivamente risolvere i problemi decisionali in modo avido e non ottimale?


5
Esistono algoritmi di approssimazione per MAX-SAT.
Yuval Filmus,

2
MAX-SAT non è un problema decisionale, no?
Ribz,

15
Gli algoritmi di approssimazione sono sempre per problemi di ottimizzazione.
Yuval Filmus,

4
Quindi, fondamentalmente, vuoi avere un algoritmo che termina rapidamente, ma a volte è permesso dare una risposta sbagliata. Penso che tu stia confondendo enormemente i problemi usando termini ben definiti come "algoritmo di approssimazione" e "ottimale" qui. Quelli hanno significati molto specifici. Immagino invece che tu stia cercando un euristico - se aggiorni la tua domanda con quel termine (o inizi da zero con una nuova domanda per evitare ancora più confusione), potresti avere risultati migliori.
AnoE

Sebbene questa non sia una risposta completa, spiega una parte del motivo: esistono importanti problemi SAT per i quali avere solo un bit basso sbagliato non è meglio di essere metà errori.
Joshua,

Risposte:


33

Gli algoritmi di approssimazione sono solo per problemi di ottimizzazione, non per problemi di decisione.

Perché non definiamo il rapporto di approssimazione come la frazione di errori commessa da un algoritmo quando si cerca di risolvere qualche problema decisionale? Perché "il rapporto di approssimazione" è un termine con un significato ben definito e standard, uno che significa qualcos'altro, e sarebbe confuso usare lo stesso termine per due cose diverse.

OK, potremmo definire qualche altro rapporto (chiamiamolo qualcos'altro, ad esempio "det-ratio") che quantifica il numero di errori che un algoritmo commette, per qualche problema decisionale? Bene, non è chiaro come farlo. Quale sarebbe il denominatore per quella frazione? Oppure, per dirla in un altro modo: ci sarà un numero infinito di istanze problematiche, e per alcune di esse l'algoritmo darà la risposta giusta e altre darà la risposta sbagliata, quindi finirai con un rapporto che è "qualcosa diviso per l'infinito", e che finisce per essere insignificante o non definito.

In alternativa, potremmo definire come la frazione di errori degli errori dell'algoritmo, su istanze problematiche di dimensione n . Quindi, potremmo calcolare il limite di r n come n , se esiste un tale limite. Questo sarebbernnrnnessere ben definito (se esiste il limite). Tuttavia, nella maggior parte dei casi, questo potrebbe non essere terribilmente utile. In particolare, assume implicitamente una distribuzione uniforme sulle istanze problematiche. Tuttavia, nel mondo reale, l'effettiva distribuzione sulle istanze problematiche potrebbe non essere uniforme - è spesso molto lontana dall'uniforme. Di conseguenza, il numero che ottieni in questo modo spesso non è così utile come potresti sperare: spesso dà un'impressione fuorviante di quanto sia buono l'algoritmo.

Per saperne di più su come le persone affrontano l'intrattabilità (durezza NP), dai un'occhiata a Come trattare l' intrattabilità: problemi NP-completi .


3
+1. Ma l'ultimo punto non è solido, si potrebbe sostenere che è possibile definire il rapporto di approssimazione come limite poiché n va all'infinito del numero di errori che il programma commette immettendo lunghezza n sul numero di stringhe di lunghezza n. Questo ovviamente risulta non utile, in quanto spesso un semplice programma che genera semplicemente "SÌ" (o "NO") raggiunge un buon rapporto (a volte anche 1!).
aelguindy,

1
@det, questa è una domanda separata, che dovresti porre separatamente (dopo averlo letto nei libri di testo standard o nelle risorse online). Preferiamo che tu faccia solo una domanda per post.
DW

1
@aelguindy, buon punto. Ho aggiornato la mia risposta di conseguenza.
DW

2
@det Perché avido? Cosa significa "quasi" risolvere un problema decisionale?
Raffaello

2
@Mehrdad: di solito si valuta un algoritmo di approssimazione dal suo errore peggiore: un limite superiore a quanto non ottimale sia mai. Quindi, ad esempio, potresti dire che un determinato algoritmo di approssimazione trova sempre un risultato che è almeno cinque-sesti del risultato ottimale. Non c'è modo reale di tradurlo in un problema decisionale; se il tuo algoritmo a volte emette (diciamo) 0.1, allora o a volte è spento di 0.9 (nel qual caso faresti meglio, nel peggiore dei casi, a emettere sempre 0,5), oppure il "approssimativo" -ness è un falso e "0.1 "in realtà significa solo" 0 ".
ruakh,

14

Il motivo per cui non si vedono cose come i rapporti di approssimazione nei problemi decisionali è che generalmente non hanno senso nel contesto delle domande che si pongono in genere sui problemi decisionali. In un'impostazione di ottimizzazione, ha senso perché è utile essere "vicini". In molti ambienti, non ha senso. Non ha senso vedere quanto spesso sei "vicino" in un problema di logaritmo discreto. Non ha senso vedere quanto spesso sei "vicino" alla ricerca di un isomero grafico. Allo stesso modo, nella maggior parte dei problemi decisionali, non ha senso essere "vicini" alla decisione giusta.

Ora, nelle implementazioni pratiche, ci sono molti casi in cui è utile sapere quale parte dei problemi può essere decisa "rapidamente" e quale parte no. Tuttavia, a differenza dell'ottimizzazione, non esiste un metodo unico per quantificarlo. Puoi farlo statisticamente, come suggerisci, ma solo se conosci la distribuzione statistica dei tuoi input. Il più delle volte, le persone interessate a problemi di decisione non sono così fortunate ad avere tali distribuzioni.

Come caso di studio, considera il problema dell'arresto. È noto che il problema dell'arresto è indecidibile. È un peccato, perché è un problema davvero utile da risolvere se stai facendo un compilatore. In pratica, tuttavia, scopriamo che la maggior parte dei programmi sono in realtà molto facili da analizzare dal punto di vista del problema. I compilatori ne approfittano per generare codice ottimale in queste circostanze. Tuttavia, un compilatore deve riconoscere che esiste la possibilità che un determinato blocco di codice non sia decidibile. Qualsiasi programma che si basa sul fatto che il codice sia "probabilmente decidibile" può avere problemi.

Tuttavia, la metrica utilizzata dai compilatori per determinare quanto riescono a risolvere questi casi particolari del problema di arresto è molto diversa da una metrica utilizzata da un programma di crittografia per verificare se una particolare coppia di numeri primi è accettabilmente indurita contro gli attacchi. Non esiste una taglia unica per tutte le soluzioni. Se si desidera una tale metrica, sarà necessario adattarla per adattarsi ai propri problemi specifici, spazio e logica aziendale.


Quindi, a quanto ho capito, l'unico modo per risolvere un problema decisionale è progettare l'algoritmo ottimale che può essere molto inefficiente? Perché ho un problema decisionale (NP-completo) e mi è stato chiesto di trovare un algoritmo avido (veloce) per trovare una soluzione. Come posso risolvere questo? Conosci qualche articolo incentrato su questo tipo di problemi?
Ribz,

1
@det Torna indietro e ripristina il problema. Se hai un problema NP-completo, siete piuttosto bloccato, ma la sua molto probabile che non in realtà bisogno di risolvere uno. Ad esempio, non hai sempre bisogno della risposta perfetta. Forse vicino è abbastanza buono. O forse puoi risolvere il problema per un sottoinsieme di casi che sono facili e puntare su quelli difficili. Ad esempio, gli algoritmi di impacchettamento sono spesso completi di NP, ma sono comuni algoritmi che ottengono in modo affidabile entro il 5% dell'ottimale usando approcci probabalistici.
Cort Ammon - Ripristina Monica l'

2
In tutta onestà, sentirsi dire che escogita un avido algoritmo per risolvere un programma NP completo è letteralmente lo stesso di essere incaricato di affrontare l'intera comunità informatica / matematica da solo. Se si trova un algoritmo per un programma NP-completo in tempo P, al molto minimo che ci si guadagna il premio argilla $ 1 milione per risolvere P = NP. In realtà, gli effetti della tua scoperta rimodellerebbero il calcolo così come lo conosciamo e aumenterebbero completamente l'intero settore della sicurezza / crittografia durante la notte. Meglio avere la formulazione del compito adattata per non essere dimostrabilmente NP-completa.
Cort Ammon - Ripristina Monica l'

Ho usato un avido algoritmo esatto per un problema NP completo. Avevo solo bisogno di risolvere un piccolo caso e ho potuto ottenere un server a 64 processori per un fine settimana.
Patricia Shanahan,

8

Oltre alle risposte esistenti, vorrei sottolineare che esistono situazioni in cui ha senso avere una soluzione approssimativa per un problema decisionale, ma funziona diversamente da come si potrebbe pensare.

Con questi algoritmi, solo uno dei due risultati viene determinato con certezza, mentre l'altro potrebbe non essere corretto. Fai il test di Miller-Rabin per i numeri primi , ad esempio: se il test determina che un numero non è un numero primo, quel risultato è certo. Ma nell'altro caso significa solo che il numero è probabilmente primo. A seconda di quanto tempo di calcolo sei disposto a investire, puoi aumentare la tua fiducia nel risultato, ma non sarà del 100% come nel caso non primario.

Ciò è particolarmente efficace quando si affrontano problemi indecidibili: è possibile scrivere uno strumento che tenta di risolvere il problema di arresto per un determinato pezzo di codice. Se riesce a trovare una prova del fatto che il programma non si ripeterà all'infinito, puoi richiederlo con certezza al 100%. Se non riesci a trovare una tale prova, potrebbe darsi che il flusso di controllo del programma sia troppo contorto per poter essere analizzato dal tuo strumento, ma non è una prova che si ripeterà per sempre. Semplificando le strutture di controllo, potresti essere in grado di creare un programma equivalente che è abbastanza semplice da consentire allo strumento di provare che si arresterà per certo.


C'è una grande differenza tra algoritmi probabilistici (la tua risposta) e approssimazione (la domanda). In particolare, la combinazione di entrambi è una razza molto speciale.
Raffaello

Inoltre, sappiamo che non esistono algoritmi probabilistici per il problema dell'arresto, ipotizzando una ragionevole interpretazione del termine in questo contesto.
Raffaello

@Raphael Non intendevo che la mia risposta fosse specifica per gli algoritmi probabilistici. Certo, per Miller-Rabin è il caso, ma come hai detto tu stesso, questo non è più vero per l'esempio del problema di arresto, e immagino anche che non sarà vero per la maggior parte dei casi in cui trovi questo comportamento. Il punto che volevo superare è semplicemente che otterrai la certezza solo su un risultato, ma non sull'altro.
ComicSansMS

Se non stai dicendo altro che alcuni problemi sono solo semi-calcolabili, non penso che tu stia rispondendo alla domanda.
Raffaello

@Raphael Anche la mia risposta non è specifica per problemi semi-calcolabili. In realtà, non penso che l'approccio che ho descritto si applichi anche a problemi semi-calcolabili. Lì ora sarai sicuro se sei atterrato nel ramo indefinito della funzione, quindi puoi affermare con certezza che non ci sono risultati. Ciò che ho descritto si riduce a: Potrebbe esserci una risposta, ma l'algoritmo potrebbe non essere sembrato abbastanza difficile da inciampare su di esso.
ComicSansMS
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.