Salta al contenuto
Note per Studenti Esercizio - Conteggio delle soluzioni di una formula DNF con l'algoritmo di Karp e Luby

Esercizio - Conteggio delle soluzioni di una formula DNF con l'algoritmo di Karp e Luby

Teoria: Metodi Monte Carlo - stima, generazione di variabili aleatorie e MCMCMonte Carlo stima una grandezza come media di campioni casuali: errore tipico σ/√N, numero di campioni N ≥ ln(2/δ)/(2ε²) per Hoeffding (probabilità), N ≥ 3 ln(2/δ)/(pε²) per Chernoff (errore relativo). Stima di π con p=π/4; integrali come media di g(U); eventi rari con campionamento per importanza (pesi φ/q); conteggio DNF con Karp-Luby in tempo polinomiale perché P(Y=1) ≥ 1/m. Generazione: trasformazione inversa X=F^{-1}(U) e accettazione-rifiuto (f ≤ M g, efficienza 1/M). MCMC: Metropolis-Hastings costruisce una catena con stazionaria π (nota a meno di costante) imponendo il bilancio dettagliato con probabilità di accettazione min(1, π(y)Q(y,x)/(π(x)Q(x,y))).Metodi Monte Carlo - stima, generazione di variabili aleatorie e MCMC →.

