Sunteți pe pagina 1din 44

 Investigación de operaciones 2 Ing.

Ditmar David Castro Angulo

Tema 1
TEORIA DE GRAFOS
1.1 DEFINICIÓN DE GRAFOS

1.2 CONCEPTOS

1.2.1 Adyacencia, Incidencia, Grados de los vértices

1.2.2 Cadena, cadena cerrada, Camino, Ciclo

1.2.3 Sucesiones gráficas

1.2.4 Conectividad

1.3 Matriz de Adyacencia y Matriz de Incidencia

1.4 Tipos de grafos

1.5 Aplicaciones

DESARROLLO
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

1.1 definición de grafos


Un grafo 𝐺 es un par 𝐺 = (𝑉, 𝐸) dónde:

𝑉 = 𝑒𝑠 𝑢𝑛 𝑐𝑜𝑛𝑗𝑢𝑛𝑡𝑜 𝑛𝑜 𝑣𝑎𝑐í𝑜 𝑦 𝑓𝑖𝑛𝑖𝑡𝑜 𝑑𝑒 (𝑣𝑒𝑟𝑡𝑖𝑐𝑒𝑠 𝑦 𝑛𝑜𝑑𝑜𝑠)

𝐸 = 𝑒𝑠 𝑢𝑛 𝑐𝑜𝑛𝑗𝑢𝑛𝑡𝑜 𝑑𝑒 𝑝𝑎𝑟𝑒𝑠 𝑛𝑜 𝑜𝑟𝑑𝑒𝑛𝑎𝑑𝑜𝑠 𝑑𝑒 𝑣é𝑟𝑡𝑖𝑐𝑒𝑠, 𝑑𝑒𝑛𝑜𝑡𝑎𝑑𝑜𝑠 𝑝𝑜𝑟 (𝑥, 𝑦)

Ejemplo:

Si 𝐺 = (𝑉, 𝐸) dónde:

𝑉 = {𝑣1 , 𝑣2 , 𝑣3 , 𝑣4 , 𝑣5 , 𝑣6 }

𝐸 = {(𝑣1 , 𝑣2 ), (𝑣2 , 𝑣3 ), (𝑣2 , 𝑣4 ), (𝑣5 , 𝑣6 ), (𝑣6 , 𝑣1 ), (𝑣6 , 𝑣2 ), (𝑣5 , 𝑣4 ), (𝑣3 , 𝑣4 )}

Su representación gráfica sería:

A continuación damos algunas definiciones para hacer una comparación. Sobre las siguientes:

Definición 1

Un grafo simple 𝐺 = (𝑉, 𝐸) consta de 𝑉, un conjunto no vacío de vértices y de E, un conjunto de


pares ordenados de elementos distintos de V. A esos pares se les llama Aristas o lados.

En muchos casos los grafos simples no bastan para modelar algunos tipos de situaciones en las
cuales se requiere de la existencia de múltiples aristas entre par de vértices. En este caso no es
suficiente definir las aristas como par de vértices. A continuación veremos otras definiciones.

Definición 2

Un multigrafo 𝐺 = (𝑉, 𝐸) costa de un conjunto de V vértices, un conjunto de E de aristas y una


función f de E en {(𝑢, 𝑣)|𝑢, 𝑣 ∈ 𝑉, 𝑢 ≠ 𝑣}. Se dice que las aristas 𝑒1, 𝑒2 son aristas múltiples o
paralelas si 𝑓(𝑒1) = 𝑓(𝑒2)

Definición 3
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Un pseudografo 𝐺 = (𝑉, 𝐸) costa de un conjunto V de vértices, un conjunto E de aristas y una


función 𝑓 𝑑𝑒 𝐸 𝑒𝑛 {(𝑢, 𝑣)|𝑢, 𝑣 ∈ 𝑉}. Se dice que una arista e es un bucle o lazo si 𝑓(𝑒) = {𝑢, 𝑢} =
{𝑢} 𝑝𝑎𝑟𝑎 𝑎𝑙𝑔ú𝑛 𝑢 ∈ 𝑉.

Definición 4

Un dígrafo conocido también como grafo dirigido 𝐺 = (𝑉, 𝐸) consta de un conjunto de V de


vértices, un conjunto E de aristas, que son pares ordenados de elementos de V.

1.2.1 Adyacencia, Incidencia, Grados de los vértices

Adyacencia
Dos vértices u, v de un grafo 𝐺 = (𝑉, 𝐸) se dicen adyacentes si (𝑢, 𝑣 ) ∈ 𝐸
Ejemplo

V1
(v1,v2)

(v1,v3)
V2

V3 (V3,v2)

𝑉1 𝑦 𝑉2 𝑠𝑜𝑛 𝐴𝑑𝑦𝑎𝑐𝑒𝑛𝑡𝑒𝑠 𝑝𝑜𝑟𝑞𝑢𝑒 (𝑉1, 𝑉2 ) ∈ 𝐸

Asimismo dos aristas son adyacentes si tienen un mismo vértice como extremo; análogamente
entre sí.

Incidencia
𝑒 = {𝑢, 𝑣 }𝑑𝑒𝑐𝑖𝑚𝑜𝑠 𝑞𝑢𝑒 𝑒𝑙 𝑙𝑎𝑑𝑜 𝑒 𝑒𝑠 𝑖𝑛𝑐𝑖𝑑𝑒𝑛𝑡𝑒 𝑎 𝑙𝑜𝑠 𝑣é𝑟𝑡𝑖𝑐𝑒𝑠 𝑢 𝑦 𝑣

El grado de un vértice es el número de lados incidentes a él.


El grado de un vértice u se denota 𝑔𝑟(𝑢). Denotamos con 𝛿(𝐺)𝑦 ∆(𝐺) el mínimo y el máximo
grado de los vértices de 𝐺 respectivamente.
Ejercicio
Si 𝐺 es un grafo simple, muestre que ∆≤ 𝑣 − 1 donde v es el número de vértices de G.
Solución
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

En un dígrafo distinguimos entre grado entrante y grado saliente de 𝑢, el primero indica el


número de lados que tienen al vértice 𝑢 como terminal y el segundo indica el número de lados que
tiene el vértice 𝑢 inicial, y se denotan 𝑔𝑟 − (𝑢) 𝑦 𝑔𝑟 + (𝑢) respectivamente.
Teorema 1 La suma de los grafos en un vértice es el doble del número de lados. Es decir, si 𝐺 =
(𝑉, 𝐸) entonces

∑ 𝑔𝑟(𝑢) = 2|𝐸|
𝑢∈𝑉

Teorema 2 Si 𝐺 = (𝑉, 𝐸) es un dígrafo, entonces.

∑ 𝑔𝑟 −(𝑢) = ∑ 𝑔𝑟 +(𝑢) = |𝐸|


𝑢∈𝑉 𝑢∈𝑉

Teorema 3 El número de vértices de grado impar es par.

1.2.3 Sucesiones gráficas


Una sucesión finita de enteros no negativos se dice sucesión gráfica si existe un grafo no dirigido
simple que tiene por sucesión de grados la sucesión dada.
Ejemplo
¿Es gráfica la sucesión (4,3,3,2,2)?
Solución
La sucesión de enteros no negativos (4,3,3,2,2) es una sucesión gráfica, porque es la sucesión de
grados del grafo no dirigido simple siguiente

