Salta al contenuto
Note per Studenti Esercizio - Due scatole di caramelle e soglia casuale contro ogni input (lezioni MIT)

Esercizio - Due scatole di caramelle e soglia casuale contro ogni input (lezioni MIT)

Teoria: Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazioneUn algoritmo randomizzato usa bit casuali indipendenti; la probabilità è sulle scelte dell'algoritmo, mai sull'input (garanzia per ogni input). Las Vegas: sempre corretto, tempo aleatorio (conta il tempo atteso). Monte Carlo: tempo fisso, risposta sbagliata con probabilità limitata; errore unilaterale (RP: accetta solo se x sta nel linguaggio, accetta con prob almeno 1/2) o bilaterale (BPP: giusto con prob almeno 2/3). ZPP = RP ∩ co-RP = Las Vegas con tempo atteso polinomiale. Amplificazione: unilaterale, k ripetizioni indipendenti, errore (1-p)^k ≤ e^(-pk), serve k ≥ ln(1/ε)/p; bilaterale, voto di maggioranza su k esecuzioni, errore binomiale esatto, esponenziale in k (Chernoff, e^(-k/18) per p=2/3) mentre Chebyshev dà solo 8/k. Las Vegas -> Monte Carlo: interrompere a c volte il tempo atteso (Markov, errore ≤ 1/c). Monte Carlo -> Las Vegas: solo se la risposta si verifica in fretta. Esempio: Miller-Rabin, errore ≤ 1/4 per esecuzione.Algoritmi randomizzati - Monte Carlo, Las Vegas e amplificazione → (garanzia per ogni input, probabilità sui bit casuali); base in Formula delle probabilità totali e formula di BayesSe (A_i) è una partizione di Ω, P(B) = Σ P(B ∣ A_i) P(A_i) (probabilità totali); la formula di Bayes inverte il condizionamento: P(A_k ∣ B) = P(B ∣ A_k) P(A_k) / P(B).Formula delle probabilità totali e formula di Bayes →. Problema dalle videolezioni di Mathematics for Computer Science, MIT OpenCourseWare.

Testo. Due scatole contengono due numeri diversi di caramelle, interi tra 00 e 1010, scelti da un avversario che conosce la strategia ma non i bit casuali. Si apre una scatola presa a caso (probabilità 12\frac12 ciascuna), si conta e si decide se tenerla o prendere l'altra. Si vince se si finisce con la scatola più piena.

  1. Con la regola fissa «tieni se ci sono almeno 55 caramelle», qual è la probabilità di vincere sugli input (3,8)(3,8) e (6,9)(6,9)? Qual è il caso pessimo?
  2. Dimostrare che ogni regola deterministica «tieni se il numero aperto sta nell'insieme KK» ha caso pessimo 12\frac12.
  3. Algoritmo randomizzato: si sceglie una soglia TT uniforme in {1,…,10}\{1,\dots,10\} e si tiene la scatola se contiene almeno TT caramelle. Calcolare la probabilità di vincere sull'input con contenuti s<ls<l e il suo minimo su tutti gli input.
  4. Eseguire l'algoritmo a mano sull'input (4,5)(4,5) per tutte le soglie.
  5. Con contenuti tra 00 e NN, quale garanzia si ottiene? E qual è la media su tutte le 5555 coppie di valori tra 00 e 1010?

Soluzione

1. Soglia fissa 55. Con (3,8)(3,8): se si apre 88 lo si tiene, se si apre 33 si cambia e si prende 88: si vince sempre, probabilità 11. Con (6,9)(6,9) entrambi i valori sono ≥5\ge5: si tiene sempre la prima scatola aperta e si vince solo se è quella da 99, probabilità 12\frac12. Il caso pessimo è 12\frac12: l'avversario mette entrambi i valori dallo stesso lato della soglia.

2. Nessuna regola deterministica fa meglio di 12\frac12. Una regola deterministica divide gli 1111 valori 0,…,100,\dots,10 in «tengo» (KK) e «cambio» (il resto). Una delle due classi contiene almeno 66 valori, quindi almeno due valori distinti s<ls<l con la stessa decisione. Sull'input (s,l)(s,l):

  • se entrambi stanno in KK si tiene sempre la prima scatola, che è quella giusta con probabilità 12\frac12;
  • se entrambi sono fuori da KK si cambia sempre, e si vince solo se si era aperta la scatola sbagliata: ancora 12\frac12.

L'unica casualità di questa strategia è la scelta della scatola, e l'avversario, che conosce KK, sceglie proprio (s,l)(s,l).

3. Soglia casuale. Si fissa l'input s<ls<l e si condiziona sul valore di TT (probabilità totale). Le soglie si dividono in tre gruppi.

  • s<T≤ls<T\le l (la soglia separa i due valori): se si apre ll si tiene (l≥Tl\ge T), se si apre ss si cambia (s<Ts<T); si vince sempre. Queste soglie sono T=s+1,…,lT=s+1,\dots,l, cioè k=l−s≥1k=l-s\ge1.
  • T≤sT\le s: entrambi i valori sono ≥T\ge T, si tiene sempre: si vince con probabilità 12\frac12.
  • T>lT>l: entrambi <T<T, si cambia sempre: probabilità 12\frac12.

Quindi P(vittoria)=1⋅k10+12⋅10−k10=12+k20 ≥ 12+120=1120=0,55.P(\text{vittoria})=1\cdot\frac k{10}+\frac12\cdot\frac{10-k}{10}=\frac12+\frac k{20}\ \ge\ \frac12+\frac1{20}=\frac{11}{20}=0{,}55 . Il minimo 0,550{,}55 si ha per k=1k=1 (valori consecutivi), il massimo 11 per (0,10)(0,10) (k=10k=10). La garanzia vale per ogni input, perché la probabilità è calcolata sui bit casuali dell'algoritmo (TT e la scatola) con l'input fissato: è lo stesso modello degli algoritmi randomizzati, dove non si assume nessuna distribuzione sugli input.

4. A mano, input (4,5)(4,5). La sola soglia che separa è T=5T=5.

soglia TT aperta 44 aperta 55 vittoria
1,2,3,41,2,3,4 tiene 44 (perde) tiene 55 (vince) 12\frac12
55 cambia, prende 55 (vince) tiene 55 (vince) 11
6,…,106,\dots,10 cambia, prende 55 (vince) cambia, prende 44 (perde) 12\frac12

Media: 4⋅12+1+5⋅1210=5,510=0,55\frac{4\cdot\frac12+1+5\cdot\frac12}{10}=\frac{5{,}5}{10}=0{,}55, come la formula con k=1k=1.

5. Generalizzazioni. Con valori tra 00 e NN e soglia uniforme in {1,…,N}\{1,\dots,N\} lo stesso conto dà 12+k2N≥12+12N\frac12+\frac k{2N}\ge\frac12+\frac1{2N}: per N=100N=100 la garanzia è 0,5050{,}505. Il vantaggio sul caso pessimo è piccolo ma garantito, mentre nessuna regola deterministica supera 12\frac12. Se invece l'input fosse una coppia uniforme tra le (112)=55\binom{11}2=55 possibili, la media di 12+l−s20\frac12+\frac{l-s}{20} è 0,70{,}7: ma è un'analisi del caso medio, che vale solo se l'input ha davvero quella distribuzione.

Risultato. Soglia fissa: caso pessimo 12\frac12, e lo stesso per ogni regola deterministica. Soglia casuale: P(vittoria)=12+l−s20≥0,55P(\text{vittoria})=\frac12+\frac{l-s}{20}\ge0{,}55 per ogni input; con valori fino a NN, ≥12+12N\ge\frac12+\frac1{2N}.

python
from fractions import Fraction as F
def vittoria(s, l, N=10):                      # soglia T uniforme in 1..N, scatola aperta a caso
    p = F(0)
    for T in range(1, N + 1):
        for aperta, altra in ((s, l), (l, s)):
            ottiene = aperta if aperta >= T else altra
            p += F(1, 2 * N) * (ottiene == l)
    return p
v = {(s, l): vittoria(s, l) for s in range(11) for l in range(s + 1, 11)}
print(min(v.values()), v[(4, 5)], v[(3, 8)], v[(0, 10)])         # 11/20 11/20 3/4 1
print(all(p == F(1, 2) + F(l - s, 20) for (s, l), p in v.items()), sum(v.values()) / len(v))   # True 7/10

Verificato con frazioni esatte su tutte le 5555 coppie e con una simulazione sull'input (4,5)(4,5) (0,5520{,}552 su 200 000200\,000 prove).

Versione ripasso

Teoria collegata