Testo. Sia φ=T1∨T2∨T3∨T4\varphi=T_1\vee T_2\vee T_3\vee T_4 una DNF su x1,…,x5x_1,\dots,x_5 con T1=x1∧x2∧¬x3,T2=x2∧x4,T3=¬x1∧x5,T4=x3∧x5.T_1=x_1\wedge x_2\wedge\neg x_3,\quad T_2=x_2\wedge x_4,\quad T_3=\neg x_1\wedge x_5,\quad T_4=x_3\wedge x_5.

  1. Calcolare ∣Si∣|S_i| per ogni termine e ∑i∣Si∣\sum_i|S_i|.
  2. Contare con precisione ∣U∣=∣⋃iSi∣|U|=|\bigcup_iS_i| (le assegnazioni che soddisfano φ\varphi), elencando le molteplicità.
  3. Calcolare E[Y]E[Y] dell'algoritmo di Karp-Luby e la probabilità P(Y=1∣i)P(Y=1\mid i) per ciascun termine.
  4. Eseguire a mano un campione con i=2i=2 e x=(0,1,1,1,0)x=(0,1,1,1,0) (l'assegnazione ottenuta fissando x2=x4=1x_2=x_4=1 nel termine T2T_2 e scegliendo a caso le altre variabili). Quanto vale YY?
  5. Quanti campioni per un errore relativo ≤2%\le2\% con probabilità ≥99%\ge99\%? Quanto vale la stima con 2⋅1052\cdot10^5 campioni?
  6. Confrontare con il campionamento ingenuo.

Soluzione

1. Un termine con kk letterali fissa kk variabili e lascia libere 5−k5-k: ∣Si∣=25−ki|S_i|=2^{5-k_i}. T1T_1 ha 33 letterali: ∣S1∣=4|S_1|=4; T2T_2 ha 22: ∣S2∣=8|S_2|=8; T3T_3 ha 22: ∣S3∣=8|S_3|=8; T4T_4 ha 22: ∣S4∣=8|S_4|=8. Somma: 28\boxed{28}.

2. Elenchiamo le assegnazioni x1x2x3x4x5x_1x_2x_3x_4x_5 di ciascun SiS_i:

  • S1S_1 (x1=1,x2=1,x3=0x_1=1,x_2=1,x_3=0): 11000, 11001, 11010, 1101111000,\,11001,\,11010,\,11011;
  • S2S_2 (x2=1,x4=1x_2=1,x_4=1): 01010, 01011, 01110, 01111, 11010, 11011, 11110, 1111101010,\,01011,\,01110,\,01111,\,11010,\,11011,\,11110,\,11111;
  • S3S_3 (x1=0,x5=1x_1=0,x_5=1): 00001, 00011, 00101, 00111, 01001, 01011, 01101, 0111100001,\,00011,\,00101,\,00111,\,01001,\,01011,\,01101,\,01111;
  • S4S_4 (x3=1,x5=1x_3=1,x_5=1): 00101, 00111, 01101, 01111, 10101, 10111, 11101, 1111100101,\,00111,\,01101,\,01111,\,10101,\,10111,\,11101,\,11111.

Le assegnazioni comuni a più insiemi sono: 11010, 11011∈S1∩S211010,\,11011\in S_1\cap S_2; 01011∈S2∩S301011\in S_2\cap S_3; 00101, 00111, 01101∈S3∩S400101,\,00111,\,01101\in S_3\cap S_4; 01111∈S2∩S3∩S401111\in S_2\cap S_3\cap S_4; 11111∈S2∩S411111\in S_2\cap S_4. Per inclusione-esclusione, ∣U∣=28−(ripetizioni)|U|=28-(\text{ripetizioni}): le assegnazioni contate più volte sono 1101011010 (22), 1101111011 (22), 0101101011 (22), 0010100101 (22), 0011100111 (22), 0110101101 (22), 0111101111 (33), 1111111111 (22), che producono 1+1+1+1+1+1+2+1=91+1+1+1+1+1+2+1=9 ripetizioni in eccesso. Quindi ∣U∣=28−9=19|U|=28-9=\boxed{19} (verificato con l'enumerazione di tutte le 3232 assegnazioni).

3. La coppia (i,x)(i,x) è uniforme sulle 2828 coppie con x∈Six\in S_i. Ogni x∈Ux\in U ha una sola coppia canonica (indice minimo). Quindi E[Y]=1928=0,6786E[Y]=\dfrac{19}{28}=0{,}6786. Per ogni termine, P(Y=1∣i)=#{x∈Si: nessun Tj, j<i, soddisfatto}∣Si∣P(Y=1\mid i)=\dfrac{\#\{x\in S_i:\text{ nessun }T_j,\ j<i,\text{ soddisfatto}\}}{|S_i|}: contando, le coppie canoniche sono 4, 6, 6, 34,\,6,\,6,\,3 (somma 1919), cioè P(Y=1∣i)=44=1P(Y=1\mid i)=\dfrac44=1, 68=0,75\dfrac68=0{,}75, 68=0,75\dfrac68=0{,}75, 38=0,375\dfrac38=0{,}375. Controllo: 4⋅1+8⋅0,75+8⋅0,75+8⋅0,37528=4+6+6+328=1928\dfrac{4\cdot1+8\cdot0{,}75+8\cdot0{,}75+8\cdot0{,}375}{28}=\dfrac{4+6+6+3}{28}=\dfrac{19}{28} ✓. In generale E[Y]≥1m=0,25E[Y]\ge\tfrac1m=0{,}25; qui è molto più alto.

4. Il termine scelto è T2T_2, e x=(0,1,1,1,0)=01110∈S2x=(0,1,1,1,0)=01110\in S_2 ✓. Quali termini soddisfa x=01110x=01110? T1T_1: richiede x1=1x_1=1, no. T2T_2: x2=x4=1x_2=x_4=1 ✓. T3T_3: richiede x1=0x_1=0 e x5=1x_5=1, ma x5=0x_5=0, no. T4T_4: richiede x5=1x_5=1, no. Il più piccolo indice soddisfatto è 2=i2=i, quindi Y=1\boxed{Y=1}. (Con x=11010x=11010, sempre in S2S_2, sarebbe stato soddisfatto anche T1T_1 e quindi Y=0Y=0: xx viene contato dalla coppia (1,11010)(1,11010).)

5. Con m=4m=4, ε=0,02\varepsilon=0{,}02, δ=0,01\delta=0{,}01: N≥3mln⁡(2/δ)ε2=3⋅4⋅ln⁡2000,0004=158 950N\ge\dfrac{3m\ln(2/\delta)}{\varepsilon^2}=\dfrac{3\cdot4\cdot\ln200}{0{,}0004}=\boxed{158\,950} campioni (la garanzia usa solo E[Y]≥1mE[Y]\ge\tfrac1m; il limite effettivo con E[Y]=0,68E[Y]=0{,}68 sarebbe più basso). Con 2⋅1052\cdot10^5 campioni: Yˉ=0,6788\bar Y=0{,}6788 e la stima 28⋅0,6788=19,005≈1928\cdot0{,}6788=19{,}005\approx19 ✓.

6. Il campionamento ingenuo estrae un'assegnazione uniforme e controlla se soddisfa φ\varphi: ha probabilità di successo 1932=0,594\tfrac{19}{32}=0{,}594, comparabile. Il vantaggio di Karp-Luby si vede quando ∣U∣/2n|U|/2^n è minuscolo: con n=40n=40 e tre termini di 2020 letterali la frazione è ≤2,9⋅10−6\le2{,}9\cdot10^{-6} e il metodo ingenuo richiederebbe ≈106\approx10^6 campioni per vedere un solo successo, mentre Karp-Luby ha sempre E[Y]≥13E[Y]\ge\tfrac13.

Codice di verifica

python
import itertools
import numpy as np
from math import log

n = 5
terms = [((0, 1), (1, 1), (2, 0)), ((1, 1), (3, 1)), ((0, 0), (4, 1)), ((2, 1), (4, 1))]   # (variabile, valore)
sat = lambda t, x: all(x[v] == s for v, s in t)
tutte = list(itertools.product((0, 1), repeat=n))
U = [x for x in tutte if any(sat(t, x) for t in terms)]
sizes = [2**(n - len(t)) for t in terms]
print("|S_i| =", sizes, " somma =", sum(sizes), " |U| =", len(U), " E[Y] =", len(U) / sum(sizes))
canon = [sum(1 for x in tutte if sat(t, x) and min(j for j, u in enumerate(terms) if sat(u, x)) == i)
         for i, t in enumerate(terms)]
print("coppie canoniche:", canon, [c / s for c, s in zip(canon, sizes)])

rng = np.random.default_rng(5)
N, hit, tot = 200_000, 0, sum(sizes)
for _ in range(N):
    i = rng.choice(len(terms), p=[s / tot for s in sizes])
    x = [int(rng.integers(0, 2)) for _ in range(n)]
    for v, s in terms[i]: x[v] = s
    hit += min(j for j, t in enumerate(terms) if sat(t, x)) == i
print("stima:", tot * hit / N, " N richiesto:", 3 * len(terms) * log(2 / 0.01) / 0.02**2)

Versione ripasso

Teoria: Metodi Monte Carlo - stima, generazione di variabili aleatorie e MCMCMonte Carlo stima una grandezza come media di campioni casuali: errore tipico σ/√N, numero di campioni N ≥ ln(2/δ)/(2ε²) per Hoeffding (probabilità), N ≥ 3 ln(2/δ)/(pε²) per Chernoff (errore relativo). Stima di π con p=π/4; integrali come media di g(U); eventi rari con campionamento per importanza (pesi φ/q); conteggio DNF con Karp-Luby in tempo polinomiale perché P(Y=1) ≥ 1/m. Generazione: trasformazione inversa X=F^{-1}(U) e accettazione-rifiuto (f ≤ M g, efficienza 1/M). MCMC: Metropolis-Hastings costruisce una catena con stazionaria π (nota a meno di costante) imponendo il bilancio dettagliato con probabilità di accettazione min(1, π(y)Q(y,x)/(π(x)Q(x,y))).Metodi Monte Carlo - stima, generazione di variabili aleatorie e MCMC →.

  • Formula: T1=x1x2¬x3T_1=x_1x_2\neg x_3, T2=x2x4T_2=x_2x_4, T3=¬x1x5T_3=\neg x_1x_5, T4=x3x5T_4=x_3x_5 su 55 variabili; ∣Si∣=25−ki=4,8,8,8|S_i|=2^{5-k_i}=4,8,8,8, somma 2828.
  • Unione: elenco per inclusione-esclusione: ripetizioni in eccesso 99 (0111101111 è in tre insiemi), ∣U∣=19|U|=19; E[Y]=1928=0,6786E[Y]=\tfrac{19}{28}=0{,}6786.
  • Coppie canoniche (indice minimo): 4,6,6,34,6,6,3 (somma 1919); P(Y=1∣i)=1; 0,75; 0,75; 0,375P(Y=1\mid i)=1;\,0{,}75;\,0{,}75;\,0{,}375.
  • Campione a mano: i=2i=2, x=01110x=01110: solo T2T_2 è soddisfatto, Y=1Y=1; con x=11010x=11010 anche T1T_1 lo è, Y=0Y=0.
  • Campioni: N≥3mln⁡(2/δ)ε2=158 950N\ge\frac{3m\ln(2/\delta)}{\varepsilon^2}=158\,950 per ε=0,02\varepsilon=0{,}02, δ=0,01\delta=0{,}01; con 2⋅1052\cdot10^5 la stima è 19,00519{,}005.
  • Perché funziona: E[Y]≥1mE[Y]\ge\tfrac1m sempre; il metodo ingenuo ha probabilità ∣U∣/2n|U|/2^n che può essere 2−Ω(n)2^{-\Omega(n)}.
  • Errori tipici: scegliere xx in SiS_i non uniformemente; dimenticare di contare solo la coppia canonica; sommare ∣Si∣|S_i| senza correggere le sovrapposizioni.

Teoria collegata