Ejemplo 2
Teniendo en cuenta las propiedades vistas, ¿es gráfica la sucesión (3,3,3,2,2)?
La sucesión de enteros no negativos (3,3,3,2,2) no es una sucesión gráfica
Porque no existe ningún grafo simple con un número impar de vértices de grado impar.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Ejemplo 3
¿Es gráfica la sucesión (6,3,3,2,2)?
La sucesión de enteros no negativos (6,3,3,2,2) no es una sucesión gráfica.
Porque si existiera un grafo no dirigido simple con esa sucesión de grados, tendría 5 vértices, uno
de los cuales tendría que estar conectado a 6 más, lo que significa que si el grafo ha de ser simple,
debería haber por lo menos 7 vértices.
Teorema de Hakimi
Sea la sucesión decreciente de enteros no negativos
𝑠, 𝑡1 , 𝑡2 , … 𝑡𝑠 , 𝑑1 , 𝑑2 , … , 𝑑𝑟
Se dice
(𝑠, 𝑡1 , 𝑡2 , … 𝑡𝑠 , 𝑑1 , 𝑑2 , … , 𝑑𝑟 ) es una sucesión gráfica si y solo si
(𝑡1 − 1, 𝑡2 − 1, … 𝑡𝑠 − 1, 𝑑1 , 𝑑2 , … , 𝑑𝑟 ) Es una sucesión gráfica

1.2.2 Cadena, Cadena Cerrada, Camino, Ciclo


Cadena: a toda sucesión finita alterna de vértices y aristas (resp. arcos).
Cadena cerrada: a toda cadena en la que los vértices inicial y final coinciden.
Camino: a toda cadena en la que no se repiten ni vértices ni aristas (resp. arcos).
Ciclo: a toda cadena en la que nos e repiten ni vértices ni aristas a excepción del inicial y final.
Longitud de la cadena: número de aristas (resp. Arcos) que la forman.
Ejemplo.

Cadena: 𝑣1 , 𝑣2 , 𝑣4 , 𝑣2 , 𝑣4
Cadena cerrada: 𝑣1 , 𝑣2 , 𝑣4 , 𝑣2 , 𝑣4 , 𝑣5 , 𝑣1
Camino: 𝑣1 , 𝑣2 , 𝑣4 , 𝑣3
Ciclo: 𝑣2 , 𝑣4 , 𝑣5 , 𝑣2
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

1.2.4 Conectividad
Conexión en grafos no dirigidos
Sea 𝐺 = (𝑉, 𝐸) grafo no dirigido
Se dice que el vértice 𝑢 está conectado a 𝑣 si 𝑢 𝑎𝑙𝑐𝑎𝑛𝑧𝑎 𝑎 𝑣.
Se llama componente conexa de G a todo subgrafo inducidos por los vértices de una clase de
equivalencia.
Se dice que es un grafo es conexo si tiene una única componente conexa.
Ejemplo:

Teorema 1
Sea 𝐺 = (𝑉, 𝐸) un grafo no dirigido, con |𝑉|>1
Si 𝐶𝑖 = (𝑉𝑖 , 𝐸𝑖 ), 𝑖 = 1,2, … 𝑟, 𝑟 > 0, son las componentes conexas de G, se verifica.

𝑉 = ⋃𝑛𝑖=1 𝑉𝑖 |𝑉| = ∑𝑛𝑖=1 |𝑉𝑖 |

𝐸 = ⋃𝑛𝑖=1 𝐸𝑖 |𝐸| = ∑𝑛𝑖=1 |𝐸𝑖 |

Teorema 2
Sea 𝐺 = (𝑉, 𝐸) un grafo no dirigido, conexo, |V|=n >1
A) G posee un ciclo o un vértice de grado 1
B) Si la arista 𝑒 = (𝑢, 𝑣) pertenece a un ciclo, entonces G-𝑒 es también conexo.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

c) |𝐸| ≥ |𝑉| − 1

Conexión en grafos dirigidos


Sea 𝐺 = (𝑉, 𝐸) grafo dirigido
Se dice que el vértice u está fuertemente conectado al v si u alcanza a v y v alcanza a u.
Se llama componente fuertemente conexa a G a todo subgrafo inducido por los vértices de una
clase de equivalencia. “subgrafo máximal”
Se dice que un grafo es fuertemente conexo si tiene una única componente conexa.
Ejemplo

Teorema 1
Sea 𝐺 = (𝑉, 𝐸) un grafo no dirigido, con |𝑉|>1
Si 𝐶𝑖 = (𝑉𝑖 , 𝐸𝑖 ), 𝑖 = 1,2, … 𝑟, 𝑟 > 0, son las componentes conexas de G, se verifica.

𝑉 = ⋃𝑛𝑖=1 𝑉𝑖 |𝑉| = ∑𝑛𝑖=1 |𝑉𝑖 |


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

No se verifica para los arcos

𝐸 = ⋃𝑛𝑖=1 𝐸𝑖 |𝐸| = ∑𝑛𝑖=1 |𝐸𝑖 |

Teorema 2
Sea 𝐺 = (𝑉, 𝐸) un grafo dirigido, fuertemente conexo, |𝑉 | = 𝑛 > 1
|𝐸| ≥ |𝑉|
Grafo débilmente conexo
Sea 𝐺 = (𝑉, 𝐸) grafo dirigido
Se dice que el vértice u está débilmente conectado al 𝑣 si 𝑢 y 𝑣 están conectados en el grafo
subyacente 𝐺′.
Se llama componente débilmente conexa de G a todo subgrafo inducido por los vértices de una
clase de equivalencia, o de forma equivalente, a todo subgrafo tal que su subyacente sea una
componente conexa en 𝐺′.
Se dice que un grafo es débilmente conexo si su grafo subyacente es conexo.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

1.3 Matriz de Adyacencia y Matriz de Incidencia


Sea 𝐺 = (𝑉, 𝐸) un grafo con |𝑉| vértices y |𝐸| aristas, entonces le corresponde una matriz
|𝑉|𝑋|𝐸 |denominada matriz de incidencia de G. Si denotamos los vértices d G por 𝑣1 , 𝑣2 , … , 𝑣𝑣 y las
aristas 𝑒1 , 𝑒2 , … , 𝑒𝜀 . Entonces la matriz de incidencia de G es la matriz M(G)=[𝑚𝑖𝑗 ] donde 𝑚𝑖𝑗 es el
número de veces que la arista 𝑒𝑗 incide en el vértice 𝑣𝑖 los valores son 0,1 o 2 en el caso que la
arista sea un lazo.
Otra matriz asociada a G es la matriz de adyacencia, esta es una matriz 𝑣𝑥𝑣 𝐴(𝐺) = [𝑎𝑖𝑗 ], en
donde 𝑎𝑖𝑗 es el número de aristas que van de 𝑣𝑖 hasta 𝑣𝑗 .
A continuación damos un ejemplo de un grafo con su correspondiente matriz de incidencia y
matriz de adyacencia.

1.4 Tipos de Grafos


