Esercizio - Concentrazione del numero cromatico di un grafo casuale con le differenze limitate (lezioni MIT)
Teoria: Limiti di Chernoff e di HoeffdingMarkov applicato a e^(tX) dà code esponenziali. Per somme di Bernoulli indipendenti con media μ: P(X ≥ (1+δ)μ) ≤ [e^δ/(1+δ)^(1+δ)]^μ ≤ e^(-δ²μ/3) per 0<δ≤1, P(X ≤ (1-δ)μ) ≤ e^(-δ²μ/2), P(X ≥ R) ≤ 2^(-R) se R ≥ 6μ. Hoeffding per X_i in [a_i,b_i]: P(|S-E[S]| ≥ t) ≤ 2exp(-2t²/Σ(b_i-a_i)²). Applicazioni: n ≥ ln(2/δ)/(2ε²) campioni per stimare una probabilità, amplificazione BPP con k = O(log 1/ε) ripetizioni, bilanciamento di insiemi con scarto √(4m ln n).Limiti di Chernoff e di Hoeffding → (differenze limitate, disuguaglianza di McDiarmid); grafi e colorazioni in Grafi - definizioni e proprietàGrafo G=(V,E) diretto e non diretto, grafo semplice e pesato; incidenza, adiacenza, grado; cammini, cicli, sottografi, grafi connessi e componenti connesse; alberi liberi, foreste, spanning tree e spanning forest; proprietà con dimostrazioni (somma dei gradi = 2m, m <= n(n-1)/2, alberi m = n-1, connessi m >= n-1, foreste m <= n-1).Grafi - definizioni e proprietà →. Esempio tratto dalle videolezioni di Probabilistic Methods in Combinatorics, MIT OpenCourseWare.
Testo. Nel grafo casuale ogni coppia di vertici è collegata con probabilità , indipendentemente. Il numero cromatico è il minimo numero di colori per colorare i vertici in modo che due vertici adiacenti abbiano colori diversi.
- Mostrare che se due grafi differiscono solo per archi che toccano un vertice allora .
- Scrivere come funzione di variabili casuali indipendenti, raggruppando gli archi, e dedurre .
- Che cosa si otterrebbe usando una variabile per ogni arco?
- Per , : quale scarto garantisce il limite con probabilità ? Confrontare con una simulazione.
Soluzione
1. Un vertice cambia di al più . Sia ottenuto da cambiando solo archi incidenti a . Si prende una colorazione ottima di con colori e si dà a un colore nuovo: gli altri vertici hanno tra loro gli stessi archi in e in , quindi restano colorati bene, e non può avere conflitti perché il suo colore non è usato da nessun altro. Si ottiene una colorazione di con colori: . Scambiando i ruoli, . Quindi .
2. Esposizione per vertici. Si numerano i vertici e per si pone cioè dice se c'è l'arco , gli archi , e così via. Ogni arco con sta in esattamente una (quella con ), e gruppi diversi contengono archi diversi: le sono indipendenti. Il grafo, e quindi , è una funzione . Cambiare una sola cambia solo archi incidenti al vertice , quindi per il punto 1 cambia di al più . La disuguaglianza delle differenze limitate per variabili indipendenti (McDiarmid) con dà e con l'esponente diventa : . Il risultato vale per ogni , senza sapere quanto vale .
3. Una variabile per arco. Anche aggiungere o togliere un arco cambia di al più (è un caso particolare del punto 1). Ma le variabili sono , quindi e il limite diventa : lo scarto garantito è dell'ordine di , inutile perché comunque. Raggruppare gli archi in blocchi mantiene e riduce la somma dei quadrati da a .
4. Numeri per . Si vuole : e lo scarto è ; con un arco per variabile sarebbe . Una simulazione di grafi , con calcolato esattamente per ricerca esaustiva, dà in , , , grafi: media , deviazione standard . Tutti i valori stanno entro dalla media, ben dentro . Per il limite è largo, ma conta la crescita: lo scarto garantito è , mentre per il numero cromatico cresce come , quindi per grande è concentrato in una finestra molto più stretta del suo valore.
Risultato. cambiando gli archi di un vertice; con variabili indipendenti ; per lo scarto al è (osservato: deviazione standard ).
Verifica.
import math, random
from collections import Counter
def cromatico(n, adj): # adj[v] = maschera di bit dei vicini
ordine = sorted(range(n), key=lambda v: -bin(adj[v]).count("1"))
def colorabile(k):
col = [-1] * n
def bt(i, usati):
if i == n: return True
v = ordine[i]
vietati = {col[u] for u in range(n) if adj[v] >> u & 1}
for c in range(min(usati + 1, k)): # un colore nuovo alla volta
if c not in vietati:
col[v] = c
if bt(i + 1, max(usati, c + 1)): return True
col[v] = -1
return False
return bt(0, 0)
k = 1
while not colorabile(k): k += 1
return k
def grafo(n, p, rng):
adj = [0] * n
for i in range(n):
for j in range(i + 1, n):
if rng.random() < p: adj[i] |= 1 << j; adj[j] |= 1 << i
return adj
rng = random.Random(1)
v = [cromatico(12, grafo(12, 0.5, rng)) for _ in range(2000)]
m = sum(v) / len(v); sd = (sum((x - m) ** 2 for x in v) / len(v)) ** 0.5
lam = math.sqrt(math.log(40) / 2)
print(sorted(Counter(v).items()), round(m, 2), round(sd, 2), round(lam * math.sqrt(11), 2), round(lam * math.sqrt(66), 2))Risultato: la distribuzione dei valori di (, , , con frequenze , , , ), media 4.38, deviazione standard 0.58, e gli scarti 4.5 e 11.03.
Versione ripasso
Lipschitz. Cambiare gli archi di un vertice cambia di al più : si dà a un colore nuovo nella colorazione ottima, poi si scambiano i ruoli (Grafi - definizioni e proprietàGrafo G=(V,E) diretto e non diretto, grafo semplice e pesato; incidenza, adiacenza, grado; cammini, cicli, sottografi, grafi connessi e componenti connesse; alberi liberi, foreste, spanning tree e spanning forest; proprietà con dimostrazioni (somma dei gradi = 2m, m <= n(n-1)/2, alberi m = n-1, connessi m >= n-1, foreste m <= n-1).Grafi - definizioni e proprietà →).
Esposizione per vertici. = archi da verso : blocchi indipendenti, , . McDiarmid (Limiti di Chernoff e di HoeffdingMarkov applicato a e^(tX) dà code esponenziali. Per somme di Bernoulli indipendenti con media μ: P(X ≥ (1+δ)μ) ≤ [e^δ/(1+δ)^(1+δ)]^μ ≤ e^(-δ²μ/3) per 0<δ≤1, P(X ≤ (1-δ)μ) ≤ e^(-δ²μ/2), P(X ≥ R) ≤ 2^(-R) se R ≥ 6μ. Hoeffding per X_i in [a_i,b_i]: P(|S-E[S]| ≥ t) ≤ 2exp(-2t²/Σ(b_i-a_i)²). Applicazioni: n ≥ ln(2/δ)/(2ε²) campioni per stimare una probabilità, amplificazione BPP con k = O(log 1/ε) ripetizioni, bilanciamento di insiemi con scarto √(4m ln n).Limiti di Chernoff e di Hoeffding →): , cioè per , per ogni .
Una variabile per arco. : scarto , inutile. Raggruppare riduce il numero di variabili senza aumentare le .
Numeri, , . : scarto al (per archi: ). Simulazione: , media , deviazione standard . Lo scarto è piccolo rispetto a per grande.
Errore tipico. Usare le variabili degli archi: il limite è valido ma vuoto.