cerca
Informatica Teorica - NP-Completezza
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.IT-NP-Completezza History

Hide minor edits - Show changes to output

Changed line 112 from:
Per verificare la seconda condizione bisogna costruire una riduzione tempo polinomiale per ogni linguaggio A in NP che riconduca a SAT. Cominciamo col definire una MdT non deterministica N che decide A in un tempo non polinomiale, ovvero '''N -> n'^k^''''. Introduciamo ora il cosiddetto '''tableau''', una magnifica tabella in cui ad ogni riga corrisponde una configurazione della nostra macchina N. Le dimensioni del tableau sono n'^k^' x n'^k^', ed è così costruito:
to:
Per verificare la seconda condizione bisogna costruire una riduzione tempo polinomiale per ogni linguaggio A in NP che riconduca a SAT. Cominciamo col definire una MdT non deterministica N che decide A in un tempo polinomiale, ovvero '''N -> n'^k^''''. Introduciamo ora il cosiddetto '''tableau''', una magnifica tabella in cui ad ogni riga corrisponde una configurazione della nostra macchina N. Le dimensioni del tableau sono n'^k^' x n'^k^', ed è così costruito:
Changed line 154 from:
* δ(q'_1_',b) = [@{(@]q'_2_', c, L), (q'_2_', a, R[@(}@]
to:
* δ(q'_1_',b) = [@{(@]q'_2_', c, L), (q'_2_', a, R[@)}@]
Changed line 57 from:
Consideriamo infine ogni coppia di nodi e li colleghiamo con un arco solo se rispettano entrambe le seguenti regole:
to:
Consideriamo infine ogni coppia di nodi e li colleghiamo con un arco solo se rispettano entrambe le regole:
Changed lines 66-68 from:
A questo punto bisogna dimostrare che il grafo così formato abbia una k-CLIQUE se e solo se Φ è soddisfacibile. E' un se e solo se, quindi dovremo dimostrare entrambi i sensi:

''I. Φ è soddisfacibile -> k-CLIQUE ''\\
to:
A questo punto bisogna dimostrare che il grafo così formato abbia una k-CLIQUE se e solo se Φ è soddisfacibile. E' un "se e solo se", quindi dovremo dimostrare entrambi i sensi dell'implicazione:

'''(I)''' ''Φ è soddisfacibile -> k-CLIQUE ''\\
Changed lines 78-80 from:
''II. k-CLIQUE -> Φ è soddisfacibile''\\
Si dimostra in modo complementare al senso precedente: se assegniamo valore 1 ai nodi che formano la CLIQUE, per costruzione ce ne sarà almeno uno per clausola. Essendo la Φ una 3cnf-formula, se ha almeno un letterale uguale a 1 per clausola, allora sarà vera, quindi soddisfacibile.
to:
'''(II)''' ''k-CLIQUE -> Φ è soddisfacibile''\\
Si dimostra in modo complementare a ''(I)'': se assegniamo valore 1 ai nodi che formano la CLIQUE, per costruzione ce ne sarà almeno uno per clausola. Essendo la Φ una 3cnf-formula, se ha almeno un letterale uguale a 1 per clausola, allora sarà vera, quindi soddisfacibile.
Changed lines 97-98 from:
* ogni A in NP è ≤'_P_' C? Poiché ci ha dato sapere che B è NP-Completo, sappiamo anche che ogni problema A in NP è ≤'_P_' B. Ma se A ≤'_P_' B e B ≤'_P_' C, facendo la composizione delle riduzioni tempo polinomiali avremo che anche A ≤'_P_' C.
to:
* ogni A in NP è ≤'_P_' C? Poiché ci è dato sapere che B è NP-Completo, sappiamo anche che ogni problema A in NP è ≤'_P_' B. Ma se A ≤'_P_' B e B ≤'_P_' C, facendo la composizione delle riduzioni tempo polinomiali avremo che anche A ≤'_P_' C.
Changed line 123 from:
C = Q  Γ  {#}\\
to:
C = Q U Γ U {#}\\
Changed lines 127-128 from:
Adesso abbiamo tutto quello che ci serve per realizzare una Φ che corrisponda a un tableau accettante:
to:
Abbiamo tutto quello che ci serve per realizzare una Φ che corrisponda a un tableau accettante:
Changed lines 138-139 from:
, dove (a) dice che all'interno di ogni cella deve esserci almeno un simbolo (e infatti richiede che almeno una delle variabili sia pari a 1), (b) dice che in ogni cella del tableau non deve esserci più di un simbolo, e le due parti sono in AND tra loro perché devono essere ovviamente vere entrambe.
to:
, dove il primo OR dice che all'interno di ogni cella deve esserci almeno un simbolo (e infatti richiede che almeno una delle variabili sia pari a 1), mentre il secondo AND dice che in ogni cella del tableau non deve esserci più di un simbolo, e le due parti sono in AND tra loro perché devono essere ovviamente vere entrambe.
Changed lines 153-154 from:
* δ(q'_1_',a) = {(q'_1_', b, R)}
* δ(q'_1_',b) = {(q'_2_', c, L), (q'_2_', a, R}
to:
* δ(q'_1_',a) = [@{(@]q'_1_', b, R[@)}@]
* δ(q'_1_',b) = [@{(@]q'_2_', c, L), (q'_2_', a, R[@(}@]
Changed lines 122-123 from:
Introduciamo ora le variabili della nostra formula, che sarebbero poi tutti i possibili simboli che compariranno nel tableau. Prima di tutto definiamo l'alfabeto:
[@C = Q  Γ  {#}@]\\
to:
Introduciamo ora le variabili della nostra formula, che sarebbero poi tutti i possibili simboli che compariranno nel tableau. Prima di tutto definiamo l'alfabeto:\\
C = Q  Γ  {#}\\
Added lines 188-224:

!!Corollario al teorema di Cook-Levin

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
3SAT è NP-Completo.
>><<

'''Dimostrazione'''

Per dimostrare che 3SAT è NP-Completo dobbiamo verificare se sono soddisfatte le solite due condizioni:
# 3SAT è in NP? Sì dai, se SAT è in NP perché dobbiamo perdere tempo a chiederci se lo è anche 3SAT?
# ogni A in NP è &#8804;'_P_' 3SAT? Ideona: dato che per il teorema di Cook-Levin ogni linguaggio A in NP è riducibile a SAT in tempo polinomiale, se riusciamo a dimostrare che SAT è &#8804;'_P_' 3SAT siamo a cavallo!

Quello che dobbiamo fare è modificare la dimostrazione del SAT in modo che produca una formula nella forma normale congiuntiva con tre letterali per clausola (una 3SAT, appunto). Rivediamo la &#934; di SAT:

%center%Attach:IT-FIaccettante.gif

Come prima cosa verifichiamo che ogni parte sia in forma normale congiuntiva (FNC):
* &#934;'_cell_' è un AND di sottoformule, ognuna delle quali contiene un OR di letterali e un AND di OR: quindi ''è in FNC''!
* &#934;'_start_' è un AND di letterali (tante clausole con un solo letterale): quindi ''è in FNC''!
* &#934;'_accept_' è un OR di letterali (una clausola con tanti letterali): quindi ''è in FNC''!
* &#934;'_move_' è un AND di sottoformule, ognuna delle quali contiene un OR di AND: quindi ''non è in FNC''! Riusciamo però a rappresentarla in forma normale congiuntiva applicando la proprietà distributiva:
%center%Attach:IT-3SAT-1.gif
-->In questo modo si riesce a porre anche &#934;'_move_' in FNC, al prezzo però di un aumento significativo delle dimensioni di ogni sottoformula. Amen.

Ora che abbiamo tutte le parti della &#934; in forma normale congiuntiva non ci resta che vincolare ogni clausola ad avere al massimo 3 letterali. Studiamo i vari casi possibili e le contromisure da adottare:
# ''la clausola ha 3 letterali''\\
perfetta: la lasciamo così;
# ''la clausola ha meno di 3 letterali''\\
basta replicare un letterale quante volte serve per arrivare a 3, e metterlo in OR con gli altri (tanto per la proprietà di idempotenza il valore di verità non cambia);
# ''la clausola ha più di 3 letterali''\\
si introduce una nuova variabile e la si utilizza in questo modo:
%center%Attach:IT-3SAT-2.gif
-->Ad esempio:
%center%Attach:IT-3SAT-3.gif

Dopo tutte queste modifiche, è più che semplice verificare che la nuova &#934; ottenuta è soddisfacibile se e solo se la &#934; originale lo è. Quindi, essendo la dimostrazione usata per il teorema di Cook-Levin più che valida anche per questo suo corollario, possiamo affermare che anche 3SAT è NP-Completo.
Added line 8:
Added line 156:
Changed lines 107-185 from:
..to be continued
to:
Per dimostrare che SAT è NP-Completo dobbiamo verificare se sono soddisfatte le solite due condizioni:
# SAT è in NP? Sì, perché si può facilmente realizzare una MdT non deterministica che, dato un assegnamento per una certa &#934;, lo accetta in tempo polinomiale se questo soddisfa &#934;;
# ogni A in NP è &#8804;'_P_' SAT? E' questa la parte difficile.

Per verificare la seconda condizione bisogna costruire una riduzione tempo polinomiale per ogni linguaggio A in NP che riconduca a SAT. Cominciamo col definire una MdT non deterministica N che decide A in un tempo non polinomiale, ovvero '''N -> n'^k^''''. Introduciamo ora il cosiddetto '''tableau''', una magnifica tabella in cui ad ogni riga corrisponde una configurazione della nostra macchina N. Le dimensioni del tableau sono n'^k^' x n'^k^', ed è così costruito:

%center%Attach:IT-tableau.gif

Dove:
* la prima e l'ultima colonna è composta di '''#''';
* la prima riga è la configurazione iniziale di N sull'ingresso w;
* possono esserci delle celle bianche nelle ultime colonne.

