Sei sulla pagina 1di 2

Massimo sottoinsieme indipendente(Vedasi madi wis.

pdf)

Bellman Ford

Dijska non pu essere usato quando il peso degli archi negativo.

NB Bellman Ford richiede grafi non orientati

Bellman ford pu calcolare il cammino minimo anche in presenza di archi con peso
negativo, a condizione che non esistano cicli con peso complessivo negativo, la
distanza tra qualunque coppia di nodi presenti nel ciclo sarebbe
INFINITE(posso ripassare infinite volte nel ciclo per diminuire il costo
totale), esso avviene per tutte le coppie di nodi presenti nella stessa
componente connessa.

Per ogni nodo viene mantenuto in dist[v] la distanza del cammino minimo pi
breve da s a v, fin'ora trovato, e in pred[v] il nodo che precede v in tale
cammino(NB pred[s]=s)

l'algoritmo opera per n= #V iterazioni per ogni arco di G

if(dist[u] > dist[v] + W(u,v), se cos significa che esiste un cammino da s a


v pi breve del miglior cammino minimo da s a u esaminato fin ora

Correttezza:

verifichiamo che all'inizio dell'iterazione i nel ciclo pi esterno, abbiamo che


dist[v] = cammino_minimo (s,v) per ogni nodo v per il quale il cammino minimo
composto da pi archi

Caso base: banalmente verificato

Passo induttivo, supponiamo che la propriet sia vera all'inizio dell'iterazione


i: se consideriamo un qualunque nodo v tale che il cammino minimo da s, , u,v
comprende i+1 archi, ne segue che il cammino per arrivare a u comprenda i primi
i archi del cammino precedente e quindi abbiamo dist[u] = cammino minimo(s,u),
nel corso dell'iterazione i il cammino aggiornato in modo che dist[v] =
dist[u] + W(u,v) che uguale al cammino minimo da s a v per ipotesi che sia
minimo

Visto che non possono esserci, per ipotesi, cicli di peso negativo l'algoritmo
eseguir n-1 iterazioni, se l'algoritmo effettuasse pi di n iterazioni i
cammini minimi non cambierebbero e se esistessero cicli di peso negativo il
valore di dist[v] si decrementerebbero all'infinito

Costo : O(n) iterazioni in cui esaminiamo l'arco 2 volte per cui O(m) quindi
O(n*m), e se volessimo farlo per ogni nodo risulterebbe assai costoso per
questo si pensa a un altro algoritmo

Idea programmazione dinamica

Per i cammini minimi tra tutti i nodi sarebbe sufficiente applicare questo
algoritmo n volte, ma il costo risulterebbe eccessivo; vediamo di sfruttare
qualche principio di programmazione dinamica; per ottenere i sotto problemi pi,
dobbiamo limitare la lunghezza dei cammini tra i quali scegliere.
Definiamo quindi il problema Pk,i, cio trovare il cammino al nodo i di
lunghezza massima k.
L'idea molto semplice:

1. Per ogni nodo u, troviamo la il cammino minimo pi breve che porta a i(non
destinazione), con al massimo un arco, altrimenti segnamo infinito

2. Continuiamo con il punto 1 incrementando il numero di archi da controllare


e dopo al massimo #V, perch non passo per cicli e passo al massimo una
volta per ogni arco, avremo le distanze minime calcolate.

Individuazione dei sotto problemi

Supponiamo di conoscere una soluzione ottimale per il problema Pk,i, a questo


punto ragioniamo sulla lunghezza del percorso della soluzione ottimale essa
lunga meno o pi di k?

1. Nel caso fosse < k risulta evidente che anche una soluzione ammissibile
per Pk-1,i
2. Nel caso fosse = k allora definiamo j il nodo che si attraversa per
raggiungere i attraverso l'arco (j,i) togliendo quest'arco otteniamo un
cammino S' lungo k-1 che una soluzione ammissibile per Pk-1,j

Dimostrazione:

1. ottimale per Pk-1,i; se non lo fosse esisterebbe S' migliore di S per


Pk-1,i, ma sicch S' arriva a i una soluzione anche per Pk,i
2. Stesso ragionamento

Soluzione:

D[v,n-1]= min(D[v,n-2], min(D[u,n-2] + peso(u,v)))

se ne ricava la seguente disuguaglianza, detta anche condizione di


bellman(con array)

d[u(nodo destinazione)]<= d[v] + w(u,v) per ogni arco (u,v), questo


fondamentalmente perch d[u] ad ogni istante contiene = D[v,k-1]

Algoritmo di bellMan Ford per DAG

L'algoritmo di bellman ford risulta essere pi costoso dell'algoritmo di DIJSKA


il problema che non tutti i sotto problemi analizzati servono per risolvere i
rispettivi sottoproblemi pi complessi, ci che potremmo fare, per ottimizzare
la complessit costruire un grafo lineare dei sottoproblemi il che ci
porterebbe a una complessit di O(V+E)

Per ricostruire la soluzione ottimale mi basta scorrere l'array dei nodi padre

Algotmo di bellman ford per cicli negativi, mi basta eseguire un numero di


iterazioni >= n se il cammino minimo diminuisce allora siamo in presenza di
cicli di peso negativo.