Algoritmo Bellman-Ford - Perché i bordi possono essere aggiornati fuori servizio?


14

L' algoritmo di Bellman-Ford determina il percorso più breve da una sorgente a tutti gli altri vertici. Inizialmente la distanza tra s e tutti gli altri vertici è impostato su . Quindi viene calcolato il percorso più breve da s a ciascun vertice; questo continua per | V | - 1 iterazioni. Le mie domande sono:SSS|V|1

  • Perché ci deve essere iterazioni?|V|1
  • Avrebbe importanza se controllassi i bordi in un ordine diverso?
    Dire, se prima controllo i bordi 1,2,3, ma poi sulla seconda iterazione controllo 2,3,1.

Il Prof. Eric Eric ha detto che l'ordine non ha importanza, ma questo mi confonde: l'algoritmo non aggiorna in modo errato un nodo basato sul bordo se il suo valore dipendesse dal bordo x 1 ma x 1 viene aggiornato dopo x 2 ?x2x1x1x2


Quale implementazione consideri? La programmazione dinamica non ha problemi con l'ordine, ovviamente; per altri potrebbe non essere banale.
Raffaello

Risposte:


15

Considera il percorso più breve da a t , s , v 1 , v 2 , , v k , t . Questo percorso consiste al massimo | V | - 1 spigolo, perché ripetere un vertice in un percorso più breve è sempre una cattiva idea (o almeno esiste un percorso più breve che non ripete i vertici), se non abbiamo cicli di peso negativi.sts,v1,v2,,vk,t|V|1

Nel primo round, sappiamo che il bordo sarà rilassato, quindi la stima della distanza per v 1 sarà corretta dopo questo giro. Si noti che non abbiamo idea di cosa sia v 1 a questo punto, ma poiché abbiamo rilassato tutti i bordi, dobbiamo aver rilassato anche questo. Nel secondo round, ci rilassiamo ( v 1 , v 2 ) ad un certo punto. Non abbiamo ancora idea di cosa siano la v 1 o la v 2 , ma sappiamo che le loro stime di distanza sono corrette.(s,v1)v1v1(v1,v2)v1v2

Ripetendo questo, dopo alcuni round , ci siamo rilassati ( v k , t ) , dopo di che la stima della distanza per t è corretta. Non abbiamo idea di cosa sia k fino alla fine dell'intero algoritmo, ma sappiamo che accadrà ad un certo punto (supponendo che non ci siano cicli di peso negativi).k+1(vk,t)tk

Quindi, l'osservazione cruciale è che dopo il round , l' i -nodo del percorso più breve deve avere la sua stima della distanza impostata sul valore corretto. Poiché il percorso è al massimo | V | - 1 lato lungo, | V | - 1 round è sufficiente per trovare questo percorso più breve. Se un | V | il round cambia ancora qualcosa, quindi sta succedendo qualcosa di strano: tutti i percorsi dovrebbero già essere "sistemati" ai loro valori finali, quindi dobbiamo avere la situazione che esiste un ciclo di peso negativo.ioio|V|1|V|1|V|


Ho un piccolo dubbio qui. Credo che | v | -1 sia il numero peggiore di round dopo i quali viene calcolato il percorso più breve da s a t. Supponiamo di avere vertici s, v1, v2..vn, t. Se il i bordi sono scelti in questo ordine dire (s, v1), (v1, v2) .. (vn, t), quindi in una singola iterazione stessa avremo il percorso più breve da s a t. Questo è solo per capire e in termini pratici non conosciamo l'ordine dei bordi che vengono scelti e quindi i giri di | v | -1. Ho ragione?
Whokares,

1
@whokares: sì, potresti essere fortunato e trovare il percorso più breve al primo turno. Non si sa con certezza fino all'ultimo round che il valore che si trova in realtà è il percorso più breve, ma potrebbe essere. L'algoritmo di Dijkstra essenzialmente "fa sì" che ciò accada: se tutti i bordi hanno pesi non negativi, la coda di priorità utilizzata nell'algoritmo di Dijkstra "predice" l'ordine in cui dovresti rilassare i bordi in modo da trovare tutti i percorsi più brevi nel tuo primo giro di rilassamenti.
Alex ten Brink,

Grazie per l'aggiornamento. L'ho preso. In uno dei materiali, è menzionato come <br> Diapositiva 6: Una cattiva scelta dell'ordine di rilassamento può portare a esponenzialmente molti rilassamenti: <br> Diapositiva 8: Ordine "intelligente" di rilassamenti del bordo <br>
whokares,

Indipendentemente dall'ordine dei bordi in ogni iterazione, i percorsi più corti verranno calcolati nelle iterazioni | v | -1 giusto? Perché dice esponenziale. Vuol dire che se abbiamo scelto lo stesso ordine per tutte le iterazioni che facciamo normalmente, verrà chiamato il codice di rilassamento ma l'aggiornamento dell'etichetta per un vertice potrebbe avvenire solo un numero minore di volte a causa dell'ordine, risparmiando così il processore tempo ?
Whokares,

1
@whokares: il primo algoritmo che presentano (che può avere un tempo di esecuzione esponenziale) non rilassa tutti i bordi in un round, ma trova invece un bordo per il quale un'operazione di rilassamento cambierebbe qualcosa e rilassa questo bordo. Se continui a farlo e non c'è un ciclo di peso negativo, alla fine nessun bordo ti aiuterebbe più e ti fermerai. Tuttavia, poiché non hai round e nessun ordine su quale bordo rilassarsi dopo, potresti finire per fare un numero esponenziale di rilassamenti. L'algoritmo migliorato che presentano è Bellman-Ford, che ha round.
Alex ten Brink,

3

Il più lungo può essere un percorso senza cicli |V|. Iniziamo con una fonte, quindi abbiamo già un percorso di lunghezza 1, quindi abbiamo bisogno di |V| - 1più nodi per ottenere il percorso più lungo.

L'ordine non ha importanza perché ogni ordine manterrà l'invariante: dopo le niterazioni, il valore per ciascun nodo è inferiore o uguale al costo del percorso di costo minimo dal snodo che contiene la maggior parte dei nbordi.

Se, all'inizio di un'iterazione, il costo è corretto fino ai nnodi, quindi alla fine dell'iterazione è corretto fino ai n+1nodi. Un riordino può far sì che alcuni nodi abbiano un costo inferiore prima che vengano normalmente aggiornati, ma alla fine verrebbero comunque aggiornati.


Non so se sono solo io, o non riesco davvero a visualizzare facilmente questi fatti. Per me, continuo a pensare che potrebbero esserci dei nodi che non si sono aggiornati nelle iterazioni V-1.
user1675999,

No, hai | E | = | V | -1 spigoli quando hai | V | nodi collegati da un semplice percorso senza cicli. E hai | V | -1 iterazioni, elimina la tua risposta perché è sbagliata.
Sam,

@sam Chi sei e cosa c'entra tutto ciò che dici con la risposta?
fgb,
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.