Salta al contenuto
Note per Studenti Esercizio - Algoritmo randomizzato per 2-SAT eseguito su un'istanza con quattro variabili

Esercizio - Algoritmo randomizzato per 2-SAT eseguito su un'istanza con quattro variabili

Teoria: Passeggiate aleatorie - rovina del giocatore, 2-SAT e grafiPasseggiata sulla retta con barriere (rovina del giocatore): da i con N come traguardo, P(vittoria)=i/N e durata attesa i(N-i) se il gioco è equo; con p diverso da 1/2, P=(1-r^i)/(1-r^N), r=q/p. Il 2-SAT si risolve con una passeggiata randomizzata (flip di una variabile di una clausola violata): E[T] ≤ n^2 passi, quindi 2n^2 passi bastano con errore ≤ 1/2 (3-SAT: deriva contraria, esponenziale). Sul grafo la passeggiata ha π_v=d(v)/2m, tempo di ritorno 2m/d(v), tempo di copertura < 4m(n-1), da cui la connettività s-t in spazio logaritmico; PageRank è la stazionaria di una passeggiata con teletrasporto.Passeggiate aleatorie - rovina del giocatore, 2-SAT e grafi →.

Testo. Si considera la formula 2-CNF su x1,x2,x3,x4x_1,x_2,x_3,x_4 φ=(¬x1∨¬x2)∧(¬x1∨x2)∧(x1∨¬x2)∧(x1∨¬x3)∧(x1∨¬x4).\varphi=(\neg x_1\vee\neg x_2)\wedge(\neg x_1\vee x_2)\wedge(x_1\vee\neg x_2)\wedge(x_1\vee\neg x_3)\wedge(x_1\vee\neg x_4).

  1. Trovare tutte le assegnazioni soddisfacenti.
  2. Eseguire a mano l'algoritmo (passeggiata) da (1,1,1,1)(1,1,1,1), scegliendo come clausola violata la prima nell'ordine di scrittura, con la sequenza di scelte casuali x1,x2,x3,x4x_1,x_2,x_3,x_4.
  3. Il numero di passi atteso dipende dalla distanza jj dalla soluzione. Calcolare il valore esatto EjE_j per ogni assegnazione di partenza (con la regola "prima clausola violata, variabile a caso tra le due") e confrontarlo con il limite 2jn−j22jn-j^2.
  4. Calcolare la probabilità di non trovare la soluzione entro 2n2=322n^2=32 passi partendo da un'assegnazione scelta uniformemente, e confrontarla con il limite 12\tfrac12 di Markov.
  5. Cosa cambia scegliendo la clausola violata a caso invece che la prima?

Soluzione

1. Le prime due clausole insieme equivalgono a ¬x1\neg x_1: se x1=1x_1=1 servirebbero x2=0x_2=0 (prima clausola) e x2=1x_2=1 (seconda), impossibile; quindi x1=0x_1=0. Con x1=0x_1=0 la terza clausola impone ¬x2\neg x_2, la quarta ¬x3\neg x_3, la quinta ¬x4\neg x_4. L'unica soluzione è S=(0,0,0,0)S=(0,0,0,0).

2. La distanza da SS è il numero di variabili uguali a 11.

passo assegnazione prima clausola violata variabile cambiata
0 (1,1,1,1)(1,1,1,1) ¬x1∨¬x2\neg x_1\vee\neg x_2 x1x_1
1 (0,1,1,1)(0,1,1,1) x1∨¬x2x_1\vee\neg x_2 x2x_2
2 (0,0,1,1)(0,0,1,1) x1∨¬x3x_1\vee\neg x_3 x3x_3
3 (0,0,0,1)(0,0,0,1) x1∨¬x4x_1\vee\neg x_4 x4x_4
4 (0,0,0,0)(0,0,0,0) nessuna soddisfatta

Quattro passi, tutti nella direzione giusta: distanza 4→3→2→1→04\to3\to2\to1\to0. Ogni passo ha avuto probabilità 12\tfrac12 di essere questo, quindi la sequenza ha probabilità (12)4=116\bigl(\tfrac12\bigr)^4=\tfrac1{16} dato lo stato iniziale.