Il tableau è detto ''accettante'' se una qualsiasi delle sue righe corrisponde a una configurazione accettante (contiene ovvero una q'_accept_'). Quello che vogliamo fare è associare al tableau una formula che sarà soddisfatta se e solo se il tableau è accettante, perché significherebbe che A accetta w. \\
Introduciamo ora le variabili della nostra formula, che sarebbero poi tutti i possibili simboli che compariranno nel tableau. Prima di tutto definiamo l'alfabeto:
[@C = Q &#57658; &#915; &#57658; {#}@]\\
, dove Q sono gli stati della macchina, &#915; sono i simboli che possono essere sul nastro, e infine c'è il simbolo #.\\
Ad ogni cella sarà associata una variabile binaria '''x'_i,j,s_'''', dove i e j sono le coordinate nel tableau, mentre s è un simbolo preso da C. In particolare, x'_i,j,s_' varrà 1 se in (i,j) c'è il simbolo s, 0 altrimenti.

Adesso abbiamo tutto quello che ci serve per realizzare una &#934; che corrisponda a un tableau accettante:

%center%Attach:IT-FIaccettante.gif

Analizziamo una per una le quattro parti in AND di cui è composta.

'''&#934;'_cell_''''\\
Stabilisce che in ogni cella deve esserci un solo simbolo. Vediamola in formula:

%center%Attach:IT-FIcell.gif

, dove (a) dice che all'interno di ogni cella deve esserci almeno un simbolo (e infatti richiede che almeno una delle variabili sia pari a 1), (b) dice che in ogni cella del tableau non deve esserci più di un simbolo, e le due parti sono in AND tra loro perché devono essere ovviamente vere entrambe.

'''&#934;'_start_''''\\
Stabilisce che la prima riga deve corrispondere alla configurazione di partenza della MdT N. Vediamola in formula:

%center%Attach:IT-FIstart.gif

'''&#934;'_accept_''''\\
Garantisce che nel tableau ci sia almeno una configurazione accettante, ovvero che ci sia una q'_accept_'. Vediamola in formula:

%center%Attach:IT-FIaccept.gif

'''&#934;'_move_''''\\
Garantisce che ogni configurazione segua la precedente in modo legale, rispettando cioè la funzione di transizione di N. Per verificarla si ritagliano nel tableau delle finestre di dimensioni 2x3, e si dimostra che sono legali. Se tutte le finestre sono legali, allora è garantito che ogni configurazione del tableau segue in maniera corretta la precedente.\\
Facciamo un po' di esempi. Abbiamo due funzioni di transizione:
* &#948;(q'_1_',a) = {(q'_1_', b, R)}
* &#948;(q'_1_',b) = {(q'_2_', c, L), (q'_2_', a, R}

Consideriamo le seguenti possibili finestre:
%center%Attach:ITesMove.gif

Sono legali o no?
* (a): è legale, per la seconda &#948; (mi sposto a sinistra e passo a q'_2_' dopo aver sostituito b con c);
* (b): è legale, per la seconda &#948; (mi sposto a destra e passo a q'_2_' dopo aver sostituito a con a);
* (c): è legale, perché la testina è come se si spostasse di una posizione a destra rispetto alla finestra, e potrebbe benissimo stare implementando la prima &#948; in cui si sposta a destra e sostituisce con una b;
* (d): è legale, perché anche se non c'è la testina non sta infrangendo di fatto nessuna regola;
* (e): è legale, per la seconda &#948; (mi sono spostato a sinistra passando a q'_2_');
* (f): è legale, per la seconda &#948; (mi sono spostato a sinistra e ho sostituito b con c);
* (g): non è legale, perché è cambiato il contenuto del nastro senza avere vicino alcuna testina;
* (h): non è legale, perché dopo q'_1_' si sarebbe dovuti passare a q'_2_';
* (i): non è legale, perché ci sono due testine.

Ora che abbiamo un'idea su come funziona la verifica della legalità delle finestre, vediamo come esprimere &#934;'_move_' in formula:

%center%Attach:IT-FImove.gif

[+'''Ricapitolando'''+], avevamo detto che:

%center%Attach:IT-FIaccettante.gif

e quindi la &#934; sarà soddisfatta se tutte le sue componenti saranno pari a 1. Ma dato che ''per costruzione'' abbiamo fatto sì che questa proprietà fosse vera, avremo che la &#934; è soddisfacibile. Siamo dunque riusciti a trovare una formula per cui ogni A in NP è riducibile a SAT, quindi non rimane altro da dimostrare che questo avviene in tempo polinomiale.\\
Analizziamo le varie parti dell'algoritmo:
* il tableau ha dimensione n'^k^' x n'^k^', quindi ha n'^2k^'celle;
* in ogni cella ci sono l variabili associate. Essendo però l un valore costante che non è legato alla grandezza del tableau, possiamo trascurarlo nell'analisi della complessità;
* il numero di variabili è un O(n'^2k^');
* &#934;'_cell_', &#934;'_move_' e &#934;'_accept_' agiscono su tutte le celle del tableau, quindi sono un O(n'^2k^');
* &#934;'_start_' agisce solo sulla prima riga del tableau, quindi è un O(n'^k^').

Il termine dominante è n'^2k^', quindi l'algoritmo ha complessità O(n'^2k^'), che è tempo polinomiale. Fantastico: abbiamo dimostrato anche la seconda condizione per cui SAT è NP-Completo! Ora possiamo raccogliere le braccia da terra.
Changed line 67 from:
''I. &#934; è soddisfacibile -> k-CLIQUE ''
to:
''I. &#934; è soddisfacibile -> k-CLIQUE ''\\
Changed line 77 from:
''II. k-CLIQUE -> &#934; è soddisfacibile''
to:
''II. k-CLIQUE -> &#934; è soddisfacibile''\\
Added lines 80-86:
!!NP-Completezza
>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Un linguaggio B è NP-Completo se soddisfa due condizioni:
* B è in NP;
* ogni A in NP è tempo polinomiale riducibile a B.
>><<
Added lines 88-105:
>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Se B è NP-Completo e B &#8804;'_P_' C per C in NP, allora C è NP-Completo.
>><<

'''Dimostrazione'''

Per dimostrare il teorema dovremo verificare che siano vere entrambe le condizioni perché un linguaggio sia NP-Completo:
* C è in NP? Sì, ce lo dice il testo;
* ogni A in NP è &#8804;'_P_' C? Poiché ci ha dato sapere che B è NP-Completo, sappiamo anche che ogni problema A in NP è &#8804;'_P_' B. Ma se A &#8804;'_P_' B e B &#8804;'_P_' C, facendo la composizione delle riduzioni tempo polinomiali avremo che anche A &#8804;'_P_' C.

La tesi è perciò dimostrata.

!!Teorema di Cook-Levin
>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
SAT è NP-Completo.
>><<

'''Dimostrazione'''
Added line 49:
Added line 53:
Added line 61:
Added lines 1-82:
(:title Informatica Teorica - NP-Completezza:)
[[Torna alla pagina di Informatica Teorica-> Informatica Teorica]]
----

%titolo%''':: Informatica Teorica - NP-Completezza ::'''

%center% %sottotitolo% Appunti & Dimostrazioni del 12 Maggio

!!Teorema 1 - sulla Riducibilità tempo polinomiale

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
Se A &#8804;'_P_' B e B &#8712; P, allora A &#8712; P
>><<

'''Dimostrazione'''

Capiamo bene le due ipotesi:
* A &#8804;'_P_' B, significa che avremo una funzione f che ci permetterà di fare una riduzione da A a B in tempo polinomiale;
* B &#8712; P, significa che B è decidibile in un tempo polinomiale utilizzando una MdT deterministica, che chiameremo M.

La tesi del teorema ci dice che date le premesse A si troverà in P, ovvero avrà una MdT deterministica N che lo deciderà in tempo polinomiale. Scriviamola:

>>left bgcolor=#fbf3ff width=auto border='2px solid #cccccc' padding=5px<<
N = "su ingresso w:
# calcola f(w) (ovvero applica la formula di riduzione sulla stringa in ingresso);
# esegui M su f(w). Se M accetta, allora ACCETTA; altrimenti RIFIUTA."
>><<

Dato che f è una riduzione da A a B, w &#8712; A se e solo se f(w) &#8712; B, e quindi M accetterà f(w) se e solo se w è accettata da A. Ottenuto quello che volevamo, dobbiamo verificare che N sia risolvibile in tempo polinomiale, e lo è perché sia l'operazione di riduzione che l'esecuzione di M lo sono. La tesi è dunque verificata!

!!Teorema 2 - sui 3SAT
I 3cnf-formula sono formule in forma normale congiuntiva con clausole composte da 3 letterali. Una '''3SAT''' è una 3cnf-formula soddisfacibile. \\
Veniamo al teorema:

>>left bgcolor=#f5f9fc width=auto border='2px solid #cccccc' padding=5px<<
3SAT è tempo polinomiale riducibile a CLIQUE.
>><<

'''Dimostrazione'''

Abbiamo davanti una formula booleana che deve essere riducibile in tempo polinomiale a una CLIQUE (un sottoinsieme di nodi di un grafo tutti connessi tra loro). Dovremo quindi convertire la 3SAT in un grafo che contenga una CLIQUE se e solo se la 3SAT è soddisfacibile.

Come costruiamo il grafo? Teniamo conto che partiamo da una formula di questo tipo:
%center%Attach:IT-3sat.gif
e che vogliamo una funzione che ci generi una stringa di tipo <G,k> (dove G è il grafo e k il numero di nodi che compongono la cricca).\\
Come prima cosa stabiliamo che k corrisponda al numero di clausole di cui è composta &#934;, e che organizzeremo i nodi del grafo in k gruppi da 3 nodi ciascuno.

Consideriamo la seguente 3SAT di esempio:
%center%Attach:IT-3sat_es.gif

Organizziamo i nodi in k=3 gruppi da tre:
%center%Attach:IT-3sat_es2.gif

Consideriamo infine ogni coppia di nodi e li colleghiamo con un arco solo se rispettano entrambe le seguenti regole:
# non appartengono allo stesso gruppo;
# non sono tra loro complementari.

Tornando al nostro esempio, mostriamo come devono essere i collegamenti del primo nodo del gruppo in alto:
%center%Attach:IT-3sat_es3.gif

E così via.\\
A questo punto bisogna dimostrare che il grafo così formato abbia una k-CLIQUE se e solo se &#934; è soddisfacibile. E' un se e solo se, quindi dovremo dimostrare entrambi i sensi:

''I. &#934; è soddisfacibile -> k-CLIQUE ''
Selezioniamo da ogni clausola di &#934; un letterale che sia pari a 1 (se ce ne sono diversi ne scelgo uno a caso). Dimostriamo ora (con un verificatore amichevole e alla buona) che i nodi selezionati formano effettivamente una k-CLIQUE:

>>left bgcolor=#fbf3ff width=auto border='2px solid #cccccc' padding=5px<<
V = "
# abbiamo selezionato k nodi? Sì, ne abbiamo preso uno per ognuna delle k clausole;
# questi k nodi hanno un arco che li collega? Sì, per costruzione (non avendo creato archi tra nodi complementari, se seleziono un nodo pari a 1 non potrà mai essere collegato ad uno pari a 0);
# quindi? ACCETTA."
>><<

''II. k-CLIQUE -> &#934; è soddisfacibile''
Si dimostra in modo complementare al senso precedente: se assegniamo valore 1 ai nodi che formano la CLIQUE, per costruzione ce ne sarà almeno uno per clausola. Essendo la &#934; una 3cnf-formula, se ha almeno un letterale uguale a 1 per clausola, allora sarà vera, quindi soddisfacibile.

!!Teorema 3 - sulla NP-Completezza

..to be continued

----
[[Torna alla pagina di Informatica Teorica-> Informatica Teorica]]