Testo. Sia φ=T1∨T2∨T3∨T4 una DNF su x1,…,x5 con
T1=x1∧x2∧¬x3,T2=x2∧x4,T3=¬x1∧x5,T4=x3∧x5.
Calcolare ∣Si∣ per ogni termine e ∑i∣Si∣.
Contare con precisione ∣U∣=∣⋃iSi∣ (le assegnazioni che soddisfano φ), elencando le molteplicità.
Calcolare E[Y] dell'algoritmo di Karp-Luby e la probabilità P(Y=1∣i) per ciascun termine.
Eseguire a mano un campione con i=2 e x=(0,1,1,1,0) (l'assegnazione ottenuta fissando x2=x4=1 nel termine T2 e scegliendo a caso le altre variabili). Quanto vale Y?
Quanti campioni per un errore relativo ≤2% con probabilità ≥99%? Quanto vale la stima con 2⋅105 campioni?
Confrontare con il campionamento ingenuo.
Soluzione
1. Un termine con k letterali fissa k variabili e lascia libere 5−k: ∣Si∣=25−ki. T1 ha 3 letterali: ∣S1∣=4; T2 ha 2: ∣S2∣=8; T3 ha 2: ∣S3∣=8; T4 ha 2: ∣S4∣=8. Somma: 28.
2. Elenchiamo le assegnazioni x1x2x3x4x5 di ciascun Si:
Le assegnazioni comuni a più insiemi sono: 11010,11011∈S1∩S2; 01011∈S2∩S3; 00101,00111,01101∈S3∩S4; 01111∈S2∩S3∩S4; 11111∈S2∩S4. Per inclusione-esclusione, ∣U∣=28−(ripetizioni): le assegnazioni contate più volte sono 11010 (2), 11011 (2), 01011 (2), 00101 (2), 00111 (2), 01101 (2), 01111 (3), 11111 (2), che producono 1+1+1+1+1+1+2+1=9 ripetizioni in eccesso. Quindi ∣U∣=28−9=19 (verificato con l'enumerazione di tutte le 32 assegnazioni).
3. La coppia (i,x) è uniforme sulle 28 coppie con x∈Si. Ogni x∈U ha una sola coppia canonica (indice minimo). Quindi E[Y]=2819=0,6786. Per ogni termine, P(Y=1∣i)=∣Si∣#{x∈Si: nessun Tj,j<i, soddisfatto}: contando, le coppie canoniche sono 4,6,6,3 (somma 19), cioè P(Y=1∣i)=44=1, 86=0,75, 86=0,75, 83=0,375. Controllo: 284⋅1+8⋅0,75+8⋅0,75+8⋅0,375=284+6+6+3=2819 ✓. In generale E[Y]≥m1=0,25; qui è molto più alto.
4. Il termine scelto è T2, e x=(0,1,1,1,0)=01110∈S2 ✓. Quali termini soddisfa x=01110? T1: richiede x1=1, no. T2: x2=x4=1 ✓. T3: richiede x1=0 e x5=1, ma x5=0, no. T4: richiede x5=1, no. Il più piccolo indice soddisfatto è 2=i, quindi Y=1. (Con x=11010, sempre in S2, sarebbe stato soddisfatto anche T1 e quindi Y=0: x viene contato dalla coppia (1,11010).)
5. Con m=4, ε=0,02, δ=0,01: N≥ε23mln(2/δ)=0,00043⋅4⋅ln200=158950 campioni (la garanzia usa solo E[Y]≥m1; il limite effettivo con E[Y]=0,68 sarebbe più basso). Con 2⋅105 campioni: Yˉ=0,6788 e la stima 28⋅0,6788=19,005≈19 ✓.
6. Il campionamento ingenuo estrae un'assegnazione uniforme e controlla se soddisfa φ: ha probabilità di successo 3219=0,594, comparabile. Il vantaggio di Karp-Luby si vede quando ∣U∣/2n è minuscolo: con n=40 e tre termini di 20 letterali la frazione è ≤2,9⋅10−6 e il metodo ingenuo richiederebbe ≈106 campioni per vedere un solo successo, mentre Karp-Luby ha sempre E[Y]≥31.
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 ifany(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(1for x in tutte if sat(t, x) andmin(j for j, u inenumerate(terms) if sat(u, x)) == i)
for i, t inenumerate(terms)]
print("coppie canoniche:", canon, [c / s for c, s inzip(canon, sizes)])
rng = np.random.default_rng(5)
N, hit, tot = 200_000, 0, sum(sizes)
for _ inrange(N):
i = rng.choice(len(terms), p=[s / tot for s in sizes])
x = [int(rng.integers(0, 2)) for _ inrange(n)]
for v, s in terms[i]: x[v] = s
hit += min(j for j, t inenumerate(terms) if sat(t, x)) == i
print("stima:", tot * hit / N, " N richiesto:", 3 * len(terms) * log(2 / 0.01) / 0.02**2)
Campione a mano:i=2, x=01110: solo T2 è soddisfatto, Y=1; con x=11010 anche T1 lo è, Y=0.
Campioni:N≥ε23mln(2/δ)=158950 per ε=0,02, δ=0,01; con 2⋅105 la stima è 19,005.
Perché funziona:E[Y]≥m1 sempre; il metodo ingenuo ha probabilità ∣U∣/2n che può essere 2−Ω(n).
Errori tipici: scegliere x in Si non uniformemente; dimenticare di contare solo la coppia canonica; sommare ∣Si∣ senza correggere le sovrapposizioni.