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