Hay varios tipos de grafos, en esta sección estudiaremos los grafos libres, completo, regular, grafos
isomorfos, grafos ponderados, subgrafos, y bipartito.
También veremos los ciclos hamiltonianos, y ciclos eulerianos
Grafos Libres
Sea un grafo 𝐺 = (𝑉, 𝐸) si dice libre si 𝐸 = ∅, es decir, si no tiene aristas.
Grafos Completos
Un grafo simple 𝐺 = (𝑉, 𝐸) se dice completo si cada vértice está conectado a cualquier otro
vértice en G. El grafo completo con 𝑛 vértices se denota 𝐾𝑛 .
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Grafo completo de 6 vértices.


𝑛(𝑛−1)
Un grafo completo de n vértices tiene aristas, y sus grafos son 𝑔𝑟 = 𝑛 − 1 de cualquier
2

vértice.
Ejercicio: Un grafo completo con n vértices tiene 𝐶𝑛2 Aristas.
Grafos regulares
Sea un grafo 𝐺 = (𝑉, 𝐸) es regular de grado k o k-regular si cada vértice tiene grado k; es decir, un
grafo es regular si todos los vértices tiene el mismo grado.

Grafos regulares que tienen el mismo grado 𝑔𝑟


Grafos Isomorfos
Definición
Los grafos 𝐺1 = (𝑉1 , 𝐸1 ) 𝑦 𝐺2 = (𝑉2 , 𝐸2 ) son isomorfos si existe una función biyectiva
𝑓 𝑑𝑒 𝑉1 𝑒𝑛 𝑉2 con la propiedad de que, para cada par de vértices 𝑢, 𝑣 𝑠𝑜𝑛 𝑎𝑑𝑦𝑎𝑐𝑒𝑛𝑡𝑒𝑠 𝑒𝑛 𝐺1 y
solo si 𝑓(𝑢), 𝑓(𝑣)son adyacentes en 𝐺2 . Es decir {𝑢, 𝑣} ∈ 𝐸1 ↔ {𝑓(𝑢), 𝑓(𝑣)} ∈ 𝐸2 . Si 𝐺1 𝑦 𝐺2 son
isomorfos lo denotamos como 𝐺1 ≅ 𝐺2 .
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Cabe resaltar algunos criterios para probar si un grafo es isomorfo, como ser el mismo número de
vértices, el mismo número de aristas, el mismo número de la misma cantidad de grados, el mismo
número de ciclos de cualquier longitud, etc.

Probar si son isomorfos

Probar si son isomorfos


Grafos etiquetados y ponderados
Un grafo G etiquetado es si sus aristas tienen asignada alguna identificación. En particular, G es un
grafo ponderado si cada arista e de G se le asigna un número no negativo 𝑤(𝑒) denominado peso
o longitud de 𝑒 . El peso o longitud de un camino en un grafo ponderado G se define como la suma
de los pesos de todas las aristas del camino. Uno de los problemas más comunes dentro de la
teoría de grafos es encontrar la ruta más corta o el camino más liviano entre los vértices dados.
Encontrar el camino más corto de P y Q.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Subgrafos
Sea 𝐺 = (𝑉, 𝐸) un grafo, Si 𝐻 = (𝑊, 𝐹) es un grafo tal que 𝑊 ⊆ 𝑉 𝑦 𝐹 ⊆ 𝐸 decimos que H es un
subgrafo de G.
Si F contiene todos los lados de E que unen los puntos de W en G se dice que H es un subgrafo
completo de G generado por W. Si W=V decimos que H es un subgrafo extendido de G.

Grafos Bipartitos
Se dice que un grafo simple 𝐺 = (𝑉, 𝐸) es bipartito si el conjunto de vértices V se puede dividir en
dos conjuntos disjuntos 𝑉1 , 𝑉2 , (𝑉1 ∪ 𝑉2 = 𝑉, 𝑉1 ∩ 𝑉2 = ∅) de tal manera que toda arista 𝑒 ∈ 𝐸
conecta un vértice 𝑉1 con un vértice de 𝑉2 .
Ejemplo
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Grafos Eulerianos y Grafos Hamiltonianos


Grafos Eulerianos
El origen de la teoría de los ciclos eulerianos fue planteado y resuelto por el propio Leonhard Euler
en 1736 en un problema que tiene el nombre de Siete puentes de la ciudad de Königsberg (Prusia
oriental en el siglo XVIII y actualmente, Kaliningrado, provincia rusa) dando origen a la Teoría de
los grafos.

El problema se enuncia de la siguiente forma: Dos islas en el río Pregel, en Königsberg se unen
entre ellas y con la tierra firme mediante siete puentes. ¿Es posible dar un paseo empezando por
una cualquiera de las cuatro partes de tierra firme, cruzando cada puente una sola vez y volviendo
al punto de partida?

El problema planteado se puede representar como el siguiente grafo.


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Por consiguiente la pregunta se traslada a “es posible pasar por todas las aristas sin repetir
ninguna”.
Euler demostró que no era posible ya que el número de aristas que inciden en cada vértice no es
par. “condición necesaria para entrar y salir de cada vértice y para regresar al punto de partida,
por caminos distintos”.

Si tenemos 𝐺 = (𝑉, 𝐸), si 𝐺 tiene exactamente dos vértices de grado impar, entonces 𝐺 tiene
camino euleriano.

En caso de que todos los vértices sean o tengan grado par, 𝐺 tiene un ciclo euleriano.

Propiedades
 Un grafo conexo y no dirigido se dice que es euleriano si cada vértice tiene un grado par.
 Un grafo no dirigido es euleriano si es conexo y si se puede descomponer en uno con los
vértices disjuntos.
 Si un grafo no dirigido 𝐺 es euleriano entonces su gráfo-línea L(G) se dice que es también
euleriano.
 Un grafo dirigido es euleriano si es conexo y cada vértice tiene grados internos iguales a
los externos.
 Un grafo no dirigido se dice que es susceptible de ser recorrido (en inglés: traversable) si
es conexo y al menos dos vértices en el grafo tienen grado impar.
Grafo Hamiltonianos
Comencemos preguntándonos:
¿Cuándo un grafo tienen un ciclo cerrado qué contenga a todos sus vértices?
Cuando existe tal ciclo lo llamaremos ciclo hamiltoniano.
Definición
Tetraedro
Un camino hamiltoniano es un camino que pasa por cada vértice exactamente una vez. Un grafo
que contiene un camino hamiltoniano se denomina un ciclo hamiltoniano si es un ciclo que pasa
por cada vértice exactamente una vez (excepto el vértice del que parte y al cual llega). Un grafo
que contiene un ciclo hamiltoniano se dice grafo hamiltoniano.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Estos conceptos se pueden extender para los grafos dirigidos.

