⋔ Grafi e ottimizzazione

Flusso massimo e taglio minimo: Ford-Fulkerson ed Edmonds-Karp

Reti di flusso, capacità e cammini aumentanti: come funzionano Ford-Fulkerson ed Edmonds-Karp e perché il flusso massimo è uguale al taglio minimo.

Un acquedotto porta acqua da una sorgente a una città attraverso una rete di tubi, ciascuno con una portata massima. Quanta acqua al secondo può arrivare, al massimo, alla città? E se si volesse ridurre quella quantità tagliando alcuni tubi, quali sarebbero i più convenienti da tagliare? Sono due domande in apparenza diverse, ma hanno la stessa risposta numerica. È uno dei risultati più belli dell'ottimizzazione combinatoria: il teorema flusso massimo – taglio minimo.

Il modello: una rete di flusso

Una rete di flusso è un grafo orientato con:

  • una sorgente s, da cui il flusso parte;
  • un pozzo t, dove il flusso arriva;
  • una capacità c(u, v) ≥ 0 su ogni arco.

Un flusso assegna a ogni arco una quantità f(u, v) che rispetta due regole:

  1. vincolo di capacità: 0 ≤ f(u, v) ≤ c(u, v);
  2. conservazione: in ogni vertice diverso da s e t, quanto entra è uguale a quanto esce.

Il valore del flusso è la quantità totale che esce da s, uguale a quella che entra in t. Il problema del flusso massimo chiede il flusso di valore più alto.

Il grafo residuo

L'idea più ingegnosa è il grafo residuo. Per ogni arco (u, v) con flusso f e capacità c si considerano:

  • un arco in avanti con capacità residua c − f, cioè quanto si può ancora spingere;
  • un arco all'indietro (v, u) con capacità f, cioè quanto flusso si può «annullare».

Gli archi all'indietro sono essenziali. Permettono all'algoritmo di correggere una scelta precedente: se un primo percorso ha usato male un tubo, un percorso successivo può deviare quel flusso altrove.

Ford-Fulkerson: cammini aumentanti

Lo schema generale è semplice:

  1. parti dal flusso nullo;
  2. cerca nel grafo residuo un cammino da s a t, detto cammino aumentante;
  3. trova la capacità residua minima lungo il cammino (il «collo di bottiglia») e spingi quella quantità lungo tutto il cammino;
  4. ripeti finché non esistono più cammini aumentanti.

Quando l'algoritmo si ferma, il flusso è massimo. Con capacità intere ogni iterazione aumenta il flusso di almeno 1, quindi l'algoritmo termina e il flusso massimo trovato è a sua volta intero. Questa proprietà di integralità è fondamentale nelle applicazioni: garantisce soluzioni fatte di unità intere, come persone o veicoli.

Edmonds-Karp: scegliere bene il cammino

Ford-Fulkerson non specifica quale cammino aumentante scegliere, e una scelta sfortunata può richiedere moltissime iterazioni. Edmonds-Karp fissa la regola: si sceglie sempre il cammino aumentante con il minor numero di archi, trovato con una visita in ampiezza.

Con questa regola il numero di iterazioni è limitato indipendentemente dai valori delle capacità, e il costo totale è proporzionale a n · m². Per grafi molto grandi esistono algoritmi più rapidi, come quello di Dinic o i metodi push-relabel, ma Edmonds-Karp resta un ottimo punto di partenza: è corto, chiaro e affidabile.

Il taglio minimo

Un taglio s–t divide i vertici in due gruppi, S contenente s e T contenente t. La sua capacità è la somma delle capacità degli archi che vanno da S a T. Qualunque flusso deve attraversare il taglio, quindi nessun flusso può superare la capacità di nessun taglio.

Il teorema afferma che il valore del flusso massimo è uguale alla capacità del taglio minimo. Inoltre, alla fine di Ford-Fulkerson il taglio si trova gratis: S è l'insieme dei vertici ancora raggiungibili da s nel grafo residuo. Gli archi da S a T sono tutti saturi e formano il taglio minimo.

Un esempio

Archi con capacità: s→a 10, s→b 5, a→b 15, a→t 5, b→t 10.

  • Cammino s→a→t: collo di bottiglia 5. Flusso totale 5.
  • Cammino s→b→t: collo di bottiglia 5. Flusso totale 10.
  • Cammino s→a→b→t: residui 5, 15, 5. Collo di bottiglia 5. Flusso totale 15.

A questo punto entrambi gli archi uscenti da s sono saturi: s→a porta 10 su 10, s→b porta 5 su 5. Non esistono più cammini aumentanti: il flusso massimo è 15, e il taglio minimo è {s} contro il resto, con capacità 10 + 5 = 15.

Dove si usa

  • Logistica e trasporti: quante merci al giorno possono passare da un porto a un centro di distribuzione su una rete con limiti di capacità.
  • Reti informatiche: la banda massima tra due punti, e i collegamenti che costituiscono il vero collo di bottiglia. Il taglio minimo indica dove investire per aumentare la capacità.
  • Affidabilità: con capacità 1 su ogni arco, il flusso massimo è il numero di percorsi indipendenti tra due nodi, e il taglio minimo è il numero di collegamenti da interrompere per isolarli.
  • Visione artificiale: la segmentazione di immagini in primo piano e sfondo si formula come taglio minimo su un grafo di pixel.
  • Abbinamenti: assegnare lavoratori a turni o studenti a progetti si riduce a un flusso massimo su un grafo bipartito.

In sintesi

  • Una rete di flusso ha sorgente, pozzo e capacità; il flusso rispetta capacità e conservazione.
  • Ford-Fulkerson spinge flusso lungo cammini aumentanti nel grafo residuo.
  • Edmonds-Karp sceglie i cammini più corti con una BFS, con costo n · m².
  • Il flusso massimo è uguale alla capacità del taglio minimo, che si ricava dal grafo residuo finale.
  • Con capacità intere il flusso massimo è intero, proprietà decisiva per assegnamenti e logistica.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche