2015-04-18 14 views
7

Ok, prima di tutto so che Dijkstra non funziona con pesi negativi e possiamo usare Bellman-ford invece di farlo. Ma in un problema mi è stato dato afferma che tutti i bordi hanno pesi da 0 a 1 (0 e 1 non sono inclusi). E il costo del percorso è in realtà il prodotto.Algoritmo di Dijkstra per pesi negativi

Quindi quello che stavo pensando è solo prendere il registro. Ora tutti i bordi sono negativi. Ora so che Dijkstra non funzionerà con pesi negativi, ma in questo caso tutti i bordi sono negativi, quindi non possiamo fare qualcosa in modo che Dijkstra funzioni.

Mi sembra di moltiplicare tutti i pesi di -1 ma poi il percorso più breve diventa il percorso più lungo.

Quindi è comunque possibile evitare l'algoritmo Bellman-Ford in questo caso.

La domanda esatta è: "Supponiamo che per alcune applicazioni il costo di un percorso sia uguale al prodotto di tutti i pesi dei bordi del percorso. Come utilizzeresti l'algoritmo di Dijkstra in questo caso? Tutti i pesi del i bordi sono da 0 a 1 (0 e 1 non sono inclusi). "

+2

In primo luogo, presumo che il grafico sia diretto. Ora se i pesi sono compresi tra 0 e 1 e il costo è misurato dal prodotto dei pesi, allora in effetti stai cercando il percorso più lungo. Se c'è un ciclo nel grafico, allora è equivalente a un ciclo di costi negativo. –

+0

Quindi Dijkstra avrebbe funzionato. Ho solo bisogno di trovare il percorso più lungo. Inoltre non è richiesto alcun requisito aggiuntivo, quindi questa è la ragione per cui ero confuso. –

+0

Sei sicuro di non volere il percorso più probabile? –

risposta

1

Quindi si desidera utilizzare una funzione, diciamo F, che verrà applicata ai pesi del grafico originale e quindi con l'algoritmo di Dijkstra troverete il percorso del prodotto più breve. Consideriamo anche il seguente grafico che si parte dal nodo A e dove 0 < x < y < 1:

Second graph

Nel grafico sopra F(x) deve essere minore di F(y) per l'algoritmo di Dijkstra all'uscita correttamente i percorsi più brevi da A.

Ora, diamo un grafico leggermente diverso che si ricomincia dal nodo A:

First graph

allora come l'algoritmo di Dijkstra funzionerà?

Dal F(x) < F(y) quindi selezioneremo il nodo B al passaggio successivo. Quindi visiteremo il nodo rimanente C.L'algoritmo di Dijkstra mostrerà che il percorso più breve da A a B è A -> B e il percorso più breve da A a C è A -> C.

Ma il percorso più breve da A a B è A -> C -> B con costo x * y < x.

Ciò significa che non possiamo trovare una funzione di trasformazione del peso e aspettiamo che l'algoritmo di Dijkstra funzioni in ogni caso.

3

Se tutti i pesi sul grafico sono nella gamma (0, 1), quindi ci sarà sempre un ciclo il cui peso è di meno che 1, e quindi sarà bloccato in questo ciclo per sempre (ogni passano sul ciclo riduce la peso totale del percorso più breve). Probabilmente hai frainteso il problema e vuoi trovare il percorso più lungo, oppure non ti è permesso visitare lo stesso vertice due volte. Ad ogni modo, nel primo caso l'algoritmo dijkstra'a è sicuramente applicabile, anche senza la modifica log. E sono abbastanza sicuro che il secondo caso non può essere risolto con la complessità polinomiale.

+0

E se non ci fosse permesso di visitare lo stesso vertice due volte? –

+0

@GeorgeAdams Questo è il secondo caso che menziono nella mia risposta. È possibile ridurre il problema alla ricerca del percorso più lungo, quindi non esiste alcuna soluzione polinomiale nota (consultare questo articolo: http://cstheory.stackexchange.com/questions/17462/finding-the-shortest-path-in-the -presenza-di-cicli negativi) –

+1

Risposta perfetta. Solo selezione nitida: puoi ridurre la ricerca del percorso più lungo, ciò che dimostra la durezza NP. –

0

Hai scritto:

ho pensato di moltiplicare tutti i pesi di -1 ma poi il percorso più breve diventa il percorso più lungo.

Per alternare tra il percorso più breve e quello più lungo, invertire i pesi. Quindi 1/3 sarà 3, 5 sarà 1/5 e così via.

+0

Ma non darà più la stessa risposta se si prende l'inverso. Supponi di avere dist (a, c) = 1, dist (a, b) = 2, dist (b, c) = 2. Il percorso più lungo è il costo a-b-c 4. Se si prende l'inverso, abbiamo dist (a, c) = 1, dist (a, b) = 0.5, dist (b, c) = 0.5. Qui sia a-b-c che a-c hanno lo stesso percorso più breve. – justhalf

0

Se il tuo grafico ha cicli, nessun algoritmo di percorso più breve troverà una risposta, perché quei cicli saranno sempre "cicli negativi", come ha sottolineato Rontogiannis Aristofanis.

Se il grafico non ha cicli, non è necessario utilizzare Dijkstra a tutti.

Se è diretto, è un DAG e ci sono algoritmi di percorso più breve tempo lineare.

Se è non orientato, è un albero, ed è banale trovare il percorso più breve tra gli alberi. E se il tuo grafico è diretto, anche senza cicli, Dijkstra continua a non funzionare per lo stesso motivo per cui non funziona con il grafico del bordo negativo.

In tutti i casi, Dijkstra è una scelta terribile di algoritmo per il tuo problema.

Problemi correlati