3. Sia E(x)E(x) il numero atteso di passi da xx (E(S)=0E(S)=0). Per ogni x≠Sx\ne S, E(x)=1+12E(x′)+12E(x′′)E(x)=1+\tfrac12E(x')+\tfrac12E(x''), dove x′,x′′x',x'' sono ottenute cambiando le due variabili della prima clausola violata. Il sistema ha 1515 incognite (una per assegnazione diversa da SS); la soluzione (frazioni esatte con sympy, controllata con il codice sotto) per ogni assegnazione scritta come x1x2x3x4x_1x_2x_3x_4 è: 0001 ⁣:50001\!:5, 0010 ⁣:50010\!:5, 0100 ⁣:30100\!:3, 1000 ⁣:31000\!:3, 0011 ⁣:100011\!:10, 0101 ⁣:80101\!:8, 0110 ⁣:80110\!:8, 1100 ⁣:41100\!:4, 1001 ⁣:81001\!:8, 1010 ⁣:81010\!:8, 0111 ⁣:130111\!:13, 1011 ⁣:131011\!:13, 1101 ⁣:91101\!:9, 1110 ⁣:91110\!:9, 1111 ⁣:141111\!:14. Il massimo per ogni distanza j=1,2,3,4j=1,2,3,4 vale 5, 10, 13, 145,\ 10,\ 13,\ 14, sotto i limiti 2jn−j2=7, 12, 15, 162jn-j^2=7,\ 12,\ 15,\ 16 e sotto n2=16n^2=16. Con partenza uniforme sulle 1616 assegnazioni la media è 0+3+3+5+5+10+8+8+4+8+8+13+13+9+9+1416=12016=7,5\tfrac{0+3+3+5+5+10+8+8+4+8+8+13+13+9+9+14}{16}=\tfrac{120}{16}=\boxed{7{,}5} passi, meno della metà di n2n^2: il limite è pessimistico. Assume una passeggiata simmetrica, in cui ogni passo si avvicina con probabilità esattamente 12\tfrac12; qui invece la prima clausola, quando è violata (x1=x2=1x_1=x_2=1), ha entrambe le variabili diverse da SS e fa avanzare con probabilità 11.

Verifica a mano di un caso: da 10001000 (solo x1=1x_1=1), la prima clausola violata è ¬x1∨¬x2\neg x_1\vee\neg x_2? No: con x2=0x_2=0 è soddisfatta (¬x2\neg x_2 vero). La seconda ¬x1∨x2\neg x_1\vee x_2 è violata (x1=1x_1=1, x2=0x_2=0): si cambia x1x_1 (e si è a SS in 11 passo) oppure x2x_2 (si va a 11001100). Quindi E(1000)=1+12⋅0+12E(1100)E(1000)=1+\tfrac12\cdot0+\tfrac12E(1100). Da 11001100 la prima clausola è violata (x1=x2=1x_1=x_2=1): si va a 01000100 o a 10001000; quindi E(1100)=1+12E(0100)+12E(1000)E(1100)=1+\tfrac12E(0100)+\tfrac12E(1000). Da 01000100 la terza clausola x1∨¬x2x_1\vee\neg x_2 è violata: si va a 11001100 o a 00000000: E(0100)=1+12E(1100)E(0100)=1+\tfrac12E(1100). Le tre equazioni danno E(1100)=1+12(1+12E(1100))+12(1+12E(1100))=2+12E(1100)E(1100)=1+\tfrac12\bigl(1+\tfrac12E(1100)\bigr)+\tfrac12\bigl(1+\tfrac12E(1100)\bigr)=2+\tfrac12E(1100), quindi E(1100)=4E(1100)=4 ✓ e E(1000)=E(0100)=3E(1000)=E(0100)=3 ✓.

4. La catena sulle 1616 assegnazioni (con SS assorbente) ha matrice PP calcolata dalla regola; la probabilità di non essere in SS dopo TT passi, con partenza uniforme, vale:

TT 8 16 32 64
P(non trovata)P(\text{non trovata}) 0,3150{,}315 0,1160{,}116 0,01550{,}0155 2,3⋅10−42{,}3\cdot10^{-4}

A T=2n2=32T=2n^2=32: 0,0155\boxed{0{,}0155}, molto meno del limite 12\tfrac12 che deriva da E[T]≤n2E[T]\le n^2. Anche la disuguaglianza di Markov applicata al valore atteso esatto dà solo 7,5/32=0,237{,}5/32=0{,}23: la coda reale decade molto più in fretta (la probabilità di non aver trovato SS si divide per circa 33 ogni 88 passi all'inizio e per circa 77 tra 1616 e 3232 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 20 00020\,000 prove da partenza uniforme dà in media 6,936{,}93 passi (con la regola "prima clausola" il valore esatto è 7,57{,}5).

Codice di verifica

python
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 T=8,16,32,64T=8,16,32,64 le probabilità 0,31490{,}3149, 0,11610{,}1161, 0,015450{,}01545, 0,0002330{,}000233.

Versione ripasso

Teoria: Passeggiate aleatorie - rovina del giocatore, 2-SAT e grafiPasseggiata sulla retta con barriere (rovina del giocatore): da i con N come traguardo, P(vittoria)=i/N e durata attesa i(N-i) se il gioco è equo; con p diverso da 1/2, P=(1-r^i)/(1-r^N), r=q/p. Il 2-SAT si risolve con una passeggiata randomizzata (flip di una variabile di una clausola violata): E[T] ≤ n^2 passi, quindi 2n^2 passi bastano con errore ≤ 1/2 (3-SAT: deriva contraria, esponenziale). Sul grafo la passeggiata ha π_v=d(v)/2m, tempo di ritorno 2m/d(v), tempo di copertura < 4m(n-1), da cui la connettività s-t in spazio logaritmico; PageRank è la stazionaria di una passeggiata con teletrasporto.Passeggiate aleatorie - rovina del giocatore, 2-SAT e grafi →.

  • Formula: (¬x1∨¬x2)(¬x1∨x2)(x1∨¬x2)(x1∨¬x3)(x1∨¬x4)(\neg x_1\vee\neg x_2)(\neg x_1\vee x_2)(x_1\vee\neg x_2)(x_1\vee\neg x_3)(x_1\vee\neg x_4); x1=1x_1=1 è impossibile, quindi x1=0x_1=0 e poi x2=x3=x4=0x_2=x_3=x_4=0: soluzione unica (0,0,0,0)(0,0,0,0).
  • Esecuzione da (1,1,1,1)(1,1,1,1) con scelte x1,x2,x3,x4x_1,x_2,x_3,x_4: (0,1,1,1)→(0,0,1,1)→(0,0,0,1)→(0,0,0,0)(0,1,1,1)\to(0,0,1,1)\to(0,0,0,1)\to(0,0,0,0), quattro passi, probabilità 116\tfrac1{16}.
  • Tempi attesi esatti (prima clausola violata): 0001 ⁣:50001\!:5, 0010 ⁣:50010\!:5, 0100 ⁣:30100\!:3, 1000 ⁣:31000\!:3, 0011 ⁣:100011\!:10, 0101 ⁣:80101\!:8, 1100 ⁣:41100\!:4, 0111 ⁣:130111\!:13, 1111 ⁣:141111\!:14; sempre ≤2jn−j2≤n2=16\le2jn-j^2\le n^2=16. Media da partenza uniforme 7,57{,}5. Esempio: E(1100)=2+12E(1100)=4E(1100)=2+\tfrac12E(1100)=4, E(1000)=E(0100)=3E(1000)=E(0100)=3.
  • Fallimento entro 2n2=322n^2=32 passi: 0,01550{,}0155 (esatto) contro il limite 12\tfrac12 di Markov; a 6464 passi 2,3⋅10−42{,}3\cdot10^{-4}.
  • Verifica a mano: da 10001000 la clausola violata è ¬x1∨x2\neg x_1\vee x_2 (si va in 00000000 o in 11001100); da 11001100 è la prima (si va in 01000100 o 10001000); da 01000100 è x1∨¬x2x_1\vee\neg x_2 (si va in 11001100 o 00000000). Equazioni: E(1000)=1+12E(1100)E(1000)=1+\tfrac12E(1100), E(0100)=1+12E(1100)E(0100)=1+\tfrac12E(1100), E(1100)=2+12E(1100)E(1100)=2+\tfrac12E(1100).
  • Limiti: distanza j=1,2,3,4j=1,2,3,4: massimi esatti 5;10;13;145;10;13;14 contro 2jn−j2=7;12;15;162jn-j^2=7;12;15;16 (media da partenza uniforme 7,57{,}5, metà di n2n^2): il limite assume una passeggiata simmetrica, qui la prima clausola violata ha entrambe le variabili sbagliate.
  • Clausola a caso: stessa analisi, simulazione ≈6,93\approx6{,}93 passi.
  • Errori tipici: scrivere n2n^2 come tempo certo anziché atteso; dimenticare che SS non è l'unica soluzione per cui l'algoritmo si ferma; contare le variabili uguali a SS invece di quelle diverse.

Teoria collegata