Salta al contenuto
Note per Studenti Taglio minimo randomizzato - algoritmo di Karger

Taglio minimo randomizzato - algoritmo di Karger

In questa pagina 6

Metodo: Monte Carlo a errore unilaterale ripetuto (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 →), con prodotto di probabilità condizionate (Probabilità condizionataLa probabilità di A sapendo che si è verificato B è P(A ∣ B) = P(A ∩ B) / P(B), con P(B) > 0; è una nuova misura di probabilità, e da essa seguono la regola del prodotto e la regola della catena.Probabilità condizionata →) e union bound (Union bound e verifica randomizzata - identità polinomiali e prodotti di matriciSpazi discreti richiamati; inclusione-esclusione (con le troncate di Bonferroni) e union bound Pr[unione] ≤ somma, valido senza indipendenza e stretto quando gli eventi sono rari (collisioni: C(n,2)/m). Principio delle decisioni differite: si fissa tutto tranne una scelta casuale e si limita la probabilità su quella. Lemma di Schwartz-Zippel: un polinomio non nullo di grado totale d, valutato in un punto di S^n scelto uniformemente, si annulla con prob ≤ d/|S| (induzione sul numero di variabili); test di identità polinomiale con errore unilaterale, ripetuto (d/|S|)^k. Freivalds: per verificare AB=C si controlla A(Br)=Cr con r in {0,1}^n in tempo O(n^2), errore ≤ 1/2 (stretto), 2^-k con k prove. Fingerprint: due stringhe di n bit si confrontano con a mod p per un primo casuale p ≤ M, errore ≤ n/π(M).Union bound e verifica randomizzata - identità polinomiali e prodotti di matrici →). Grafi: 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à →, Rappresentazione dei grafiStrutture di base (lista dei vertici LV, lista degli archi LE), liste di adiacenza, matrice di adiacenza; operazioni incidentEdges, opposite, areAdjacent; spazio e tempi a confronto; esempio con un grafo di 5 vertici.Rappresentazione dei grafi →.

1. Il problema

Sia G=(V,E)G=(V,E) un multigrafo non orientato connesso (sono ammessi archi paralleli) con n=∣V∣n=|V| vertici. Un taglio è una partizione V=S∪(V∖S)V=S\cup(V\setminus S) con S≠∅S\ne\emptyset e S≠VS\ne V; la sua dimensione è il numero di archi con un estremo per parte. Il taglio minimo (globale, senza sorgente e pozzo) è quello di dimensione minima kk: indica quanti archi bisogna togliere per sconnettere il grafo. Si può calcolare con algoritmi di flusso massimo; l'algoritmo di Karger ottiene lo stesso risultato con un'idea molto più semplice.

2. L'algoritmo di contrazione

Definizione. Contrarre un arco e={u,v}e=\{u,v\} significa fondere uu e vv in un unico supervertice: gli archi paralleli a ee diventano cappi e si eliminano, gli altri archi restano (anche se diventano paralleli tra loro). Il numero di vertici scende di 11.

Algoritmo (Karger). Finché il multigrafo ha più di 22 vertici: scegliere un arco uniformemente tra gli archi rimasti e contrarlo. Restituire gli archi che collegano i due supervertici finali.

Ogni supervertice rappresenta un insieme di vertici originali; al termine i due supervertici sono una partizione (S,V∖S)(S,V\setminus S) di VV e gli archi rimasti sono esattamente gli archi di GG che attraversano il taglio. L'algoritmo restituisce sempre un taglio valido (quindi di dimensione ≥k\ge k): è un Monte Carlo a errore unilaterale, che sbaglia solo restituendo un taglio non minimo. Con la matrice di adiacenza una contrazione costa O(n)O(n) e l'intera esecuzione O(n2)O(n^2).

Esempio. Due triangoli collegati da un ponte: vertici 1,2,3,4,5,61,2,3,4,5,6, archi a=12a=12, b=13b=13, c=23c=23, d=45d=45, e=46e=46, f=56f=56 e il ponte g=34g=34. Il taglio minimo è {g}\{g\}, di dimensione k=1k=1, con S={1,2,3}S=\{1,2,3\}.

Grafico interattivo: Due triangoli collegati dal ponte 3-4 (evidenziato): il taglio minimo ha dimensione 1

