Esercizio - Algoritmo randomizzato per 2-SAT eseguito su un'istanza con quattro variabili
Testo. Si considera la formula 2-CNF su
- Trovare tutte le assegnazioni soddisfacenti.
- Eseguire a mano l'algoritmo (passeggiata) da , scegliendo come clausola violata la prima nell'ordine di scrittura, con la sequenza di scelte casuali .
- Il numero di passi atteso dipende dalla distanza dalla soluzione. Calcolare il valore esatto per ogni assegnazione di partenza (con la regola "prima clausola violata, variabile a caso tra le due") e confrontarlo con il limite .
- Calcolare la probabilità di non trovare la soluzione entro passi partendo da un'assegnazione scelta uniformemente, e confrontarla con il limite di Markov.
- Cosa cambia scegliendo la clausola violata a caso invece che la prima?
Soluzione
1. Le prime due clausole insieme equivalgono a : se servirebbero (prima clausola) e (seconda), impossibile; quindi . Con la terza clausola impone , la quarta , la quinta . L'unica soluzione è .
2. La distanza da è il numero di variabili uguali a .
| passo | assegnazione | prima clausola violata | variabile cambiata |
|---|---|---|---|
| 0 | |||
| 1 | |||
| 2 | |||
| 3 | |||
| 4 | nessuna | soddisfatta |
Quattro passi, tutti nella direzione giusta: distanza . Ogni passo ha avuto probabilità di essere questo, quindi la sequenza ha probabilità dato lo stato iniziale.
3. Sia il numero atteso di passi da (). Per ogni , , dove sono ottenute cambiando le due variabili della prima clausola violata. Il sistema ha incognite (una per assegnazione diversa da ); la soluzione (frazioni esatte con sympy, controllata con il codice sotto) per ogni assegnazione scritta come è: , , , , , , , , , , , , , , . Il massimo per ogni distanza vale , sotto i limiti e sotto . Con partenza uniforme sulle assegnazioni la media è passi, meno della metà di : il limite è pessimistico. Assume una passeggiata simmetrica, in cui ogni passo si avvicina con probabilità esattamente ; qui invece la prima clausola, quando è violata (), ha entrambe le variabili diverse da e fa avanzare con probabilità .
Verifica a mano di un caso: da (solo ), la prima clausola violata è ? No: con è soddisfatta ( vero). La seconda è violata (, ): si cambia (e si è a in passo) oppure (si va a ). Quindi . Da la prima clausola è violata (): si va a o a ; quindi . Da la terza clausola è violata: si va a o a : . Le tre equazioni danno , quindi ✓ e ✓.
4. La catena sulle assegnazioni (con assorbente) ha matrice calcolata dalla regola; la probabilità di non essere in dopo passi, con partenza uniforme, vale:
| 8 | 16 | 32 | 64 | |
|---|---|---|---|---|
A : , molto meno del limite che deriva da . Anche la disuguaglianza di Markov applicata al valore atteso esatto dà solo : la coda reale decade molto più in fretta (la probabilità di non aver trovato si divide per circa ogni passi all'inizio e per circa tra e passi).
5. Con la clausola violata scelta a caso (invece della prima) la dinamica cambia ma l'analisi non: una clausola violata ha comunque almeno una variabile sbagliata. La simulazione con prove da partenza uniforme dà in media passi (con la regola "prima clausola" il valore esatto è ).
Codice di verifica
import itertools, random
import numpy as np
n = 4
cl = [((0, 0), (1, 0)), ((0, 0), (1, 1)), ((0, 1), (1, 0)), ((0, 1), (2, 0)), ((0, 1), (3, 0))] # (var, 1 = positivo)
sat = lambda c, x: any(x[v] == s for v, s in c)
S = [x for x in itertools.product((0, 1), repeat=n) if all(sat(c, x) for c in cl)]
print("soluzioni:", S)
stati = list(itertools.product((0, 1), repeat=n)); k = {x: i for i, x in enumerate(stati)}
P = np.zeros((16, 16))
for x in stati:
if x == S[0]:
P[k[x], k[x]] = 1; continue
c = next(c for c in cl if not sat(c, x)) # prima clausola violata
for v, _ in c:
y = list(x); y[v] ^= 1; P[k[x], k[tuple(y)]] += .5
Q = np.delete(np.delete(P, k[S[0]], 0), k[S[0]], 1)
E = np.linalg.solve(np.eye(15) - Q, np.ones(15))
for x, e in zip([x for x in stati if x != S[0]], E): print(x, round(e, 4))
print("media:", E.sum() / 16)
for T in (8, 16, 32, 64):
print(T, 1 - (np.ones(16) / 16 @ np.linalg.matrix_power(P, T))[k[S[0]]])Output (estratto): soluzioni: [(0, 0, 0, 0)], media: 7.5, e per le probabilità , , , .
Versione ripasso
- Formula: ; è impossibile, quindi e poi : soluzione unica .
- Esecuzione da con scelte : , quattro passi, probabilità .
- Tempi attesi esatti (prima clausola violata): , , , , , , , , ; sempre . Media da partenza uniforme . Esempio: , .
- Fallimento entro passi: (esatto) contro il limite di Markov; a passi .
- Verifica a mano: da la clausola violata è (si va in o in ); da è la prima (si va in o ); da è (si va in o ). Equazioni: , , .
- Limiti: distanza : massimi esatti contro (media da partenza uniforme , metà di ): il limite assume una passeggiata simmetrica, qui la prima clausola violata ha entrambe le variabili sbagliate.
- Clausola a caso: stessa analisi, simulazione passi.
- Errori tipici: scrivere come tempo certo anziché atteso; dimenticare che non è l'unica soluzione per cui l'algoritmo si ferma; contare le variabili uguali a invece di quelle diverse.