martes, 29 de octubre de 2019

El algoritmo de Dijkstra

El algoritmo de Dijkstra

El algoritmo de Dijkstra te permite calcular la ruta más corta entre un nodo (tú eliges cuál) y todos los demás nodos en el grafo. Encontrarás una descripción del algoritmo al final de esta página, pero ¡vamos a estudiarlo con un ejemplo explicado! Calcularemos la distancia más corta entre el nodo C y los demás nodos del grafo:
Grafo de ejemplo
Durante la ejecución del algoritmo, iremos marcando cada nodo con su distancia mínima al nodo C (nuestro nodo elegido). Para el nodo C, esta distancia es 0. Para el resto de nodos, como todavía no conocemos esa distancia mínima, empieza siendo infinita (∞):
Grafo de ejemplo
También tendremos un nodo actual. Inicialmente, el nodo actual será C (nuestro nodo elegido). En la imagen, marcaremos el nodo actual con un punto rojo.
Ahora, revisaremos los vecinos de nuestro nodo actual (A, B y D) en cualquier orden. Empecemos con B. Sumamos la mínima distancia del nodo actual (en este caso, 0) con el peso de la arista que conecta al nodo actual con B (en este caso, 7), y obtenemos 0 + 7 = 7. Comparamos ese valor con la mínima distancia de B (infinito); el valor más pequeño es el que queda como la distancia mínima de B (en este caso, 7 es menos que infinito):
Grafo de ejemplo
Bien. Ahora revisaremos al vecino A. Sumamos 0 (la distancia mínima de C, nuestro nodo actual) con 1 (el peso de la arista que conecta nuestro nodo actual con A) para obtener 1. Comparamos ese 1 con la mínima distancia de A (infinito) y dejamos el menor valor:
Grafo de ejemplo
OK. Repetimos el procedimiento para D:
Grafo de ejemplo
Genial. Hemos revisado todos los vecinos de C. Por ello, lo marcamos como visitado. Representemos a los nodos visitados con una marca de verificación verde:
Grafo de ejemplo
Ahora debemos seleccionar un nuevo nodo actual. Ese nodo debe ser el nodo no visitado con la menor distancia mínima, es decir, el nodo con el menor número y sin marca de verificación verde. En este caso, ese nodo es A. Vamos a marcarlo con el punto rojo:
Grafo de ejemplo
Ahora, repetimos el algoritmo. Revisamos los vecinos de nuestro nodo actual, ignorando los visitados. Esto significa que solo revisaremos B.
Para B, sumamos 1 (la distancia mínima de A, nuestro nodo actual) con 3 (el peso de la arista conectando a A con B) para obtener 4. Comparamos ese 4 con la distancia mínima de B (7) y dejamos el menor valor: 4.
Grafo de ejemplo
Después, marcamos A como visitado y elegimos un nuevo nodo: D, que es el nodo no visitado con la menor distancia mínima.
Grafo de ejemplo
Repetimos el algoritmo de nuevo. Esta vez, revisamos B y E.
Para B, obtenemos 2 + 5 = 7. Comparamos ese valor con la distancia mínima de B (4) y dejamos el menor valor (4). Para E, obtenemos 2 + 7 = 9, lo comparamos con la distancia mínima de E (infinito) y dejamos el valor menor (9).
Marcamos D como visitado y establecemos nuestro nodo actual en B.
Grafo de ejemplo
Casi terminamos. Sólo debemos verificar E. 4 + 1 = 5, que es menos que la distancia mínima de E (9), así que dejamos el 5. Marcamos B como visitado y establecemos E como el nodo actual.
Grafo de ejemplo
E no tiene vecinos no visitados, así que no verificamos nada. Lo marcamos como visitado.
Grafo de ejemplo
Como no hay nodos no visitados, ¡terminamos! La distancia mínima de cada nodo ahora representa la mínima distancia entre ese nodo y el nodo C (el nodo que elegimos como nodo inicial).
Aquí está una descripción del algoritmo:
  1. Marca el nodo inicial que elegiste con una distancia actual de 0 y el resto con infinito.
  2. Establece el nodo no visitado con la menor distancia actual como el nodo actual A.
  3. Para cada vecino V de tu nodo actual A: suma la distancia actual de A con el peso de la arista que conecta a A con V. Si el resultado es menor que la distancia actual de V, establécese como la nueva distancia actual de V.
  4. Marca el nodo actual A como visitado.
  5. Si hay nodos no visitados, ve al paso 2.

miércoles, 9 de octubre de 2019

Método de Transporte de Vogel


Método de Aproximación de Vogel (Algoritmo de Transporte en Programación Lineal)