Esecuzione che riesce. Le scelte casuali sono aa, poi bb, poi dd, poi ee:

  1. 77 archi, 66 vertici. Si contrae aa: nasce {12}\{12\}; bb e cc diventano due archi paralleli {12}-3\{12\}\text{-}3. Restano 66 archi.
  2. Si contrae uno dei due archi paralleli (per esempio bb): nasce {123}\{123\} e l'altro parallelo diventa un cappo, eliminato. Restano 44 archi: il ponte gg ({123}-4\{123\}\text{-}4), dd, ee, ff.
  3. Si contrae dd: nasce {45}\{45\}; restano gg ({123}-{45}\{123\}\text{-}\{45\}) ed e,fe,f ({45}-6\{45\}\text{-}6): 33 archi.
  4. Si contrae ee: nasce {456}\{456\} e ff diventa un cappo. Resta il solo arco gg tra {123}\{123\} e {456}\{456\}: taglio di dimensione 11, il minimo.

Esecuzione che fallisce. Se il primo arco scelto è il ponte gg (probabilità 1/71/7), le due metà si fondono e ogni taglio che si potrà ottenere ha almeno 22 archi: il taglio minimo è perso.

3. Probabilità di successo

Teorema. Sia CC un taglio minimo di GG e k=∣C∣k=|C|. L'algoritmo restituisce proprio CC con probabilità Pr⁡[output=C] ≥ 2n(n−1)=1(n2).\Pr[\text{output}=C]\ \ge\ \frac2{n(n-1)}=\frac1{\binom n2}.

Dimostrazione. (1) Quando CC sopravvive. Gli archi tra le due parti di CC sono esattamente gli archi di CC. Se nessun arco di CC viene mai contratto, ogni contrazione fonde due vertici della stessa parte, quindi ogni supervertice sta tutto in una parte; alla fine i due supervertici coprono VV e le due parti sono non vuote, dunque sono proprio le due parti di CC e l'output è CC. Viceversa, se si contrae un arco di CC l'output non può essere CC. Quindi basta stimare la probabilità che ai passi i=1,…,n−2i=1,\dots,n-2 si scelga un arco fuori da CC: sia EiE_i l'evento «al passo ii non si sceglie un arco di CC».

(2) Un passo. Si supponga che E1,…,Ei−1E_1,\dots,E_{i-1} siano accaduti. Il multigrafo corrente GiG_i ha ni=n−i+1n_i=n-i+1 vertici e CC è ancora un taglio di GiG_i (con kk archi). Ogni taglio di GiG_i è anche un taglio di GG con lo stesso numero di archi, quindi il taglio minimo di GiG_i è ancora kk. Il grado di ogni supervertice è ≥k\ge k (gli archi uscenti da un supervertice formano un taglio), perciò ∣Ei∣=12∑vdeg⁡(v) ≥ nik2.|E_i|=\tfrac12\sum_v\deg(v)\ \ge\ \frac{n_ik}2 . Si sceglie un arco di CC con probabilità k/∣Ei∣≤2/nik/|E_i|\le2/n_i, quindi Pr⁡[Ei∣E1∩⋯∩Ei−1] ≥ 1−2ni=n−i−1n−i+1.\Pr[E_i\mid E_1\cap\dots\cap E_{i-1}]\ \ge\ 1-\frac2{n_i}=\frac{n-i-1}{n-i+1}.

(3) Prodotto. Per la regola del prodotto (Probabilità condizionataLa probabilità di A sapendo che si è verificato B è P(A ∣ B) = P(A ∩ B) / P(B), con P(B) > 0; è una nuova misura di probabilità, e da essa seguono la regola del prodotto e la regola della catena.Probabilità condizionata →) Pr⁡[⋂i=1n−2Ei]≥∏i=1n−2n−i−1n−i+1=n−2n⋅n−3n−1⋅n−4n−2⋯24⋅13=2n(n−1),\Pr\Big[\bigcap_{i=1}^{n-2}E_i\Big]\ge\prod_{i=1}^{n-2}\frac{n-i-1}{n-i+1}=\frac{n-2}{n}\cdot\frac{n-3}{n-1}\cdot\frac{n-4}{n-2}\cdots\frac24\cdot\frac13=\frac{2}{n(n-1)} , perché è un prodotto telescopico: restano a numeratore 2⋅12\cdot1 e a denominatore n(n−1)n(n-1). □\square

