Flusso di Costo Minimo Applicazione di algoritmi: cancellazione cicli negativi (CCN) Premessa: si assume di aver risolto (correttamente!) un precedente esercizio sul Flusso Massimo (con un qualunque algoritmo). Ci riferiamo a questo esercizio come “Esercizio 1”. Il testo dell’esercizio 1 deve ovviamente specificare una rete con le capacità superiori sugli archi. Esercizio 1 Si consideri la seguente rete di flusso, in cui le capacità superiori sono tutte pari a due, ad esclusione di quelle degli archi (s,2) e (3,t), che sono pari a 3, come indicato in figura. Si determini un flusso di valore massimo da s a t… 1 4 s t 3 2 3 3 Soluzione: il flusso di valore massimo, pari a v=5, è descritto nella seguente figura. 2 1 2 4 2 0 2 s 2 3 2 t 0 3 3 1 In realtà, a noi interessa soprattutto il grafo residuo relativo al flusso suddetto, cioè il grafo residuo ottenuto all’ultima iterazione dell’algoritmo per il Flusso Massimo, che è descritto nella seguente figura (sono mostrate le capacità residue). 2 2 s 1 4 2 2 2 2 t 1 3 2 1 1 3 3 Esercizio 2 (algoritmo CCN) Definiamo un problema di Flusso di Costo Minimo (MCF) a partire dal problema di Flusso Massimo dell’esercizio 1, definendo costi sugli archi come indicato in figura. Il nodo s ha una richiesta di flusso pari a -v, il valore del flusso massimo dell’esercizio 1; il nodo t ha una richiesta di flusso pari a v. Gli altri nodi sono di transito. 1 1 4 0 0 4 2 s 0 0 2 t 1 3 0 1 Mostrare che la soluzione ottima x’ del problema MCF si ottiene, a partire dal flusso ottimo x dell’esercizio precedente, cancellando un solo ciclo di costo negativo. Si chiede di: 1.calcolare il costo della soluzione x; 2.identificare il ciclo negativo, il suo costo e la sua capacità; 3.fornire il flusso ottimo x’ e il suo costo; 4.fornire un certificato di ottimalità per il flusso x’. Non si richiede di applicare specifici algoritmi per la ricerca del ciclo, che può essere facilmente identificato per ispezione. Svolgimento Possiamo, per cominciare, identificare la rete su cui è definito il problema MCF: a ciascun arco si associa la coppia [costo,capacità superiore]; ai nodi s e t associamo le domande -5 e +5. 1 [0, 2] [1, 2] 4 [0, 2] [4, 2] -5 s t 5 [1, 2] [2, 2] [0, 2] [0, 3] 2 [1, 2] 3 [0, 3] NOTA: si tratta della “rete trasformata” su cui abbiamo applicato l’algoritmo SSP! Nota: identificare il problema MCF è un passo utile, anche se non indispensabile per lo svolgimento dell’esercizio, visto che in pratica lavoreremo soltanto sul grafo residuo. Punto 1 costo della soluzione x. Confrontando i flussi sugli archi relativi a x (dalla slide 2) e i costi assegnati agli archi nel problema MCF, vediamo che gli unici archi che hanno sia il flusso che il costo diversi da zero sono (1,4), (2,1) e (2,3) 1 1 0 4 0 4 costi 2 s 0 0 2 1 2 t 1 0 3 1 2 4 2 0 2 s 2 3 2 1 t 0 3 Dunque il costo di x è (1 2) + (2 2) + (1 1) = 7 3 flussi Punto 2 identificazione del ciclo Dobbiamo per prima cosa identificare il grafo residuo relativo al flusso ottimo x dell’esercizio sul flusso massimo. Per fare questo, riprendiamo il grafo residuo ottenuto alla fine dell’esercizio sul flusso massimo (slide 2) e lo completiamo associando a ciascuno arco il costo corrispondente, oltre alla capacità residua che già abbiamo. Ovviamente, i costi sugli archi del grafo residuo sono ottenuti dai costi assegnati dall’esercizio. Grafo residuo con costi e capacità residue: [costo,capacità] [-1,2] [0,2] 1 4 [0,2] [0,2] [4,2] s [-2,2] [0,3] 2 t [1,1] [-1,1] [1,1] 3 [0,3] Sul grafo residuo identifichiamo il ciclo negativo (1,2,3,1). Il costo è -2+1+0=-1. La capacità è 1, determinata dall’arco (2,3). [-1,2] [0,2] 1 4 [0,2] [0,2] [4,2] s [-2,2] [0,3] 2 t [1,1] [-1,1] [1,1] 3 [0,3] Punto 3 calcolo della soluzione ottima x’ Dobbiamo spedire un flusso 1 (pari alla capacità) lungo il ciclo negativo (1,2,3,1) [-1,2] [0,2] 1 4 [0,2] [0,2] [4,2] s [-2,2] t [1,1] [0,3] [-1,1] 2 [0,3] 3 [1,1] Dopo la spedizione del flusso sul ciclo, il nuovo grafo residuo è il seguente [-1,2] [0,2] 1 [2,1] s 4 [0,1] [4,2] [0,1] [-2,1] t [1,1] [0,3] 2 [0,2] [-1,2] 3 [0,3] Dal nuovo grafo residuo otteniamo (come visto per il problema di Flusso Massimo) il flusso (ottimo) x’: 2 1 2 4 2 flussi 0 1 s 1 3 2 2 t 0 3 3 Il costo di x’ si ottiene come: costo di x + (costo del ciclo capacità del ciclo) = 7 + (-1 1) = 6 Nota: per verifica, si può calcolare il costo moltiplicando i nuovi flussi sugli archi per i costi. Nota: il flusso ottimo x’ è quello individuato, sulla rete trasformata, nell’esercizio di applicazione dell’algoritmo SSP. Punto 4 Ricerca di un certificato di ottimalità Metodo “informale”: possiamo risolvere il problema sfruttando questa proprietà: Se un arco (i,j) non è né vuoto né saturo, nel grafo residuo compaiono i due archi (i,j) e (j,i), con costi c[i,j] e –c[i,j], rispettivamente; dunque, affinchè entrambi gli archi abbiano costo ridotto non-negativo, occorre che questo costo ridotto sia per entrambi zero; questo permette, dato il potenziale di uno dei due nodi, di fissare univocamente l’altro. Dunque, fissato arbitrariamente il potenziale di un nodo, possiamo derivare i potenziali di altri nodi. Per i nodi il cui potenziale non viene fissato in questo modo dobbiamo scegliere il potenziale in modo da rendere non-negativi i costi ridotti degli archi adiacenti. Più in generale, per i nodi il cui potenziale non viene fissato, possiamo determinare gli intervalli a cui tale potenziale deve appartenere. 2 [3,4] -1 1 s 0 2 0 4 1 -2 2 0 4 -1 t 3 2 Trascuriamo per il momento i nodi s e t. 1. Diamo (arbitrariamente) al nodo 2 potenziale 0. 2. Diamo al nodo 1 potenziale 2 per avere costi ridotti nulli sugli archi (1,2) e (2,1), corrispondenti ad un arco non vuoto e non saturo. 3. Diamo al nodo 3 potenziale 2 per avere costi ridotti nulli sugli archi (1,3) e (3,1), corrispondenti ad un arco non vuoto e non saturo. 4. Il potenziale del nodo 4 non è fissato, ma deve essere: • Almeno pari a 1, per rendere non-negativo il costo ridotto dell’arco (4,3); • Almeno pari a 3, per rendere non-negativo il costo ridotto dell’arco (4,1); • Non maggiore di 4, per non rendere negativo il costo ridotto dell’arco (2,4). Dunque il potenziale del nodo 4 deve appartenere all’intervallo [3,4]. 2 [3,4] -1 1 0 ≤0 s 0 2 0 0 0 4 t ≥p4 1 -2 2 0 4 -1 0 3 2 Consideriamo ora i nodi s e t: • Il potenziale del nodo t deve essere almeno pari a quello del nodo 4, per rendere non negativo il costo ridotto sull’arco (t,4); di conseguenza, il costo ridotto dell’arco (t,3) risulterà positivo; • Il potenziale del nodo s deve essere minore o uguale a zero, per rendere non negativo il costo ridotto sull’arco (2,s); di conseguenza, il costo ridotto dell’arco (1,s) risulterà positivo. Tra i vettori di potenziali che rispettano i limiti visti possiamo scegliere, ad esempio: π = [0,2,0,2,3,3] [s,1,2,3,4,t] Questo vettore costituisce il certificato di ottimalità per x’ richiesto. Nota: è lo stesso vettore di potenziali trovato applicando l’algoritmo SSP. Metodo formale: si risolve un problema di cammino minimo con radici multiple, in cui tutti i nodi sono radici. Questo è equivalente a risolvere il problema SPT di radice r sul grafo riportato qui sotto, dove gli archi uscenti da r hanno costo zero. r -1 0 -1 1 4 0 -3 s 0 2 0 4 2 t 1 -2 0 -3 0 -1 0 0 3 -1 In questo caso, la soluzione trovata è unica, e corrisponde al vettore delle distanze minime da r, riportate in blu nella figura. Il corrispondente albero dei cammini minimi è quello evidenziato (notare che i nodi 4 e t sono “figli” della radice).