El Método de Aproximación de Vogel es una versión mejorada del Método del Costo Mínimo y el Método de la Esquina Noroeste que en general produce mejores soluciones básicas factibles de inicio, entendiendo por ello a soluciones básicas factibles que reportan un menor valor en la función objetivo (de minimización) de un Problema de Transporte balanceado (suma de la oferta = suma de la demanda).
Los pasos que requiere la aplicación del Método de Aproximación de Vogel son los siguientes:
Paso 1: Determinar para cada fila (columna) una medida de penalización restando el elemento de costo unitario mínimo en la fila (columna) del elemento con costo unitario siguiente al mínimo de la misma fila (columna).
Paso 2: Identificar la fila o columna con la mayor penalización. Romper los empates (de existir) de forma arbitraria. Asignar todo lo posible a la variable que tenga el mínimo costo unitario de la fila o columna seleccionada. Ajusta la oferta y la demanda y tachar la fila o la columna ya satisfecha. Si se satisfacen una fila y una columna en forma simultánea, sólo se tacha uno de los dos y al que queda se le asigna oferta o demanda cero.
Paso 3:
  • Si queda sin tachar exactamente una fila o columna con cero oferta o demanda, detenerse.
  • Si queda sin tachar una fila (columna) con oferta (demanda) positiva, determinar las variables básicas en la fila (columna) con el Método del Costo Mínimo. Detenerse.
  • Si todas las filas y columnas que no se tacharon tienen cero oferta y demanda (restante), determinar las variables básicas cero por el Método del Costo Mínimo. Detenerse.
  • En cualquier otro caso, seguir en el Paso 1.

Ejemplo Método de Aproximación de Vogel

Consideremos nuevamente un problema de transporte balanceado que tiene 3 fuentes de oferta (silos) y 4 fuentes de demanda (molinos). Los valores numéricos en la esquina superior derecha de cada cuadro, en adelante c_{ij} representan el costo unitario de transporte desde el silo i al molino j. Por ejemplo c_{11}=10 es el costo unitario de transporte desde el silo 1 al molino 1.
ejemplo-esquina-noroeste
Según lo descrito anteriormente el primer paso consiste en calcular el factor de penalización para cada fila y columna de la tabla que representa el problema de transporte anterior. Por ejemplo, en la fila 1 el mínimo costo es $2 y y el costo unitario siguiente al mínimo es $10. En consecuencia la penalización de dicha fila es $8 ($10-$2). Se replica el mismo cálculo para cada fila y columna de la tabla lo cual es trivial y reporta los siguientes resultados (se han marcado las penalizaciones de las respectivas filas y columnas con color naranjo para mayor claridad):
penalizacion-metodo-de-voge
Como la fila 3 tiene la máxima penalización ($10) y la celda correspondiente a x_{31} tiene el costo unitario mínimo de esa fila, se asigna 5 unidades a x_{31} (más no es necesario aún cuando la capacidad del silo 3 lo permite dado que la demanda del molino 1 es de sólo 5 unidades). Con esto la columna 1 se debe tachar (lo hemos marcado con color amarillo) y se procede a calcular las nuevas penalizaciones como se aprecia a continuación:
metodo-de-vogel
Ahora la penalización máxima es $9 ($11-$2) lo cual se alcanza en la fila 1. En consecuencia se asigna la máxima cantidad posible a la variable x_{12}, con lo que se obtiene x_{12}=15, y al mismo tiempo se satisfacen tanto la fila 1 como la columna 2. En forma arbitraria se tacha la columna 2 y se ajusta a cero la oferta en la fila 1.
Al continuar de la misma forma, ahora la fila 2 es la que produce la máxima penalización correspondiente a $11 ($20-$9), por tanto se asigna x_{23}=15, con lo que se tacha la columna 3 y quedan 10 unidades en la fila 2. Sólo queda la columna 4 y tiene 15 unidades de oferta positiva. Al aplicar el Método del Costo Mínimo a esa columna, se asigna de forma sucesiva x_{14}=0, x_{34}=5, x_{24}=10  (se recomienda verificar dichos resultados). Notar adicionalmente que hay otras soluciones posibles que dependen de cómo se rompen los empates.
El valor de la función objetivo asociado a esta solución factible inicial es Z=15(2)+0(11)+15(9)+10(20)+5(4)+5(18)=$475 que es similar a lo alcanzado por el Método del Costo Mínimo, no obstante, en general el Método de Aproximación de Vogel reporta mejor solución de inicio.

domingo, 6 de octubre de 2019

Método Transporte

Método Transporte

En general los problemas de transporte se ocupan (en forma literal o imaginaria) de la
distribución desde cualquier grupo de centros de suministro,    llamados orígenes, a
cualquier grupo de centros de recepción, llamados destinos, de modo que se minimice el
costo total de distribución.

Suposición de requerimientos: cada origen tiene un suministro fijo de unidades, donde
este suministro completo tiene que distribuirse entre los destinos. De manera similar,
cada destino tiene una demanda fija de unidades, donde esta demanda completa tiene
que recibirse desde los orígenes.

Propiedades de soluciones factibles: un problema de transporte tendrá soluciones
factibles si y sólo la suma de sus recursos es igual a la suma de sus demandas (equilibrio
entre suministro total de todos los orígenes y la demanda total de todos los destinos).
En algunos problemas reales, los recursos en realidad representan cantidades máximas
(y no cantidades fijas) para distribuir.

Suposición de costo : el costo de distribuir unidades de cualquier origen a cualquier
destino dado es directamente proporcional al número de unidades distribuidas. Por lo
tanto, este costo es justo el costo unitario de distribución por el número de unidades
distribuidas.