Sull'esempio dei due triangoli (n=6n=6, k=1k=1) la dimostrazione si legge passo per passo. Il bound è 23⋅35⋅12⋅13=115\frac23\cdot\frac35\cdot\frac12\cdot\frac13=\frac1{15}; nell'esecuzione sopra la probabilità effettiva di evitare il ponte in ciascun passo è 67,56,34,23\frac67,\frac56,\frac34,\frac23, tutte più grandi dei fattori 1−2/ni=23,35,12,131-2/n_i=\frac23,\frac35,\frac12,\frac13.

passo vertici nin_i archi ∣Ei∣\lvert E_i\rvert Pr⁡[evitare g]\Pr[\text{evitare }g] fattore del bound 1−2/ni1-2/n_i
1 66 77 6/76/7 2/32/3
2 55 66 5/65/6 3/53/5
3 44 44 3/43/4 1/21/2
4 33 33 2/32/3 1/31/3

Il valore esatto di successo per questo grafo, calcolato con Python enumerando tutte le sequenze di contrazioni con frazioni, è 13/35=0,37113/35=0{,}371; una simulazione con 10510^5 esecuzioni dà 0,3700{,}370. Il bound 1/15=0,0671/15=0{,}067 è molto pessimistico, ma è valido per ogni grafo.

Il bound è stretto. Sul ciclo CnC_n ogni contrazione dà un ciclo più corto e alla fine restano due archi paralleli: l'output ha sempre dimensione 22 ed è sempre un taglio minimo. I tagli minimi sono le coppie di archi, (n2)\binom n2 in tutto, e per simmetria (gli archi sopravvissuti sono una coppia uniforme) ciascuno esce con probabilità esattamente 1/(n2)1/\binom n2. Con Python: C5C_5 dà 1/101/10, C6C_6 dà 1/151/15 per ognuno dei tagli. Per il grafo completo K4K_4 (k=3k=3, quattro tagli minimi a vertice singolo) ognuno ha probabilità 1/5≥1/61/5\ge1/6.

Corollario. Un grafo con nn vertici ha al più (n2)\binom n2 tagli minimi.

Dimostrazione. Gli eventi «l'output è CC» per tagli minimi distinti sono disgiunti, ciascuno ha probabilità ≥1/(n2)\ge1/\binom n2 e la somma non supera 11. □\square

4. Ripetizioni

Un'esecuzione fallisce con probabilità ≤1−1/(n2)\le1-1/\binom n2. Si eseguono tt esecuzioni indipendenti e si tiene il taglio più piccolo: fallisce solo se falliscono tutte, Pr⁡[fallimento]≤(1−1(n2))t≤e−t/(n2).\Pr[\text{fallimento}]\le\Big(1-\frac1{\binom n2}\Big)^t\le e^{-t/\binom n2}. Con t=(n2)t=\binom n2 il fallimento è ≤e−1=0,368\le e^{-1}=0{,}368 (esattamente 0,3640{,}364 per n=10n=10, 0,3680{,}368 per n=100n=100); con t=(n2)ln⁡nt=\binom n2\ln n è ≤1/n\le1/n; in generale t=⌈(n2)ln⁡(1/δ)⌉t=\lceil\binom n2\ln(1/\delta)\rceil garantisce fallimento ≤δ\le\delta. Per δ=0,01\delta=0{,}01: n=10n=10 servono ⌈45ln⁡100⌉=208\lceil45\ln100\rceil=208 esecuzioni, n=50n=50 servono 56425642, n=100n=100 servono 2279622796. Per il grafo dei due triangoli bastano 1010 ripetizioni, perché (22/35)10=0,0096(22/35)^{10}=0{,}0096. Il costo totale con la matrice di adiacenza è O(n4log⁡n)O(n^4\log n).

python
import random

def karger(archi, n):
    """Una esecuzione. archi: lista di coppie (u, v) con vertici 0..n-1. Restituisce la dimensione del taglio."""
    padre = list(range(n))
    def trova(x):
        while padre[x] != x:
            padre[x] = padre[padre[x]]
            x = padre[x]
        return x
    vertici = n
    while vertici > 2:
        u, v = random.choice(archi)                    # arco uniforme fra tutti...
        a, b = trova(u), trova(v)
        if a != b:                                      # ...scartando i cappi equivale a scegliere fra i non-cappi
            padre[a] = b
            vertici -= 1
    return sum(1 for u, v in archi if trova(u) != trova(v))

def taglio_minimo(archi, n, t):
    return min(karger(archi, n) for _ in range(t))

due_triangoli = [(0, 1), (0, 2), (1, 2), (3, 4), (3, 5), (4, 5), (2, 3)]
N = 100000
print(sum(karger(due_triangoli, 6) == 1 for _ in range(N)) / N)   # circa 13/35 = 0.371
print(taglio_minimo(due_triangoli, 6, 10))                          # 1 con prob >= 0.99

5. Karger-Stein in breve

Le prime contrazioni sono sicure (il rischio è concentrato alla fine, dove nin_i è piccolo): contrarre da nn a tt vertici preserva CC con probabilità ∏i=t+1n(1−2i)=t(t−1)n(n−1),\prod_{i=t+1}^{n}\Big(1-\frac2i\Big)=\frac{t(t-1)}{n(n-1)}, che per t=⌈1+n/2⌉t=\lceil1+n/\sqrt2\rceil è ≥12\ge\frac12 (per n=100n=100: t=72t=72 e 0,5160{,}516). L'algoritmo di Karger-Stein contrae fino a tt vertici due volte in modo indipendente e risolve ricorsivamente le due copie, tenendo il minimo; sotto 66 vertici si fa tutto per forza bruta.

La probabilità di successo soddisfa p(n)≥1−(1−12p(t))2=p(t)−p(t)2/4p(n)\ge1-\big(1-\tfrac12p(t)\big)^2=p(t)-p(t)^2/4. Con pjp_j la probabilità a profondità jj (p0=1p_0=1) si dimostra per induzione pj≥1/(j+1)p_j\ge1/(j+1): 1j−14j2≥1j+1\frac1j-\frac1{4j^2}\ge\frac1{j+1} equivale a 4j≥j+14j\ge j+1. La profondità è log⁡2n=2log⁡2n\log_{\sqrt2}n=2\log_2n, quindi il successo è Ω(1/log⁡n)\Omega(1/\log n). Il tempo soddisfa T(n)=2T(n/2)+O(n2)T(n)=2T(n/\sqrt2)+O(n^2), cioè O(n2log⁡n)O(n^2\log n) (teorema dell'esperto: nlog⁡22=n2n^{\log_{\sqrt2}2}=n^2, caso centrale; Algoritmi ricorsiviAlgoritmi ricorsivi come induzione eseguita; albero della ricorsione e record di attivazione nello stack; esempi ReverseArray, LinearSum, Power in tempo logaritmico, Fibonacci ricorsivo (esponenziale) e con memoizzazione; analisi della complessità con l'albero della ricorsione e correttezza per induzione.Algoritmi ricorsivi →). Ripetendo O(log⁡2n)O(\log^2n) volte si ottiene il taglio minimo con alta probabilità in O(n2log⁡3n)O(n^2\log^3n), molto meglio dei O(n4log⁡n)O(n^4\log n) di Karger semplice.

Domande d'esame

  1. Dimostra che Karger trova un dato taglio minimo con probabilità ≥2/(n(n−1))\ge2/(n(n-1)). Vedi il teorema della sezione 3: grado minimo ≥k\ge k, ∣Ei∣≥nik/2|E_i|\ge n_ik/2, fattori 1−2/ni1-2/n_i, prodotto telescopico.
  2. Dimostra che un grafo ha al più (n2)\binom n2 tagli minimi. Eventi disgiunti «output =C=C», ciascuno con probabilità ≥1/(n2)\ge1/\binom n2, somma ≤1\le1. Il ciclo CnC_n raggiunge il limite.
  3. Quante esecuzioni per un grafo con n=20n=20 vertici se si vuole fallire con probabilità ≤1%\le1\%? (202)=190\binom{20}2=190 e 190ln⁡100=875,0190\ln100=875{,}0, quindi t=875t=875.
  4. Perché ogni supervertice ha grado almeno kk? Gli archi uscenti da un supervertice separano quel supervertice dal resto: sono un taglio di GG, quindi sono almeno kk.

Versione ripasso

Esercizi su questo argomento

Teoria collegata