1.5 Aplicaciones
Un gran número de aplicaciones nace gracias a la teoría de grafos y continuamente se hallan
formas para resolver muchos problemas de la vida real aplicando grafos.
Por ejemplo existen aplicaciones de la síntesis de circuitos secuenciales, contadores o sistemas de
apertura.
Se puede usar para modelar trayectos como el de una línea de buses a través de las calles de una
ciudad, en la que podemos aplicar búsqueda de caminos para los trayectos.
Para la administración de proyectos como CMP y PERT, en las que se modelan los mismos usando
grafos.
La teoría de grafos también ha servido de inspiración para las ciencias sociales, en especial para
desarrollar un concepto no metafórico de red social que sustituye los nodos por los actores
sociales y verifica la posición, centralidad e importancia de cada actor dentro de la red. Esta
medida permite cuantificar y abstraer relaciones complejas, de manera que la estructura social
puede representarse gráficamente. Por ejemplo, una red social puede representar la estructura de
poder dentro de una sociedad al identificar los vínculos (aristas), su dirección e intensidad y da
idea de la manera en que el poder se transmite y a quiénes.

Los grafos son importantes en el estudio de la biología y hábitat. El vértice representa un hábitat y
las aristas (o "edges" en inglés) representa los senderos de los animales o las migraciones. Con
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

esta información, los científicos pueden entender cómo esto puede cambiar o afectar a las
especies en su hábitat.

También se ha usado los grafos para crear lenguajes cibernéticos aplicado a modelos continuos
como ser los diagramas de influencias propuestos por J w Forrester.

La aplicación se puede ver en cada día en el mundo real, ya que todo está conectado de alguna
manera y es parte de un sistema.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Tema Nº2

MODELO DE REDES

2.1 Introducción

2.3 Algoritmo de árbol de expansión mínima

2.4 Algoritmo

2.5 Problema de la ruta más Corta

2.5.1 Dikjstra

2.5.1.1 Algoritmo

2.5.2 Floyd

2.5.2.1Algoritmo

2.6 Flujo Máximo

2.6.1 Algoritmo
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Desarrollo:

Introducción
Existen multitud de situaciones modelables con grafos, o como redes. Algunas encuestas recientes
informan que hasta el 70% de los problemas de programación matemática en el mundo real se
pueden representar como modelos relacionados con redes.

1. Diseño de una red de gasoductos marinos para conectar bocas de pozos. “Como objetivo
por ejemplo, minimizar el costo de construcción”
2. Determinar la ruta más corta entre dos ciudades, en una red de carreteras.
3. Determinación de la capacidad máxima (en toneladas anuales) de una red de tubería para
lodo de carbón que une las minas en Wyoming con las centrales eléctricas en Houston.

La solución de estas situaciones y otras parecidas se logra con una variedad de algoritmos de
optimización de redes. Para lo cual veremos los siguientes algoritmos

 Árbol de expansión mínima


 Algoritmo de la ruta más corta
 Algoritmo de flujo máximo

Como ya vimos en el tema anterior definiremos los modelos basándonos en la teoría de grafos
donde reasentaremos los modelos como un conjunto de vértices y artistas, en su mayoría
haremos referencia a grafos dirigidos.

𝑁 = {1,2,3,4,5}

𝐴 = {(1,2), (1,3), (2,3), (2,5), (3,4), (3,5), (4,2), (4,5)}

Algoritmo de árbol de expansión mínima


El algoritmo de árbol de expansión mínima enlaza los nodos de una red, en forma directa o
indirecta, con la mínima longitud de las ramas enlazantes. Una aplicación característica es en la
construcción de carreteras pavimentadas que unen varias poblaciones. El camino entre dos
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

poblaciones puede pasar por uno o más poblaciones adicionales. El diseño más económico del
sistema de caminos indica que se minimice la distancia total de caminos pavimentados, resultado
que se obtiene implementando el algoritmo de árbol de expansión mínima.

Paso 0: El conjunto 𝐶0 = ∅ 𝑦 ̅̅̅


𝐶0 = 𝑁

Paso 1: Comenzar con cualquier nodo en el conjunto ̅̅̅


𝐶0 no conectado, e igualar 𝐶1 = {𝑖}, con lo
que ̅̅̅
𝐶1 = 𝑁 − {𝑖}. Igualar 𝑘 = 2

Paso general K. seleccionar un nodo 𝑗 ∗ en el conjunto no conectado ̅̅̅̅̅̅


𝐶𝑘−1. Enlazar a 𝑗 ∗ en forma
̅ , esto es
permanente con 𝐶𝑘−1 y sacarlo de 𝐶𝑘−1

̅
𝐶𝑘 = 𝐶𝑘−1 + {𝑗 ∗ }, 𝐶𝑘−1 − {𝑗 ∗ }

Si el conjunto 𝐶𝑘̅ de nodos conectados es vacío, detenerse. En cualquier otro caso, igualar 𝑘 = 𝑘 +
1 y repetir el paso.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Programado con python

#Algoritmo Àrbol de expansion minima

#
import numpy as nu
from StringIO import StringIO
class ArbolExpansionMinima():
matrizAdyacencia=[]
matrizResultados=[]
def __init__(self,matriz):
self.matrizAdyacencia=matriz
self.matrizResultados=[[0 for i in range(0,len(matriz))]for j in
range(0,len(matriz))]
def inicio_algoritmo(self):
self.listavacia=[]
self.listapermanente=[1,2,3,4,5,6,7,8,9]
elemento=self.listapermanente[0]
self.listavacia.append(elemento)
self.listapermanente.remove(elemento)
while len(self.listapermanente)!=0:
elemento=self.buscar()
self.listavacia.append(elemento)
self.listapermanente.remove(elemento)
for i in range(0,len(self.matrizAdyacencia)):
print self.matrizResultados[i]
def buscar(self):
minimo=999
index1=""
index2=""
for item in self.listavacia:
for item2 in self.listapermanente:
if(self.matrizAdyacencia[item-1][item2-1]!=9999):
if(self.matrizAdyacencia[item-1][item2-1]<minimo):
minimo=self.matrizAdyacencia[item-1][item2-1]
index1=item-1
index2=item2-1
self.matrizResultados[index1][index2]=self.matrizAdyacencia[index1][index2]
self.matrizResultados[index2][index1]=self.matrizAdyacencia[index1][index2]
return index2+1
class Main():
def __init__(self):
archivo=open("matrizAdyacencia.txt","r")
data=archivo.read()
archivo.close();
data_array=nu.genfromtxt(StringIO(data))
expansion=ArbolExpansionMinima(data_array)
expansion.inicio_algoritmo()
program=Main()
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Problema de la ruta más Corta


Muchos problemas de la vida real requieren soluciones que permitan optimizar diversas rutas o
caminos basando en el contexto del problema que se requiera resolver.

Encontrar la ruta más corta de un punto a otro punto es uno de los más comunes, para tal efecto
se han creado numerosos algoritmos entre ellos “heurísticos”, en este caso nos enfocaremos en
los algoritmos más conocidos he importantes, pero antes de conocer estos algoritmos veamos
cómo podemos resolver este problema.

Ejemplo.

Tenemos un país X, este país tiene 7 ciudades, a, b, c, e, f, g y h. se encuentran conectados de la


siguiente forma.

Entonces se puede representar como 𝐺 = (𝑉, 𝐸) dónde:

𝑉 = {𝑎, 𝑏, 𝑐, 𝑑, 𝑒, 𝑓, 𝑔, ℎ}

𝐸 = {(𝑎, 𝑐), (𝑎, 𝑏), (𝑏, 𝑒)(𝑏, ℎ), (ℎ, 𝑒), (ℎ, 𝑔), (𝑔, 𝑓), (𝑓, 𝑑), (𝑒, 𝑑), (𝑒, 𝑐), (𝑑, 𝑐)}

En los últimos años han ocurrido diversos accidentes en cada una de las rutas, donde las
probabilidades de accidentes se detallan en la siguiente tabla.

Nombre de la ruta Conexión Probabilidad de


Accidente
A-1 (a,c) 5%
A-2 (a,b) 3%
B-1 (b,e) 2%
B-2 (b,h) 3%
H-1 (h,e) 5,3%
H-2 (h,g) 4%
G-1 (g,f) 1%
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

F-1 (f,d) 2%
E-1 (e,d) 0.5%
E-2 (e,c) 1%
D-1 (d,c) 2%

En base a esas estadísticas Miguel quien es una persona que quiere emprender un viaje con toda
su familia, quiere escoger la ruta más segura entre las ciudades a y g.

La solución a este problema puede ser encontrada fácilmente aplicando el siguiente algoritmo.

Algoritmo Dikjstra.

Este algoritmo permite encontrar la ruta más corta desde un Vértice seleccionado hacia todos los
demás.

A continuación se describe el algoritmo:

Paso 0. Etiquetar el nodo fuente (nodo 1) con la etiqueta permanente [0,--]. Igualar 𝑖 = 1.
Paso i. a) Calcular las etiquetas temporales [𝑢𝑖 + 𝑑𝑖𝑗 , 𝑖] para cada nodo 𝑗 al que pueda llegarse
desde el nodo 𝑖, siempre y cuando 𝑗 no tenga etiqueta permanente. Si el nodo 𝑗 ya está
etiquetado con [𝑢𝑗 , 𝐾] por otro nodo 𝑘, y si 𝑢𝑗 + 𝑑𝑖𝑗 < 𝑢𝑗 sustituir [𝑢𝑗 , 𝑘]por [𝑢𝑗 + 𝑑𝑖𝑗 , 𝑖].
b) Si todos los nodos tienen etiquetas permanentes detenerse, en caso contrario seleccionar la
etiqueta [𝑢𝑖 , 𝑠] que tenga la distancia más corta (= 𝑢𝑟 ) entre todas las etiquetas temporales (los
empates se rompen en forma arbitraria). Hacer que 𝑖 = 𝑟 y repetir el paso 𝑖.
Para solucionar el problema planteado en la figura (), la red quedaría de la siguiente forma.

La solución aplicando el algoritmo Dikjstra sería.


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

1 2

Etiquetamos con etiqueta permanente el nodo inicial 𝑎 De las etiquetas temporales buscamos el menor en este
[0, −−] y como a esta conectado con c y b, definimos caso es [3,a] en el vértice 𝑏 y lo convertimos en nuestro
las etiquetas Temporales [5,a], [3,a]. nodo permanente.

3 4

Seleccionamos la etiqueta menor en este caso tenemos Desde 𝑐 alcanzamos el nodo 𝑑 𝑦 𝑒 que no tienen y tiene
un empate con los vértices 𝑒, 𝑐 entonces hacemos una etiqueta temporal, en caso de d sumamos 5+2=7 y en
selección arbitraria. Tomaremos la etiqueta del vértice caso de e sumamos 5+1=6 como 6>5 no cambiamos la
c [5, 𝑎]. etiqueta temporal que ya tiene 𝑒.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

5 6

Seleccionado e como vertice permanente Desde 𝑒 alcanzamos 𝑑, ℎ en caso de 𝑑 sumamos


5+0.5=5.5 y 5.5<7 entonces reemplazamos la etiqueta
anterior. En caso de h no hacemos nada.

7 8

Seleccionado d como vértice permanente Desde 𝑑 solo alcanzamos a 𝑓 con 7.5

9 10
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Seleccionamos h teniendo como criterio la etiqueta


La única opción posible para h es g con 10
temporal menor

11 12

Escogemos el menor que es 7.5, se convierte en nuestra Finalmente terminamos el algoritmo, en G, ya que este
etiqueta permanente, y el camino hacia g mejora no puede conectarse con nadie más ya que ya no
porque 8.5<10 y reemplazamos existen etiquetas temporales.

Interpretación de resultados.
Las etiquetas nos dan toda información que necesitamos para resolver el problema.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

La ruta más segura de 𝑎 hacia 𝑔 es 𝑎 → 𝑏 → 𝑒 → 𝑑 → 𝑓 → 𝑔, porque la probabilidad de una


accidente por esas rutas es solo del 8.5%.
La interpretación se hace en base a las etiquetas resultantes. Tenemos el número [𝑢𝑖 , 𝑗] j nos da el
vértice porque cual se debe ir y 𝑢𝑖 nos da el % del peligro para este problema.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Código en Python
from StringIO import StringIO
import numpy as num
import pdb
class Node:
indice="-"
pesosacumulados=0
estado=""
nodoid=0
def __main__():
cadena="\nEstado: "+estado+" id: "+nodoid
return cadena
class Djkstra:
matriz=[]
nodoActual=""
listadenodos=[]
def __init__(self,matriz):
self.matriz=matriz
def setNodoInicial(self,index):

for i in range(0,len(self.matriz)):
p=Node()
p.nodoid=i
self.listadenodos.append(p)
self.listadenodos[index].estado="Permanente"
self.listadenodos[index].nodoid=index
self.nodoActual=self.listadenodos[index]
def iniciarBusqueda(self):
while(self.existanNodosNoPermanentes()):
for i in range(0,len(self.matriz)):
idNodo=self.nodoActual.nodoid
if(self.matriz[idNodo][i]!=9999):
peso=self.matriz[idNodo][i]
nodoCompare=self.getNodo(i)
if(nodoCompare.estado!="Permanente"):

if(self.nodoActual.pesosacumulados+peso<nodoCompare.pesosacumulados or
nodoCompare.estado==""):

nodoCompare.pesosacumulados=self.nodoActual.pesosacumulados+peso
nodoCompare.indice=self.nodoActual.nodoid
nodoCompare.estado="no Permanente"
minimo=99999
aux=""
for i in range(0,len(self.matriz)):
if(self.listadenodos[i].estado=="no Permanente" and
self.listadenodos[i].pesosacumulados<minimo):
minimo=self.listadenodos[i].pesosacumulados
aux=self.listadenodos[i]
aux.estado="Permanente"
self.nodoActual=aux
for i in range(0,len(self.listadenodos)):
print
"["+str(self.listadenodos[i].indice)+","+str(self.listadenodos[i].pesosacumulados)+"]"
def getNodo(self,id):
for i in range(0,len(self.matriz)):
if(self.listadenodos[i].nodoid==id):
return self.listadenodos[i]
return False
def existanNodosNoPermanentes(self):
for i in range(0,len(self.listadenodos)):
if(self.listadenodos[i].estado!="Permanente"):
return True
return False
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

class Main:
def __init__(self):
archivo=open("matrizAdyacencia.txt","r")
data=archivo.read()
archivo.close()
matriz=num.genfromtxt(StringIO(data))
p=Djkstra(matriz)
p.setNodoInicial(0)
p.iniciarBusqueda()
programa=Main()

