v - CVC

Anuncio
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
Descargar