Ricerca di cicli negativi per l'algoritmo di annullamento del ciclo


9

Sto implementando l'algoritmo di annullamento del ciclo per trovare una soluzione ottimale per il problema del flusso di costo minimo. Individuando e rimuovendo i cicli di costo negativi nella rete residua, il costo totale viene ridotto in ogni round. Per trovare un ciclo negativo sto usando l'algoritmo bellman-ford.

Il mio problema è: Bellman-ford trova solo i cicli che sono raggiungibili dalla fonte, ma ho anche bisogno di trovare cicli che non sono raggiungibili.

Esempio: nella seguente rete abbiamo già applicato un flusso massimo. Il bordo(UN,B)lo rende molto costoso. Nella rete residua, abbiamo un ciclo di costi negativo con capacità1. Rimuoverlo, ci darebbe una soluzione più economica usando i bordi(UN,C) e (C,T), ma non possiamo raggiungerlo dalla fonte S.

Etichette: flusso / capacità, costo

inserisci qui la descrizione dell'immagine

Ovviamente, potrei eseguire Bellman-ford ripetutamente con ogni nodo come sorgente, ma non suona come una buona soluzione. Sono un po 'confuso perché tutti i documenti che leggo sembrano saltare questo passaggio.

Puoi dirmi come usare bellman-ford per trovare ogni ciclo negativo (raggiungibile o no)? E se non è possibile, quale altro algoritmo proponi?


Se non è possibile raggiungere un ciclo tramite la sorgente, come può influire sul flusso totale?
Nicholas Mancuso,

Non influirà sul valore del flusso ma sul costo totale. Vedi il nuovo esempio.
Patrick Schmidt,

2
Penso che dovresti far funzionare Bellman-Ford dal lavandino, no? Se trovi un flusso massimo,f, quindi sotto il grafico residuo solf non ci sarà un percorso da S per t. Pertanto, Bellman-Ford dovrebbe essere eseguitosolf con t.
Nicholas Mancuso,

Risposte:


2

Per espandere il mio commento, ricorda, questo algoritmo per la ricerca del flusso di costo minimo si basa sul fatto che fè massimo. Eseguendo prima Ford-Fulkerson per trovaref e la risultante rete residua solf, il costo f viene quindi ridotto trovando cicli negativi in solf. Cioè, trovando cicli negativi insolf non cambiamo la quantità di flusso, f, ma semplicemente il costo.

Ora eseguendo Bellman-Ford da t in solf possiamo tracciare indietro sui bordi che hanno un flusso non negativo (per definizione di solf). Se i cicli sono adiacenti a qualsiasi bordo di questi percorsi, allora possiamo "trasferire" una certa quantità di flusso ad altri bordi del ciclo. In altre parole, manteniamo lo stesso flusso di rete per un certo ciclo, ma siamo in grado di modificare il costo.

Si noti un ciclo non raggiungibile da tdeve avere flusso zero. Altrimenti avremmo una contraddizione inf essere massimi.


Mi scuso per il "carattere ondulato della mano" di questa spiegazione. Cercherò di essere più formale quando avrò tempo stasera.


Grazie, la tua ultima frase lo chiarisce. Quindi, è sufficiente affrontare i cicli che sono raggiungibili daT.
Patrick Schmidt,

0

Il mio consiglio: è necessario avviare l'algoritmo da T, al fine di trovare un ciclo negativo nella rete residua. Il risultato dovrebbe essere lo stesso, ma poi puoi raggiungere il cerchio


1
Questo funziona per questo grafico, ma puoi avere cicli negativi che non sono collegati a S o T. Sospetto che l'OP voglia una soluzione che funzioni in generale.
Peter Shor,

sì, in generale non è possibile trovare tutti i cicli negativi, ma l'OP vuole migliorare la sua rete residua controllando i costi. Quindi i cerchi negativi irraggiungibili non contano
Sven Jung,

Voglio usarlo per ottenere un flusso di costi minimo. Quindi la nuova domanda sarebbe: è sufficiente eliminare ogni ciclo raggiungibile dal lavandinoT(Nella rete residua). Al momento non riesco a trovare un contro esempio
Patrick Schmidt,

È possibile visualizzare un flusso come originario di S e andando a To invertire ogni lato e vederlo come originario di T e andando a S. Se si elimina ogni ciclo raggiungibile dalla fonteS non funziona, quindi eliminando ogni ciclo raggiungibile dal lavandino Tnon funzionerà. La sorgente e il sink si comportano in modo simmetrico.
Peter Shor,

ovviamente è lo stesso se inverti ogni fronte e parti da T, perché non è cambiato nulla. Ma perché non iniziare da T senza invertire i bordi? Allora dovresti trovare un ciclo negativo raggiungibile, se esistente. La domanda è se i cicli negativi irraggiungibili non contano davvero
Sven Jung,

0

Penso che non sia sufficiente far funzionare Bellman-Ford da T o S. Consideriamo un esempio in cui vi è un vantaggio da S a T e un ciclo di costi negativi non realizzabile né da S né da T.

Una soluzione è aggiungere una S 'ausiliaria e aggiungere un bordo da S' a qualsiasi altro vertice con costo 0. Quindi eseguire Bellman-Ford da S '. In questo modo, tutti i cicli negativi sono raggiungibili da S '.

Inoltre, non è necessario aggiungere quel vertice ausiliario S 'nella propria implementazione. Inizializza semplicemente d (v) = 0 per qualsiasi vertice v.

Scopri come implementare Boost Graph Library .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.