Un algoritmo provvisorio di soddisfacibilità


8

Non si ritiene che la soddisfazione generale (con poche eccezioni come le clausole di Horn) abbia una soluzione algoritmica. Tuttavia, il seguente algoritmo sembra essere una soluzione per la soddisfazione generale. Qual è esattamente il difetto con il seguente algoritmo?

  1. Sia un insieme vuoto che conterrà tutte le variabili che devono necessariamente essere vere o false.W
  2. Sia l'insieme di clausole.L
  3. Loop attraverso .L
  4. Ogni volta che una variabile non condizionale viene trovato, rimuoverla dal e inserirla .LW
  5. Se questo lascia un vuoto E implicazione , rimuovere tutte le variabili che implicazione vuoto da e inserto in .LW
  6. Se ciò lascia un'implicazione OR vuota , crea nuove istanze dell'algoritmo, in cui ogni istanza si occupa di una variabile nell'implicazione (ovvero se l'implicazione è: , crea un'istanza in cui è inserito in , uno dove è inserito in e uno in cui ed sono inseriti in ).xVyxWyWxyW
  7. Impostare tutte le variabili in sul valore che devono necessariamente essere.W
  8. Reinserire le variabili in in con i loro valori modificati e verificare se tutte le clausole sono soddisfatte.WL
  9. Se viene soddisfatta la soddisfazione, quindi restituire , altrimenti restituire "Non soddisfacente".L

Una variabile non condizionale è definita come una variabile che è necessariamente vera o falsa, ad esempio o .x¬y

Un'implicazione vuota è definita come un'implicazione in cui una parte è vuota (ad es. ) o l'altra parte è necessariamente vera (ad es. .xytrueab

Per una comprensione più intuitiva dell'algoritmo, prendere in considerazione la seguente serie di clausole :L

abc(i)fg(ii)f¬a(iii)fab(iv)c(v)

L'algoritmo eseguirà le seguenti operazioni:

1) Poiché , , sono variabili non condizionali, l'algoritmo inserirle in . .cfgWW={c,f,g}

2) Rimozione , e lasceranno le clausole vuoti: . Essi verranno aggiunti a . .cfg¬a,ab,bWW={c,f,g,b,¬a}

3) Il reinserimento delle variabili in comporterà la violazione delle prime clausole: . Poiché è falso, è falso, il che significa che la clausola (v) è stata violata. L'algoritmo restituirà "Non soddisfacente"Labcac

Sono consapevole che l'algoritmo appare confuso. Non esitate a chiedere chiarimenti.


Dai commenti ora mi rendo conto che non esiste un algoritmo di soddisfacibilità generale efficiente noto . Sono ancora interessato al feedback sul mio algoritmo. Funziona? Come si confronta con algoritmi comuni?


17
Cosa ti fa pensare che non esiste una soluzione algoritmica per la soddisfacibilità generale? Ci sono assolutamente algoritmi per farlo; nessuno di loro è noto per avere runtime polinomiali nel caso peggiore, però. Quello che stai descrivendo sembra un noto algoritmo di soddisfacimento basato sulla risoluzione.
templatetypedef

@templatetypedef L'articolo di Wikipedia sembra suggerire che non esiste una soluzione. Per caso mi potresti riferire all'algoritmo ben noto?

9
@Riddler quello che l'articolo di Wikipedia dice in realtà è "SAT è stato il primo esempio noto di un problema NP-completo. Ciò significa brevemente che non esiste un algoritmo noto che risolve efficacemente tutte le istanze di SAT" Ha anche un "algoritmo per risolvere SAT" sezione.

5
Esistono sicuramente soluzioni algoritmiche alla soddisfacibilità generale poiché esistono soluzioni di forza bruta (assegnando tutte le combinazioni di valori Vero / Falso alle variabili e vedendo se una delle espressioni risultanti viene valutata su Vero).

2
Il problema è che si genera un numero esponenziale di nuove istanze dagli OR vuoti nel caso peggiore.
Elliot Gorokhovsky,

Risposte:


6

Problema 1

Il caso di dovrebbe essere una "variabile non condizionale" rispetto a (cioè che dovrebbe ora essere inserito in ). Se questo non è vero, il tuo algoritmo ha bisogno di un ulteriore passaggio per dedurlo. Supponendo è una " variabile non condizionale ", continuiamo.(xyy¯)xx¯W(xyy¯)

Problema 2

NOTA: questo è un problema che ho notato; potrebbero esserci ben altri problemi.

Il problema è con la " implicazione OR vuota " suddivisa in due algoritmi, è che nella sua forma attuale, la divisione non copre tutti i casi. In particolare:

Si inizia con , quindi viene rimosso e ci viene lasciata un'implicazione OR vuota di . Ora suggerisci di dividerlo in due nuovi problemi e risolverli ciascuno; uno con e uno in cui . Ma questo non copre tutti i casi. Che dire del caso in cui . Tuttavia, il tuo algoritmo non considera mai la possibilità che sia falso.(xcy)c(x[]y)x=Ty=Ty=Tx=Fy=Fy

