Percorsi minimi
COS' E' UN PERCORSO MINIMO
Un comportamento medio, che può essere assunto come un dato
estremamente significativo nella mobilità generale, è il
percorso minimo che ogni individuo cerca di fare per andare da un
punto ( origine ) ad un altro ( destinazione ). Il territorio può
essere visto come un grafo in cui le città sono i nodi e i
percorsi che le collegano sono gli archi.
Dato un nodo origine s e un nodo destinazione t , si vuole
determinare il cammino semplice di lunghezza minima che collega s
a t.
Il problema del cammino minimo tra due vertici offre
evidentemente innumerevoli possibilità di applicazione, sia nel
caso di reti di trasporto sia per reti di altra natura (elettriche,idrauliche,
di relazione logica tra entità).
Il problema più classico è di determinare il cammino avente
costo o tempo minimo tra due nodi assegnati di un grafo.
Infatti lo studio del percorso minimo può essere effettuato
utilizzando parametri diversi:
1) OTTIMIZZAZIONE DEL TEMPO
2) OTTIMIZZAZIONE DELLE DISTANZE
3) OTTIMIZZAZIONE DEI COSTI
Se in prima analisi i problemi sembrano non avere correlazione
tra loro, in realtà costituiscono lo stesso problema e possono
essere studiati con lo stesso metodo, infatti è possibile
trasformare l'unità tempo e distanza in unità costo.
GRAFI E CAMMINI
Col termine grafo si definisce un insieme di punti o nodi
collegati tra loro da tratti o archi.
Ogni percorso che parte da un nodo (origine) per arrivare ad un
altro (destinazione) si chiama percorso o cammino.
Gli archi di un grafo possono essere orientati in un solo verso (in
un senso o nell'altro) o in entrambi i versi.
Spesso agli archi di un grafo sono associati dei valori detti
pesi. I pesi possono rappresentare distanze tra i nodi, costi
associati al trasferimento da un nodo all'altro, tempi o altro
ancora.
A volte anche ai nodi del grafo sono associati dei pesi.
Si veda di seguito un esempio di grafo con la matrice dei pesi ad
esso associato.
Un problema di percorso consiste nel trovare un cammino tra due o
più nodi che minimizzi (o massimizzi) una qualche misura di
prestazione, che è funzione (di solito la somma) dei valori
degli archi.
Ai cammini ritenuti accettabili si possono imporre un certo
numero di vincoli; ad esempio, quello di non ritornare ad un nodo
appena attraversato o quello di passare per ogni singolo nodo una
sola volta.
Si potranno verificare, inoltre, dei ritardi ai nodi (ad esempio,
agli incroci di strade di grande comunicazione o ai tavoli di
commutazione di una centrale telefonica).
Tali ritardi possono essere probabilistici dipendendo dal carico
di traffico al nodo o dalla disponibilità degli archi che escono
dal nodo (strade di grande comunicazione o linee telefoniche).
I collegamenti possono avere capacità limitata (non più di una
unità alla volta) o non essere sottoposti a vincoli di capacità.
In alcuni casi, poi, sia i nodi che i collegamenti possono
interrompersi o essere chiusi parzialmente o totalmente (ad
esempio, per riparazioni).
E' assai comodo (per esempio, al fine di fornire al calcolatore
le informazioni) rappresentare un grafo mediante una o più
matrici di dimensioni n x n ( se n sono i nodi del grafo): nella
posizione (i,j) delle matrici si pongono le informazioni relative
all'arco (i,j).
Avremo così la matrice di incidenza, in cui nella posizione (i,j)
è posto un 1 se esiste il corrispondente arco e uno 0 in caso
contrario, e la matrice dei pesi, contenente ovviamente nella
posizione (i,j) il peso associato all'arco corrispondente.
Si dice ciclo un cammino in cui i nodi d'inizio e di fine
coincidono.
Un grafo in cui non esistono cicli è detto aciclico (albero in
certi casi particolari).
Spesso per avere una matrice dei pesi assegnata in ogni
elemento,si assegnano dei pesi fittizi anche agli archi non
esistenti.
In questo caso ad un arco (i,j) non fisicamente esistente viene
assegnato un valore
wij= ¥ (in pratica wij
= M, con M molto grande).
Quanto agli autoanelli (collegamento tra un nodo e se stesso), il
peso loro assegnato dipende dalla possibilità o meno di "stare"
nel nodo, cioè di compiere una transizione dal nodo a se stesso.
Si voglia andare da s (origine) a t (destinazione). Vi sono molti
percorsi differenti tra s e t, ma si desidera scegliere quello
che comporta il minor tempo, costo o distanza.
Nel grafo vanno inseriti dei numeri che rappresentano una
qualsiasi di queste misure, la cui somma deve essere minimizzata.
Risulterà che nel ricercare il percorso più breve tra s e t è
utile trovare il percorso più breve da s ad ogni altro punto nel
grafo.
Procedimento grafico.
Si prenda come esempio il seguente grafo coi relativi costi:
1) Partendo dall'origine, tracciare tutti gli archi con i quali
si può andare da
"a " (origine) ad un altro nodo e inserire la distanza
diretta da "a" su ognuno di questi nodi.
2) Se c' è qualche arco tra i nodi ottenuti nella fase 1,
determinare per ogni arco se il percorso indiretto da "a"
è più corto di quello diretto.
Si traccia il percorso più breve con una linea continua e il
percorso più lungo con una linea tratteggiata. Si scrivono le
distanze più brevi a lato di ogni nodo.
3) Aggiungere tutti i nodi che si possono raggiungere dai nodi
considerati nella fase 2 e ripetere la fase 2 rispetto ad essi.
4) Continuare sino alla fine.Nel diagramma completo le linee
continue mostrano i percorsi che si possono fare da "a"
ad ogni altro punto.
Spesso si preferisce porre un ulteriore vincolo: tra i percorsi
di uguale lunghezza deve essere minimizzato il numero dei nodi.
ALGORITMI
Per la risoluzione di problemi di cammini ottimi esistono
algoritmi efficienti ed ormai molto diffusi, in grado di
affrontare problemi di dimensione anche elevata (1000 nodi ed
oltre).
Esistono numerosi metodi di risoluzione per il problema dei
percorsi minimi, la maggior parte dei quali è basata sulla
programmazione dinamica.
Si descrivono i tre principali algoritmi di risoluzione del
problema dei percorsi minimi:
a) ALGORITMO DI BELLMAN - KALABA
b) ALGORITMO DI DIJKSTRA
c) ALGORITMO DI FLOYD - WARSHALL
ALGORITMO DI BELLMAN - KALABA:
Si vuole determinare il cammino minimo tra un nodo origine s (fisso)
e gli altri nodi (in un numero qualsiasi di passi).
Si espande il grafo costruendo un grafo aciclico (albero) che ha
come nodo di partenza il nodo di origine e come nodi di arrivo
tutti gli altri.
Si espande il grafo aciclico per n passi.
In ciascun passo, a fianco di ogni nodo si pone un' etichetta.
Si definisce etichettatura del passo k l'insieme delle etichette
dei nodi di tale passo.
L'algoritmo convergerà sicuramente dopo n passi.
Si noti che, anche se il grafo ha cicli negativi, ha sempre senso
il problema se è fissato a priori il numero di passi (cammino di
K passi con distanza minima).
Esempio di etichettatura:
ALGORITMO DI DIJKSTRA:
L'algoritmo di Dijkstra richiede che sia soddisfatta la
condizione dij ³ 0 per
ogni arco (i,j) e permette di calcolare il cammino minimo dall'
origine s (fissa) ad ogni altro vertice del grafo G.
L' algoritmo di Dijkstra può essere descritto mediante i
seguenti passi:
1. si assegna ad ogni nodo i una etichetta l(i) che al termine
dell' algoritmo esprime la distanza minima dall' origine s al
nodo i. Si pone l(i) = +¥, " i ¹ s, l(s)=0.
Si definisce un insieme L di nodi la cui etichetta è resa
permanente, ovvero non più modificabile dall' algoritmo. Si pone
L=Æ.
2. Tra i nodi i non appartenenti a L, si sceglie un nodo p per
cui sia minimo il valore della etichetta, ovvero l(p)=min{l(i):i
non appartenenti a L}.
Si rende p permanente L=L È {p}.
3. Si aggiornano le etichette dei nodi i non permanenti
raggiungibili da p, ovvero {i.i non appartenente a L, (p,i)
appartenente a E }, sulla base della formula l(i) = min{l(i),l(p)+cpi
}
4. Se tutti i nodi hanno etichetta permanente, ovvero se L = V,
si arresta l' algoritmo. Le etichette rappresentano le lunghezze
dei cammini minimi da s ad ogni altro nodo. Altrimenti si procede
al passo 2.
L' operazione fondamentale dell' algoritmo di Dijkstra è
costituita dalla formula di aggiornamento delle etichette, nel
corso del passo 3:
l(i)=min{l(i),l(p)+cij}
Questa operazione, indicata talvolta con il termine di
triangolazione, ha un evidente significato intuitivo: l'
etichetta di un nodo l(i) viene aggiornata allorché risulta più
conveniente raggiungere i mediante un nuovo percorso, che
utilizza il cammino da s a p e successivamente l' arco da p a i.
E' possibile dimostrare che, quando un nodo p viene reso
permanente, la sua etichetta rappresenta in modo definitivo la
lunghezza del cammino minimo da s a p.
Tuttavia, la correttezza dell' operazione di triangolazione, e
quindi della formula di aggiornamento delle etichette, viene
pregiudicata dalla presenza di archi con distanza negativa.
Si vedano qui di seguito i passi successivi dell' applicazione
dell' algoritmo di Dijkstra:
ALGORITMO DI FLOYD - WARSHALL :
Nel caso in cui esistano archi di peso negativo, l'algoritmo di
Dijkstra può fornire una soluzione non ottimale.
In tali casi si può tuttavia ricorrere all'algoritmo di Floyd -
Warshall, che determina i cammini minimi tra tutte le coppie di
nodi del grafo G.
L'algoritmo è corretto sotto l'ipotesi che il grafo G non
contenga circuiti a costo totale negativo.
L'algoritmo di Floyd - Warshall si basa sull'applicazione
ripetuta dell'operazione di triangolazione.
Viene utilizzata una matrice D di dimensioni n x n, il cui
generico elemento dij è destinato a rappresentare, al termine
dell'algoritmo ,il costo del cammino minimo da i a j .
1. Si pone dij = cij se l'arco (i ,j) non
appartiene ad E, altrimenti dij =+ ¥.
2. Per k =1,2,
n, esegui il passo 3.
3. Per i=1,2
..n, i ¹ k, per j=1,2,
..n,
j¹k, si applica la formula di
aggiornamento
dij = min{ dij , dik + dkj }. Se
al termine degli aggiornamenti si ha dij < 0 per
qualche nodo i, l'algoritmo si arresta poiché esistono circuiti
a costo totale negativo.
DIFFERENZE TRA I TRE ALGORITMI
I problemi su grafo hanno un numero finito di soluzioni e quindi
si potrebbe esaminarle tutte e poi scegliere la migliore.Ma ciò
è praticamente impossibile nella realtà:un problema di percorso
ottimo su un grafo con n nodi può essere risolto in n! modi
diversi, il che per n=50 vuol dire circa 1045 secoli
di impiego per un calcolatore capace di esaminare un miliardo di
soluzioni al secondo.
E' quindi fondamentale valutare gli algoritmi esaminandone l'
efficienza dal punto di vista del tempo di calcolo.
Un algoritmo è preferibile ad un altro se entrambi risolvono la
stessa classe di problemi, ma il primo algoritmo ci riesce in un
numero di passi inferiore(cioè in tempo più breve).
Il parametro più importante per valutare le prestazioni di un
algoritmo è quindi il tempo di esecuzione, misurato contando il
numero di operazioni elementari che esso deve compiere nel caso
peggiore, cioè in presenza di dati che lo obbligano a compiere
tutti i passi che sono stati previsti.
Per questo si parla di complessità computazionale, cioè del
numero di operazioni elementari che un algoritmo deve compiere,
dato in funzione delle dimensioni del problema. La complessità
si esprime in ordine di grandezza o(.) : cosi' una complessità o(n2)
indica che l' algoritmo arriva alla soluzione finale con un
numero di operazioni proporzionale al quadrato della dimensione n.
Un algoritmo si dice efficiente se la sua complessità è
polinomiale, cioè se la funzione o(.) è un polinomio nelle
dimensioni del problema.
E' dimostrabile che la complessità computazionale dell'
algoritmo di Bellman - Kalaba è una complessità polinomiale = o(n3)
, quella dell' algoritmo di Dijkstra è una complessità
polinomiale = o(n2) e infine quella dell' algoritmo di
Floyd-Warshall e' o(n3).
Nell' algoritmo di Bellman - Kalaba trovare il cammino minimo tra
un nodo ed un altro è equivalente a trovare il minimo cammino
fra il nodo in questione e tutti gli altri, poiché si procede
parallelamente per tutti i nodi.
Ciò non avviene per l' algoritmo di Dijkstra.
E' stato dimostrato che l' algoritmo di Dijkstra è ottimo (cioè
ottiene la soluzione ottima per il problema dei cammini minimi).
Nonostante ciò, nell' esempio che seguirà si userà l'
algoritmo di Floyd-Warshall in quanto questo permette di
calcolare il percorso minimo da un nodo qualsiasi ad un altro
nodo, mentre gli altri due algoritmi permettono di determinare il
percorso minimo solo tra un nodo fisso (origine s) e gli altri
nodi.
L' uso dell'algoritmo di Floyd-Warshall richiederà molta più
memoria per il calcolatore perché dovrà mostrare l' intera
matrice dei risultati, cioè i percorsi minimi tra tutti i nodi.
Grazie al recente sviluppo dei supporti informatici, lo studio
del percorso minimo ha acquisito un' importanza rilevante.
Il problema dei percorsi minimi si presenta nel settore dei
trasporti , in quello delle comunicazioni e in molti altri campi,
ad esempio nella logistica industriale per la determinazione
dell' ordine in cui produrre un insieme di articoli su un
impianto di lavorazione comune.
Qui di seguito si analizzano il settore urbanistico e quello dei
trasporti.
Settore urbanistico
Un problema molto diffuso è per esempio la collocazione di un
dato servizio pubblico (ufficio postale, ospedale, biblioteca
.)
all'interno di un settore urbano.
Come è facile intuire, il problema è quello di individuare una
o più aree all'interno delle quali collocare tale servizio.
Ovviamente l'ubicazione deve soddisfare uno o più requisiti. Il
più importante è il tempo minimo che l'utente generico deve
impiegare per raggiungere tale servizio.
Il problema di tempo minimo risulta essere quindi strettamente
correlato con il percorso minimo.
Settore trasporti
Altro problema molto diffuso è quello di identificare il
percorso dei trasporti pubblici come per esempio pullman, tram,
metropolitana ecc
In questo caso nasce l'esigenza di creare una rete che minimizzi
la distanza ottimizzando l'area di copertura del servizio.
La necessità è quindi quella di collegare nella maniera più
opportuna i vari punti (fermate, stazioni ecc
) dell'area di
utenza.
Gli algoritmi di percorso minimo possono essere utilizzati:
· per determinare il costo minimo (come già detto il costo può
essere indifferentemente : "tempo", "distanza"
o "costo materiale") tra un nodo ed un altro ed il
relativo percorso;
· per determinare l' intera matrice dei costi minimi tra ogni
nodo e tutti gli altri,in modo da avere una visione spaziale, che
mostri la relazione di ogni "zona" con le altre.
Nel primo caso l' utente può essere un " navigatore" o
un "viaggiatore" in generale.
Nel secondo caso tali algoritmi vengono utilizzati per avere una
visione d' insieme, ad esempio per costruire una rete elettrica o
una rete di trasporti.
Applicazione dell' algoritmo di Dijkstra di Carla Laffra della
Pace University:
http://www.dgp.toronto.edu/people/JamesStewart/270/9798s/Laffra/DijkstraApplet.html
Spiegazione e codici in linguaggio c degli algoritmi di Dijkstra
e Floyd da parte di Eugenio Moggi (ultima revisione 24 Maggio
1997) :
http://www.disi.unige.it/person/MoggiE/ASD/nota7
Un codice in c++ per l'algoritmo di Floyd costruito da Chi F.
Chen il 28/01/01(basato sull'algoritmo tratto dal testo di Thomas
H. Cormen, Charles E.Leiserson e Ronald L.Rivest, "Introduction
to Alghorithms",MIT & Mcgraw-Hill):
http://www.u.arizona.edu/~chifu/floyd-warshall.html
Applicazione dell'algoritmo di Floyd eseguita da uno studente
informatico ( possibilità di vedere come la matrice "cambi"
mentre procede l'algoritmo):
http://www.bice.it/Informatica/Algoritmi/Floyd/Floyd.html
Calcolo di distanze minime tra città:
http://www.kwmappe.kataweb.it/itinerari.htm
http://www.viamichelin.com/viamichelin/ita/dyn/controller/mapHomePage
http://mappe.virgilio.it/mappe/index.html
Per un approfondimento teorico sugli argomenti qui trattati si
possono vedere:
Carlo Vercellis , "MODELLI E DECISIONI:STRUMENTI E METODI
PER LE DECISIONI AZIENDALI", Progetto Leonardo , Bologna (1997).
Niklaus Wirth, " ALGORITMI + STRUTTURE DATI =PROGRAMMI",
Tecniche Nuove, Milano (1987) - (Trad. di Stefano Piccardi).
Christos H. Papadimitriou , Kenneth Steiglitz, "COMBINATORIAL
OPTIMIZATION: Alghorithms and complexity" , Englewood Cliffs
, Prentice Hall (1982).
Alberto Colorni , " RICERCA OPERATIVA" , Clup, Milano (1988).
Russel L. Ackoff, Maurice W.Sasieni , "LA RICERCA OPERATIVA
: PRINCIPI, METODI, TECNICHE" , ETAS LIBRI, Milano (1977) -
(Trad. di Luisa Regalia - Titolo originale: "Fundamentals of
operations research" )