Algoritmo Floyd
El algoritmo Floyd es más general que Dijkstra, porque determina la ruta más corta entre
cualquiera de los vertices. El algoritmo representa una red de n nodos como matriz cuadrada de n
renglones y n columnas. El elemento (i,j) de la matriz expresa la distancia 𝑑𝑖𝑗 del vértice i al
vértice j , y es finita si el vértice esta conectado directamente con j, e infinita en caso contrario.

Definir las matrices iniciales de distancias 𝐷0 y de secuencias de nodos 𝑆0 como se describe abajo.
Los elementos diagonales se marcan con (0) para indicar que están bloqueados. Igualar 𝑘 = 𝑖.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Paso general K. Definir el renglón 𝑘 y la columna 𝑘 como renglón pivote y columna pivote. Aplicar
la operación triple a cada elemento 𝑑𝑖𝑗 en 𝐷𝑘−1 para toda 𝑖 y 𝑗. Si se satisface la condición.
𝑑𝑖𝑘 + 𝑑𝑘𝑗 < 𝑑𝑖𝑗 , (𝑖 ≠ 𝑘 𝑒 𝑖 ≠ 𝑗)
Hacer estos cambios
a) Crear 𝐷𝑘 reemplazando 𝑑𝑖𝑗 en 𝐷𝑘−1 por 𝑑𝑗𝑘 + 𝑑𝑘𝑗
b) Crear 𝑆𝑘 reemplazando 𝑆𝑖𝑗 en 𝑆𝑘−1 por 𝑘. Igualar 𝑘 = 𝑘 + 1 y repetir el paso 𝑘.

Ejemplo:
Aplicando el algoritmo Floyd en el ejemplo anterior
En este caso tenemos la iteración 0 con las matrices iniciales llamadas matriz de pesos y matriz de
recorrido.
Iteración 0

Matriz de Pesos o adyacencia Matriz de recorrido


[ --, 3, 5,INF,INF,INF,INF,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 3, --, 8,INF, 2,INF,INF, 3] | [0, 1, 0, 3, 4, 5, 6, 7]
[ 5, 8, --, 2, 1,INF,INF,INF] | [0, 0, 2, 3, 4, 5, 6, 7]
[INF,INF, 2, --,0.5, 2,INF,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF, 2, 1,0.5, --, --, --,5.3] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF,INF,INF, 2,INF, --, 1,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF,INF,INF,INF,INF, 1, --,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF, 3,INF,INF,5.3,INF, 4, --] | [0, 1, 2, 3, 4, 5, 6, 7]
-----------------------------------------------------------------------

Iteración 1

Matriz de Pesos Matriz de recorrido


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

[ --, 3, 5,INF, 5,INF,INF, 6] | [0, 1, 2, 3, 1, 5, 6, 1]


