Esercizio - Contrazione di Karger a mano su un grafo con cinque vertici
Testo. Il grafo ha vertici e archi .
Grafico interattivo: Il grafo G: l'arco 4-5 (evidenziato) è l'unico taglio minimo
- Trovare la dimensione del taglio minimo e il limite inferiore di Karger sulla probabilità di trovarlo.
- Eseguire l'algoritmo con le scelte , poi un arco fra il supervertice e , poi un arco fra e il supervertice: descrivere i multigrafi e il taglio finale.
- Calcolare la probabilità esatta che una esecuzione trovi il taglio minimo, distinguendo il primo arco scelto.
- Quante esecuzioni indipendenti per fallire con probabilità : col valore esatto e col limite di Karger?
Soluzione
Punto 1. Il vertice ha grado , quindi è un taglio di dimensione e (il grafo è connesso: ). È l'unico taglio minimo: ogni altro taglio ha almeno archi, perché il sottografo su ha taglio minimo (ai vertici e arrivano due archi). Con il limite è .
Punto 2. Scelte: , poi , poi .
- Contrae : nasce . Gli archi diventano , , , , : archi (, , due paralleli , ), vertici .
- Contrae un arco : nasce e l'altro diventa un cappo, eliminato. Archi: (da ), (da ), (da ): archi, vertici .
- Contrae uno dei due : nasce ; l'altro diventa un cappo. Resta il solo arco .
Il taglio finale è , cioè l'arco , di dimensione : il taglio minimo è trovato.
Punto 3. Il primo arco ha probabilità ciascuno; se è il taglio è perso. Si calcola la probabilità di non scegliere mai in ciascun caso.
Primo arco (o , per simmetria ). Nasce ; archi: doppio, , , : archi. Si evita con :
- (): nasce con archi doppi e : archi, evita con ;
- (): nasce con archi tripli e : archi, evita con ;
- (): nasce con archi tripli e : archi, evita con .
.
Primo arco . Nasce ; archi: doppio, doppio, : archi. Con () o () si ottengono archi (due paralleli e ) e si evita con : .
Primo arco (o , per simmetria). Nasce ; archi: , , doppio, : archi, da cui evitare ( in tutto):
- (): con tripli e : ;
- (): con tripli e : ;
- (): con doppi e : .
.
Probabilità totale: Il limite è molto pessimistico.
Punto 4. Fallimento per esecuzione . Serve : , quindi . Con il limite di Karger: .
Risultati: (arco ); limite ; probabilità esatta ; esecuzioni (esatto) o (limite).
import random
G = [(1, 2), (1, 3), (2, 3), (2, 4), (3, 4), (4, 5)]
def karger(archi, vertici):
padre = {v: v for v in vertici}
def trova(x):
while padre[x] != x: x = padre[x]
return x
n = len(vertici)
while n > 2:
u, v = random.choice(archi)
a, b = trova(u), trova(v)
if a != b: padre[a] = b; n -= 1
return sum(trova(u) != trova(v) for u, v in archi)
N = 200000
print(sum(karger(G, range(1, 6)) == 1 for _ in range(N)) / N, 7 / 15) # 0.467Versione ripasso
- Grafo: archi ; taglio minimo , (grado di è ); limite (Taglio minimo randomizzato - algoritmo di KargerTaglio minimo globale di un multigrafo con n vertici. Algoritmo di Karger: finché restano più di 2 vertici, scegliere un arco uniformemente tra i rimasti e contrarlo (fondere gli estremi, tenere i paralleli, togliere i cappi); gli archi tra i due supervertici finali sono un taglio. Un taglio minimo C di k archi sopravvive se nessun suo arco viene contratto; con n_i vertici il grado minimo è ≥ k, quindi |E_i| ≥ n_i k/2 e Pr[contrarre un arco di C] ≤ 2/n_i; il prodotto telescopico dà Pr[output = C] ≥ 2/(n(n-1)) = 1/C(n,2). Con t = C(n,2) ln(1/δ) ripetizioni indipendenti il fallimento è ≤ δ. Corollario: un grafo ha al più C(n,2) tagli minimi (stretto per il ciclo). Karger-Stein: contrarre fino a n/√2+1 vertici (sopravvive con prob ≥ 1/2) e ricorrere due volte, T(n) = O(n² log n), successo Ω(1/log n).Taglio minimo randomizzato - algoritmo di Karger →).
- Esecuzione : con archi ; poi con ; poi con l'arco : taglio , riuscita.
- Probabilità esatta: primo arco ; sopravvivenza dopo ; dopo ; dopo . Totale .
- Casi del primo arco: da o restano archi con doppio; da restano e doppi; da o resta doppio. Ogni caso si chiude con o all'ultimo passo.
- Ripetizioni per : esatto ; limite .
- Errori tipici: non togliere i cappi dopo la fusione; contare gli archi paralleli come uno solo nella scelta uniforme; dimenticare la simmetria .