Penso che potresti essere in grado di risolvere questo problema formulando i due nuovi problemi come uno con e uno con .yx¯

Problema 3

Cosa succede quando ti rimangono un mucchio di clausole nel modulo:

(abc)

o

(abc)

Dopo aver ridotto tutto, queste clausole rimarranno e non sarai in grado di verificarne facilmente la soddisfacibilità.

Analisi

Nota : questa notazione "O", ecc., È chiamata notazione O grande . si chiama Big-omega.O(something)Ω(something)

Supponendo l'algoritmo ha fatto lavoro in generale, sarebbe in in tempo di nel caso peggiore, è il numero di variabili. Il motivo è che ogni suddivisione del problema in problemi di dimensioni simili significa che l'algoritmo viene eseguito in tempo esponenziale. Per visualizzare questo concetto, guarda la seguente immagine di un albero binario completo (immagine da qui ):Ω(2m)m

diagramma dell'albero binario completo

Ora immagina che il problema originale sia il nodo in alto. Dividiamo il problema in due problemi al secondo livello, ma sono di dimensioni simili (eliminiamo solo una variabile, o dalle implicazioni OR vuote , quindi avremo ancora molte implicazioni OR vuote per fare ciascuna livello). Dovremo potenzialmente dividere il problema volte per eliminare le variabili . Ciò significa che dovremo affrontare un albero con livelli . Un albero con livelli ha nodi fogliaxyO(m)mmm2m (nodi in fondo). Questo si chiama tempo esponenziale ed è informalmente un po 'alla pari con tutti gli algoritmi booleani di soddisfacimento noti. Ma lo è anche la forza bruta: ci sono possibili assegnazioni delle variabili, quindi con la forza bruta puoi indovinare ogni incarico e verificarne la soddisfazione con prestazioni simili!2m


Immagino che intendi ? Ω(.)
Raffaello

TBH Non sono sicuro che sia appropriato, perché nel migliore dei casi l'algoritmo può essere risolto rapidamente. Quello che intendevo dire era che il limite superiore era peggiore di (o almeno cattivo come) . Non conosco il modo corretto di affermarlo. Il punto principale della notazione O, tuttavia, è liberarci delle costanti. Se esiste un modo migliore per esprimerlo, sentiti libero di modificarlo. ΩO(2m)
Realz Slaw,

Può essere espresso come "il caso peggiore è "? Ω(2m)
Realz Slaw,

Una volta che ti qualifichi nel "caso peggiore", questo è ciò di cui parliamo, senza il caso migliore. "peggiore di " (qualunque cosa significhi "peggio di questo limite superiore") è effettivamente ciò che dice (un limite inferiore); vedi anche qui . In questo caso, il runtime nel caso peggiore in sembra essere quello che vuoi dire. Allo stesso modo, si desidera o nell'ultimo paragrafo. O(.)Ω(.)Ω(2m)Θ(m)Ω(m)
Raffaello

-5

Prima di sentire di avere un "nuovo" algoritmo SAT, si prega di rivedere l'algoritmo standard / classico di backtracking / ricerca in letteratura per il problema risalente a ~ 1962, l' algoritmo Davis – Putnam – Logemann – Loveland . la maggior parte degli algoritmi di backtracking / ricorsivi per il problema finirà probabilmente per sembrare un po 'simile a questo algoritmo, anche se può richiedere del tempo per dimostrare questa equivalenza.

Un'analisi seria implicherebbe il benchmarking del tuo algoritmo rispetto a esempi (o istanze casuali) rispetto a DPLL.

E quindi è utile semplicemente riassumere in che modo l'algoritmo differisce da esso. senza rivedere il tuo codice, le probabilità sono:

  • L'algoritmo contiene un bug. restituendo falsi positivi o negativi (ovvero l'algoritmo restituisce "formula soddisfacente" quando non lo è o viceversa, rispettivamente). questo può di solito essere colto da test molto approfonditi su una vasta gamma di formule generate casualmente e dal confronto con un altro algoritmo / implementazione corretto noto, ad esempio DPLL.
  • Il tuo algoritmo non è buono come DPLL.
  • Se è buono come DPLL o "migliore", è generalmente dovuto alle ramificazioni e alle euristiche / strategie di selezione variabile e alla distribuzione delle istanze sottoposte a test.

L'algoritmo può essere facilmente compreso da un laureando intelligente, ma sembra raramente insegnato a livello universitario o in libri di testo universitari, o forse non è nemmeno spesso menzionato, forse portando a una visione errata o impressione che gli algoritmi SAT di base non siano ben compresi ecc.

Inoltre, recentemente ho incontrato questo sito "live" chiamato ToughSat di Yuen e Bebel per aver generato istanze difficili da utilizzare con il benchmarking, alcune basate sul factoring [uno dei classici metodi di generazione di istanze hard SAT]. ce ne sono altri, ad esempio DIMAC, che archiviano archivi di istanze difficili, anche se potrebbero non essere più online.

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.