El modelo: cualquier problema (involucre o no transporte) se ajusta al modelo de un
problema de transporte si se puede describir por completo en términos de una tabla de
parámetros (origen-destino: costos, recursos, demanda) y satisface tanto la suposición
de requerimientos como la suposición de costo. El objetivo es minimizar el costo total
de distribuir las unidades. Todos lo parámetros del modelo están incluidos en la tabla de
parámetros.

¡ Se requiere solo llenar una tabla de parámetros para formular el problema de
transporte. !
Ejemplo :
La compañía X produce su producto líder en tres fábricas diferentes, los cuales se
envían por camión a cuatro bodegas de distribución las cuales se encargan de su venta.
La producción por fábrica es la siguiente (se utiliza como unidad de medida – camiones
de producto):


Fábrica     Producción
1               75 camiones
2              125 camiones
3              100 camiones
Total         300 camiones


La capacidad de cada bodega es la siguiente (se utiliza como unidad de medida –
camiones de producto):

Bodega    Capacidad
1               80 camiones
2               65 camiones
3               70 camiones
4               85 camiones
Total         300 camiones

Los costos asociados a enviar productos desde las diferentes fabricas a las bodegas, es el
siguiente:




La empresa actualmente utiliza el siguiente plan, donde se muestra la cantidad de
camiones que envía de cada fábrica a cada bodega



Este plan genera el siguiente costo de envío: $ 165.595
75 ($464) + 5 ($352) + 65 ($416) + 55 ($690) + 15 ($388) + 85 ($685)
La empresa desea conocer si existe un plan de envío diferente al de uso actual, el
cual permita minimizar el costo total.

Formulación del problema en términos de programación lineal
Se necesita identificar las actividades y los requerimientos de este problema para
formularlo como un problema de programación lineal. En este caso se han mencionado
dos tipos de actividades – la producción de un nuevo producto en las dos fábricas y el
envío de los productos a través de varias rutas.

Sin embargo, se conocen las cantidades específicas que debe producir cada fábrica, de
modo que no se requiere tomar decisiones sobre las actividades de producción. La toma
de decisiones se ocupa de los niveles de las actividades de envío, cuánto enviar a través
de cada ruta.

Se utilizará las variables Fi, para identificar la fábrica i (i desde 1 hasta 3), y la variable
Bj para identificar la bodega j (j desde 1 hasta 4).

E(F1-B1): Cantidad de unidades enviadas desde la F1 hasta la B1
E(F1-B2): Cantidad de unidades enviadas desde la F1 hasta la B2
E(F1-B3): Cantidad de unidades enviadas desde la F1 hasta la B3
E(F1-B4): Cantidad de unidades enviadas desde la F1 hasta la B4
E(F2-B1): Cantidad de unidades enviadas desde la F2 hasta la B1
E(F2-B2): Cantidad de unidades enviadas desde la F2 hasta la B2
E(F2-B3): Cantidad de unidades enviadas desde la F2 hasta la B3
E(F2-B4): Cantidad de unidades enviadas desde la F2 hasta la B4
E(F3-B1): Cantidad de unidades enviadas desde la F3 hasta la B1
E(F3-B2): Cantidad de unidades enviadas desde la F3 hasta la B2
E(F3-B3): Cantidad de unidades enviadas desde la F3 hasta la B3
E(F3-B4): Cantidad de unidades enviadas desde la F3 hasta la B4




Minimizar Costo = costo total de enviar los productos
Costo = 464*E(F1- B1) + 352*E(F2-B1) + 995*E(F3-B1) + 513*E(F1-B2) + 416*E(F2-B2) +
682*E(F3-B2) + 654*E(F1-B3) + 690*E(F2-B3) + 388*E(F3-B3) + 867*E(F1-B4) + 791*E(F2-B4)
+ 685*E(F3-B4)

Sujeta a las siguientes restricciones:
1. Restricciones de requerimientos fijos:
E(F1-B1) + E(F1 - B2) + E(F1-B3) + E(F1 -B4) = 75
E(F2-B1) + E(F2 - B2) + E(F2-B3) + E(F2 -B4) = 125
E(F3-B1) + E(F3 - B2) + E(F3-B3) + E(F3 -B4) = 100
E(F1-B1) + E(F2 - B1) + E(F3-B1) = 80
E(F1-B2) + E(F2 - B2) + E(F3-B2) = 65
E(F1-B3) + E(F2 - B3) + E(F3-B3) = 70
E(F1-B4) + E(F2 - B4) + E(F3-B4) = 85

2. Restricciones de no negatividad:
E(F1-B1), E(F1-B2), E(F1-B3), E(F1-B4), E(F2-B1), E(F2- B2), E(F2-B3), E(F2 -B4), E(F3-B1), E(F3-B2),
E(F3-B3), E(F3-B4) >= 0
B1 B2 B3 B4 Producción
F1 0 20 0 55 75 = 75
F2 80 45 0 0 125 = 125
F3 0 0 70 30 100 = 100
Total 80 65 70 85 152.535
Capacidad 80 65 70 85


Video Explicación: