MTP2 – Problemas Greedy
Greedy – Alg. Voraces – Alg. Goluds
Caminos mínimos
• Alg. Dijkstra
Grafos de flujo
• Alg. Ford-Fulkerson
MTP II – Greedy
1
Caminos mínimos Æ Dijkstra
Dado un grafo G=(V,E) etiquetado con pesos no
negativos y un vértice distinguido v, calcular el coste
del camino mínimo desde v al resto de vértices.
Utilidad:
El grafo representa una distribución geográfica, donde las
aristas dan el coste (precio, distancia...) de la conexión
entre dos lugares y se desea averiguar el camino más corto
(barato...) para llegar a un punto partiendo de otro
E.W. Dijkstra:
“A note on two problems in connexion with graphs”,
Numerical Mathematica, 1, pp. 269-271, 1959.
MTP II – Greedy
2
Caminos mínimos Æ Dijkstra
Solución voraz: Algoritmo de Dijkstra
para grafos dirigidos (la extensión a no dirigidos es inmediata)
genera uno a uno los caminos de un nodo v al resto por orden creciente de
longitud
usa un conjunto de vértices donde, a cada paso, se guardan los nodos
para los que ya se sabe el camino mínimo
devuelve un vector indexado por vértices: en cada posición w se guarda el
coste del camino mínimo que conecta v con w
cada vez que se incorpora un nodo a la solución se comprueba si los
caminos todavía no definitivos se pueden acortar pasando por él
se supone que el camino mínimo de un nodo a sí mismo tiene coste nulo
un valor ∞ en la posición w del vector indica que no hay ningún camino
desde v a w
Ejemplos Applets Dijkstra:
• http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/dijkstra/Dijkstra.shtml
MTP II – Greedy
3
Caminos mínimos Æ Dijkstra
funcion
funcionDIJKSTRA
DIJKSTRA(Grafo
(GrafoG,
G,nodo_fuente
nodo_fuentes):
s):devuelve
devuelvevector
vectordistancia,
distancia,vector
vectorpadre
padre
////inicializamos
inicializamostodos
todoslos
losnodos
nodosdel
delgrafo.
grafo.La
Ladistancia
distanciade
decada
cadanodo
nodoes
esinfinita
infinitayylos
lospadres
padresson
sonNULL
NULL
for
foruuperteneciente
pertenecienteaaV[G]
V[G]hacer
hacer
distancia[u]
distancia[u]==INFINITO
INFINITO
padre[u]
padre[u]==NULL
NULL
ffor
ffor
distancia[s]
distancia[s]==00
//encolamos
//encolamostodos
todoslos
losnodos
nodosdel
delgrafo
grafo
Encolar
Encolar(cola,
(cola,V[G]);
V[G]);
mientras
mientrascola
cola!=!=00hacer
hacer
////Se
Seextrae
extraeelelnodo
nodoque
quetiene
tienedistancia
distanciamínima
mínimayyse
seconserva
conservalalacondición
condiciónde
deCola
Colade
deprioridad
prioridad
uu==extraer_minimo(cola)
extraer_minimo(cola)
for
forvvperteneciente
pertenecienteaaadyacencia[u]
adyacencia[u]hacer
hacer
sisidistancia[v]
distancia[v]>>distancia[u]
distancia[u]++peso(u,v)
peso(u,v)entonces
entonces
distancia[v]
distancia[v]==distancia[u]
distancia[u]++peso(u,v)
peso(u,v)
padre[v]
padre[v]==uu
fsi
fsi
ffor
ffor
fmientras
fmientras
MTP II – Greedy
4
Grafos de flujo Æ Ford-Fulkerson
En un grafo con:
V = conjunto de vértices, A = conjunto de aristas
P(i) = capacidad de flujo de la arista i (peso de la arista i)
El problema consiste en determinar la máxima capacidad de
flujo que se puede llevar desde el nodo origen hasta el nodo
destino de una red.
Ejemplos:
• Maximizar la cantidad de material que puede ser transportado del origen al
destino sin violar ninguna restricción de capacidad.
• El problema se planteó en relación a la red de ferrocarriles de la Unión
Soviética, durante los años 50. Los EEUU querían saber con que velocidad la
URSS podía mover recursos a través de la red de ferrocarriles a sus estados
satélite en Europa del este.
• Maximizar el conjunto de datos enviados a través de los servidores desde
un punto a otro, teniendo en cuenta el ancho de banda de cada conexión.
Ejemplos Applets Ford-Fulkerson :
• http://www-b2.is.tokushima-u.ac.jp/~ikeda/suuri/maxflow/Maxflow.shtml
MTP II – Greedy
5
Grafos de flujo Æ Ford-Fulkerson
Algorisme FORD_FULKERSON (Grafo G, nodo origen, nodo destino):
// inicializamos todos los arcos del grafo.
for cada arco i perteneciente a G hacer
flujo[i] = 0;
ffor
// Elección del primer camino a seguir
G1 = G(donde todos las capacidades=1)
// Todas las aristas tienen peso = 1
camino_minimo = DIJKSTRA(G1) // desde origen Æ destino
mientras (camino_minimo != NULL) hacer
capacidad_minima = capacidad mínima de los arcos que forman el camino_minimo
// Restar capacidad_minima a todas las aristas del camino_minimo
for cada arco i perteneciente al camino_minimo hacer
flujo(i) = flujo(i) + capacidad_minima;
capacidad(i) = capacidad(i) – capacidad_minima; // Capacidad residual
ffor
G = G – {aristas que ya no tienen capacidad}
camino_minimo = DIJKSTRA(G) // desde n_origen Æ n_destino
fmientras
MTP II – Greedy
6