[ 3, --, 8,INF, 2,INF,INF, 3] | [0, 1, 0, 3, 4, 5, 6, 7]
[ 5, 8, --, 2, 1,INF,INF, 11] | [0, 0, 2, 3, 4, 5, 6, 1]
[INF,INF, 2, --,0.5, 2,INF,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[INF,INF,INF, 2,INF, --, 1,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF,INF,INF,INF,INF, 1, --,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 6, 3, 11,INF, 5,INF, 4, --] | [1, 1, 1, 3, 1, 5, 6, 7]
-----------------------------------------------------------------------

Iteración 2

Matriz de Pesos Matriz de recorrido


[ --, 3, 5, 7, 5,INF,INF, 6] | [0, 1, 2, 2, 1, 5, 6, 1]
[ 3, --, 8, 10, 2,INF,INF, 3] | [0, 1, 0, 2, 4, 5, 6, 7]
[ 5, 8, --, 2, 1,INF,INF, 11] | [0, 0, 2, 3, 4, 5, 6, 1]
[ 7, 10, 2, --,0.5, 2,INF, 13] | [2, 2, 2, 3, 4, 5, 6, 2]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[INF,INF,INF, 2,INF, --, 1,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[INF,INF,INF,INF,INF, 1, --,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 6, 3, 11, 13, 5,INF, 4, --] | [1, 1, 1, 2, 1, 5, 6, 7]
-----------------------------------------------------------------------

Iteración 3

Matriz de Pesos Matriz de recorrido


[ --, 3, 5, 7, 5, 9,INF, 6] | [0, 1, 2, 2, 1, 3, 6, 1]
[ 3, --, 8, 10, 2, 12,INF, 3] | [0, 1, 0, 2, 4, 3, 6, 7]
[ 5, 8, --, 2, 1, 4,INF, 11] | [0, 0, 2, 3, 4, 3, 6, 1]
[ 7, 10, 2, --,0.5, 2,INF, 13] | [2, 2, 2, 3, 4, 5, 6, 2]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[ 9, 12, 4, 2,2.5, --, 1, 15] | [3, 3, 3, 3, 3, 5, 6, 3]
[INF,INF,INF,INF,INF, 1, --,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 6, 3, 11, 13, 5, 15, 4, --] | [1, 1, 1, 2, 1, 3, 6, 7]
------------------------------------------------------------------

Iteración 4

Matriz de Pesos Matriz de recorrido


[ --, 3, 5,5.5, 5, 5, 5, 6] | [0, 1, 2, 4, 1, 4, 4, 1]
[ 3, --, 3,2.5, 2, 2, 2, 3] | [0, 1, 4, 4, 4, 4, 4, 7]
[ 5, 3, --,1.5, 1, 1, 1, 6] | [0, 4, 2, 4, 4, 4, 4, 4]
[5.5,2.5,1.5, --,0.5,0.5,0.5,5.5] | [4, 4, 4, 3, 4, 4, 4, 4]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[7.5,4.5,3.5, 2,2.5, --, 1,7.5] | [4, 4, 4, 3, 3, 5, 6, 4]
[INF,INF,INF,INF,INF, 1, --,INF] | [0, 1, 2, 3, 4, 5, 6, 7]
[ 6, 3, 6,5.5, 5, 5, 4, --] | [1, 1, 4, 4, 1, 4, 6, 7]
------------------------------------------------------------------
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Iteración 5

Matriz de Pesos Matriz de recorrido


[ --, 3, 5,5.5, 5, 5, 5, 6] | [0, 1, 2, 4, 1, 4, 4, 1]
[ 3, --, 3,2.5, 2, 2, 2, 3] | [0, 1, 4, 4, 4, 4, 4, 7]
[ 5, 3, --,1.5, 1, 1, 1, 6] | [0, 4, 2, 4, 4, 4, 4, 4]
[5.5,2.5,1.5, --,0.5,0.5,0.5,5.5] | [4, 4, 4, 3, 4, 4, 4, 4]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[7.5,4.5,3.5, 2,2.5, --, 1,7.5] | [4, 4, 4, 3, 3, 5, 6, 4]
[8.5,5.5,4.5, 3,3.5, 1, --,8.5] | [5, 5, 5, 5, 5, 5, 6, 5]
[ 6, 3, 6,5.5, 5, 5, 4, --] | [1, 1, 4, 4, 1, 4, 6, 7]
------------------------------------------------------------------

Iteración 6

Matriz de Pesos Matriz de recorrido


[ --, 3, 5,5.5, 5, 5, 5, 6] | [0, 1, 2, 4, 1, 4, 4, 1]
[ 3, --, 3,2.5, 2, 2, 2, 3] | [0, 1, 4, 4, 4, 4, 4, 7]
[ 5, 3, --,1.5, 1, 1, 1, 6] | [0, 4, 2, 4, 4, 4, 4, 4]
[5.5,2.5,1.5, --,0.5,0.5,0.5,5.5] | [4, 4, 4, 3, 4, 4, 4, 4]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[7.5,4.5,3.5, 2,2.5, --, 1,7.5] | [4, 4, 4, 3, 3, 5, 6, 4]
[8.5,5.5,4.5, 3,3.5, 1, --,8.5] | [5, 5, 5, 5, 5, 5, 6, 5]
[ 6, 3, 6,5.5, 5, 5, 4, --] | [1, 1, 4, 4, 1, 4, 6, 7]
------------------------------------------------------------------

Iteración 7

Matriz de Pesos Matriz de recorrido


[ --, 3, 5,5.5, 5, 5, 5, 6] | [0, 1, 2, 4, 1, 4, 4, 1]
[ 3, --, 3,2.5, 2, 2, 2, 3] | [0, 1, 4, 4, 4, 4, 4, 7]
[ 5, 3, --,1.5, 1, 1, 1, 6] | [0, 4, 2, 4, 4, 4, 4, 4]
[5.5,2.5,1.5, --,0.5,0.5,0.5,5.5] | [4, 4, 4, 3, 4, 4, 4, 4]
[ 5, 2, 1,0.5, --, --, --, 5] | [1, 1, 2, 3, 4, 5, 6, 1]
[7.5,4.5,3.5, 2,2.5, --, 1,7.5] | [4, 4, 4, 3, 3, 5, 6, 4]
[8.5,5.5,4.5, 3,3.5, 1, --,8.5] | [5, 5, 5, 5, 5, 5, 6, 5]
[ 6, 3, 6,5.5, 5, 5, 4, --] | [1, 1, 4, 4, 1, 4, 6, 7]
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Algoritmo hecho en Python

import pdb
class floyd():
mainmatrix=[]
def __init__(self,matrix):
self.mainmatrix=matrix
def iniciar(self):
cn=len(self.mainmatrix)
path=self.mainmatrix;
#pdb.set_trace()
i=0
for r in range(0,cn):
path[i][i]=0
i+=1
rutas=[[0 for i in range(0,cn)]for j in range(0,cn)]
for r in range(0,cn):
for i in range(0,cn):
rutas[i][r]=r
for k in range(0,cn):
for i in range(0,cn):
for j in range(0,cn):
dt = path[i][k] + path[k][j]
if dt<path[i][j]:
rutas[i][j]=k
path[i][j]=dt
self.imprimir(path,rutas,k)
def imprimir(self,path,rutas,k):
paths=path
ruts=rutas
cn=len(path)
print "-----------------------------------------------------------------------\n"
print "Iteracion %s \n"%k
print "Matriz de Pesos Matriz de recorrido"
for i in range(0,cn):
cad="["
for j in range(0,cn):
n=len(str(paths[i][j]))

if n<3:
for kk in range(0,3-n):
cad+=" "
if j<cn-1:
cad+=str(paths[i][j])+","
else:
cad+=str(paths[i][j])
print "%s] | %s"%(cad,rutas[i])
#print "%s | %s"%(paths[i],rutas[i])
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Flujo máximo
Existe una diversidad de problemas donde lo impórtate es la cantidad de flujo que pasa a través de
cierta red.
Existen muchos problemas que se puede resolver conociendo el concepto de flujo máximo, este
depende naturalmente de los límites o capacidades de cada arco o arista, que son parte de la red.
Definamos algunos términos:
Definiciones básicas
Flujo: Cantidad de una sustancia que se transmite de un punto a otro sobre una unidad de tiempo.
Capacidad de flujo: es la cantidad máxima de flujo que puede ingresar atreves del nodo fuente y
salir por el nodo destino
Origen: es el vértice por el cual el flujo ingresa
Destino: es el vértice por el cual el flujo sale
Capacidades residuales: Capacidades restantes del arco una vez un flujo pasado por él.

Enumeración y cortes
Un cortede fine a un conjunto de arcos que, cuando se eliminan de la red, causan una interrupción
total del flujo entre los nodos fuente y sumidero. La capacidad de corte es igual a la suma de las
capacidades de los arcos correspondientes. Entre todos los cortes posibles en la red, el que tenga
la capacidad menor permite el flujo máximo en la red.
Ejemplo:
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Si hacemos estos cortes podemos determinar en base al siguiente criterio el flujo máximo de esta
red.
10+30+20 60
10+30+30+40 110
20+30+20 70

El flujo máximo llegaría a ser 60 la menor suma de todos los cortes posibles. No se puede decir
cuál es el flujo máximo en la red, a menos que se enumeren todos los cortes posibles. La única
información que se puede obtener de la enumeración parcial de los tres cortes es que el flujo
máximo en la red no puede ser mayor que 60 unidades. Desafortunadamente, enumerar todos los
cortes no es una tarea sencilla, y entonces se hace necesario desarrollar el eficiente algoritmo de

FLUJO MAXIMO conocido como el algoritmo de Fork Fulkerson .

Algoritmo de flujo máximo

Paso 1.- Al nodo origen se le pone la etiqueta [-, ]; significa, a izquierda no hay inversos, a
derecha no hay límite de flujo. En este caso el nodo origen queda en el estado etiquetado y no
explorado, todos los otros nodos, no están etiquetados.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Paso 2.- Determinar 𝑆𝑖 , el conjunto de nodos 𝑗 bi etiquetados que se pueden alcanzar


directamente desde el nodo 𝑖, con arcos residuales positivos (esto es, 𝐶𝑖𝑗 > 0) para toda 𝑗 ∈ 𝑆𝑖 ≠
∅, ir al paso 3, en caso contrario ir al caso 4.

Paso 3.- determinar 𝑘 ∈ 𝑆𝑖 tal que.

𝑪𝒊𝒌 = 𝒎𝒂𝒙𝒋∈𝑺𝒊 {𝒄𝒊𝒋 }

Igualar 𝑎𝑘 = 𝑐𝑖𝑘 y etiquetar el nodo 𝑘 con [𝑎𝑘 , 𝑖].Si 𝑘 = 𝑛, el nodo sumidero sea ha etiquetado, y
se ha encontrado una ruta de irrupción. Ir al paso 5. En caso contrario igualar 𝑖 = 𝑘 y seguir ene l
paso 2.

Paso 4. (𝑹𝒆𝒕𝒓𝒐𝒄𝒆𝒔𝒐). Si 𝒊 = 𝟏, no hay otras irrupciones posibles; ir al paso 6. En caso contrario,


sea r rl nodo que se ha etiquetado inmediatamente antes del nodo actual i y quitar 𝑖 del conjunto
de nodos adyacentes a 𝑟. Igualar 𝑖 = 𝑟 y continuar al paso 2.

Paso 5. (𝐷𝑒𝑡𝑒𝑟𝑚𝑖𝑛𝑎𝑐𝑖𝑜𝑛 𝑑𝑒 𝑙𝑎 𝑟𝑒𝑑 𝑟𝑒𝑠𝑖𝑑𝑢𝑎𝑙) Sea 𝑁𝑝 = {1, 𝑘1 , 𝑘2 , 𝑘3 , 𝑛}; se definen los nodos de
la p-ésima ruta de irrupción del nodo fuente 1 al nodo sumidero 𝑛. Entonces el flujo máximo por la
ruta se calcula como

𝑓𝑝 = min{𝑎1 , 𝑎2 , … 𝑎𝑛 }

La capacidad residual de cada arco a lo largo de la ruta de irrupción se disminuye en 𝑓𝑝 unidades


en la dirección de flujo y se aumenta 𝑓𝑝 unidades en la dirección contraria; esto es, para los nodos
𝑖 𝑦 𝑗 en la ruta, el flujo residual se cambia del actual (𝑐𝑖𝑗 , 𝑐𝑗𝑖 )

a) (𝑪𝒊𝒋 − 𝒇𝒑, 𝑪𝒋𝒊 + 𝒇𝒑 )𝒔𝒊 𝒆𝒍 𝒇𝒍𝒖𝒋𝒐 𝒗𝒂 𝒅𝒆 𝒊 𝒂 𝒋

b) (𝑪𝒊𝒋 + 𝒇𝒑, 𝑪𝒋𝒊 − 𝒇𝒑 )𝒔𝒊 𝒆𝒍 𝒇𝒍𝒖𝒋𝒐 𝒗𝒂 𝒅𝒆 𝒋 𝒂 𝒊

Se re instalan todos los nodos que se hayan eliminado en el paso 4. Poner 𝒊 = 𝟏 y regresar al paso
2 para intentar una nueva ruta de irrupción, repetir este proceso hasta que ya no existan rutas de
irrupción.
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Paso 6: Si ya no existen más rutas de irrupción el algoritmo se detiene el flujo máximo es

𝐹 = 𝑓1 + 𝑓2 + 𝑓3 + 𝑓4 + ⋯ 𝑓𝑚

Ejemplo de su aplicación.

Ejemplo:

Tres refinerías envían su producto de gasolina a dos terminales. La demanda que no se pueda
satisfacer se adquiere de otras fuentes. El producto de gasolina se transporta a las terminales por
medio de una red de conductos que son impulsados por tres estaciones de bombeo.

La tabla siguiente la información de los enlaces y la capacidad de bombeo.

De A Capacidad De A Capacidad

R1 E1 20 E1 E3 10

R2 E1 35 E2 E3 30

R2 E2 45 E1 T1 10

R3 E3 15 E2 T2 30

E1 E3 20 E3 T1 50

E2 E1 10 E3 T2 20

La red resultante sería:


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Para un desarrollo correcto del algoritmo es necesario incluir un inicio y un fin con capacidades
infinitas, para que su valor no sea tomando en cuenta y será irrelevante dentro de la red.

Transformación, convertimos la red dirigida en una red de capacidades:

Iteración 1 Paso 1, Paso2, Paso3


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

PASO 5

𝒇𝟏 = 𝒎𝒊𝒏{∞, ∞, 𝟐𝟎, 𝟐𝟎, 𝟑𝟎, 𝟓𝟎, ∞} => 𝒇𝟏 = 𝟐𝟎

Traspaso de flujo aplicando:

a) (𝑪𝒊𝒋 − 𝒇𝒑, 𝑪𝒋𝒊 + 𝒇𝒑 )𝒔𝒊 𝒆𝒍 𝒇𝒍𝒖𝒋𝒐 𝒗𝒂 𝒅𝒆 𝒊 𝒂 𝒋

b) (𝑪𝒊𝒋 + 𝒇𝒑, 𝑪𝒋𝒊 − 𝒇𝒑 )𝒔𝒊 𝒆𝒍 𝒇𝒍𝒖𝒋𝒐 𝒗𝒂 𝒅𝒆 𝒋 𝒂 𝒊

Conexión Traspaso de flujo Total


(r1,e1) (20-20,0+20) (0,20)
(E1,E2) (20-20,10+20) (0,30)
(E2,E3) (30-20,0+20) (10,20)
(E3,F1) (50-20,0+20) (30,20)
(F,D) (INF-20,0+20) (INF,20)

Las capacidades y capacidades residuales quedan en:


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Iteración 2: Paso 1, Paso2, Paso3

Paso 5:

𝒇𝟐 = 𝒎𝒊𝒏{∞, ∞, 𝟒𝟓, 𝟑𝟎, ∞} => 𝒇𝟐 = 𝟑𝟎

Traspaso de flujo:

Conexión Traspaso de flujo Total


(R3,E2) (45-30,0+30) (15,30)
(E2,F) (30-30,0+30) (0,30)
(F,D) (INF-30,0+30) (INF,30)

Las capacidades y capacidades residuales quedan en:

Iteración 3: Paso 1, Paso2, Paso3


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Paso 5:

𝒇𝟑 = 𝒎𝒊𝒏{∞, ∞, 𝟑𝟓, 𝟏𝟎, 𝟑𝟎, ∞} => 𝒇𝟑 = 𝟏𝟎

Traspasando el flujo de manera directa tenemos:

Iteración 4: Paso 1, Paso2, Paso3


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

PASO 5:

𝒇𝟒 = 𝒎𝒊𝒏{∞, ∞, 𝟐𝟓, 𝟏𝟎, ∞} => 𝒇𝟒 = 𝟏𝟎

Traspasando el flujo de manera directa tenemos:

Iteración 5: Paso 1, Paso2, Paso3,Paso 4


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

𝒇𝟓 = 𝒎𝒊𝒏{∞, ∞, 𝟏𝟓, 𝟏𝟎, 𝟐𝟎, ∞} => 𝒇𝟓 = 𝟏𝟎

Aquí podremos observar cómo se aplica el retroceso, la capacidad más grande en el vértice e2, es
30 el que conecta con e1, pero al tomar dicha conexión nos vemos obligados a retroceder porque
no tenemos irrupciones posibles en el vértice e1, así que regresamos a e2 y buscamos la irrupción
más próxima que es de 10 que conecta el vértice e2 con el e3.

Traspasando el flujo de manera directa tenemos:

Podemos ver en el gráfico que las capacidades de E1->F , E1->E3, E2->E3, E2->F, han llegado a su
límite ya que marcan 0, es ahí donde termina el algoritmo y el flujo máximo es la suma de:

𝐹 = {𝑓1 + 𝑓2 + 𝑓3 + 𝑓4 + 𝑓5 }=20+30+10+10+10=80
 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Interpretación de resultados

Refinería 1: envió de 10 barriles

Refinería 2 envió de 60 barriles

Refinería 3 envió de 10 barriles mínimo

Terminal 1: Recepción de 40 barriles

Terminal 2: Recepción de 40 barriles


 Investigación de operaciones 2 Ing. Ditmar David Castro Angulo

Tema 3

Programación y evaluación de proyectos CPM y PERT

S-ar putea să vă placă și