Está en la página 1de 38

5.

PROGRAMACIÓN DINAMICA

5ª CAPITULO.
Fuente:
Integer Programming.
Laurence A. Wolsey
Se preguntará usted ¿qué relación tiene la programación dinámica con la programación
entera?
Pues bien, en esta clase se darán algunos ejemplos de como ciertos problemas de
programación entera y combinatorios pueden ser resueltos a través de la programación
dinámica.
Es en general factible utilizarla para problemas combinatorios más que para los problemas
enteros.
 
Considere el problema de la ruta más corta. Dado un Grafo dirigido D=(V,A) con distancias de
los arcos no negativas para , y un nodo inicial , el problema es encontrar la ruta más corta
desde s a cualquier nodo

p t
s
p t
s

Observación 5.1: Si la ruta más corta de s a t pasa por el nodo p, entonces las rutas
(s,p) y (p,t) son las rutas más cortas de s a p y de p a t respectivamente.

 Observación 5.2: Sea la longitud de la ruta más corta de s a v. Entonces:

  (𝑣 )= 𝑚 𝑖𝑛
𝑑 { 𝑑 ( 𝑖 )  + 𝑐𝑖𝑣 } (5.1)
𝑖∈ 𝑉 − 𝑣

d(v) denota entonces que si encuentro la distancia más corta para ir de s a i (donde i
es un vecino predecesor de v), entonces puedo encontrar la ruta más corta de s a v.
Note que este es un dígrafo
acíclico ya que una vez se pase
por un nodo (cualquiera) no es
posible pasar de nuevo por él.
Esto para todos los nodos.

 
Observación 5.3: Dado un dígrafo acíclico, D=(V,A) con cardinalidad n = , , donde los
nodos están ordenados de forma que i<j, para todos los arcos (i,j) , entonces para el
problema de encontrar la ruta más corta del nodo 1 a todos los otros nodos, la
recurrencia (5.1) para v=2,…..,n lleva a un algoritmo de Orden (m): O(m).

El problema de la recurrencia (5.1) anterior es que sólo sirve para resolver dígrafos
acíclicos. Por lo que es bueno tener una recurrencia que proporcionara un algoritmo
más general
 
Para el caso en que se tenga un dígrafo arbitrario (ya sea ordenado, desordenado o
cíclico) con pesos no negativos , es necesario imponerles un orden de alguna manera.
Esto se puede hacer definiendo un algoritmo más general. Sea la función la longitud
del camino más corto de s a i que contiene máximo k arcos. Entonces la recurrencia es
como sigue:

 
Sean: la distancia a j en máximo k pasos y la distancia a j en k pasos exactos,
entonces = min(,…, , )
(5.3)

𝑚 𝑖𝑛
 𝐷 ( 𝑗 ) =min 𝐷
𝑘 {𝑘 −1 ( 𝑗 ) ,
𝑖 ∈ 𝑣 −( 𝑗)
[ 𝐷𝑘 − 1 ( 𝑖 ) +𝑐 𝑖𝑗 ] }

 
Entonces incrementando k desde 1 hasta n-1, y calculando cada vez para todo j por la
recursión se obtiene un algoritmo de orden m*n O(mn) y .
Principios de la Programación Dinámica.
Un problema se debe poder partir en etapas (o pasos).

En cada etapa se realizan cálculos para ciertos elementos o nodos denominados estados.

Las etapas se pueden ordenar y se relacionan unas con otras por medio de una relación
de recursión (relación recursiva).

Se aplica el principio de optimalidad de Bellman (1957):


Partes de una solución óptima son óptimas y el óptimo para un estado en una etapa
depende del estado y no de la forma como se llega al estado.

Se resuelven numerosos problemas hipotéticos, muchos de ellos innecesarios


Ejemplo 1. Aplicación de la recurrencia (5.3)
Considere el siguiente digrafo arbitrario :
1
4
9

3 3
0

2 2
2

Se va a encontrar la ruta más corta para ir de s=0 a j= 3.


Inicialización
 0
D0 (2) = ∞
D0 (3) = ∞
1
4
9

3 3
0

2 2
2
1. Para k=1  Vamos a variar empezando con j=1, =(0,3)

 = min(∞, min(D0(0)+c01, D0(3)+c31) )

  = min(∞,min(0+9, ∞+ 4) = 9
Formas de llegar al nodo 1 desde
  =9 s=0 con máximo un Arco
 
NOTA: = es cero; es decir que la distancia del Esto es para aclarar que no se puede
nodo s=0 al nodo i=0 en cero pasos (arcos) es 0 variar la i arbitrariamente sino que en
. cero arcos sólo es posible llegar a algún
Note que = = 0 nodo i desde el mismo nodo i.

La única forma de llegar a i desde s en cero arcos es que s=i, lo que tiene un peso de
cero porque es el mismo nodo.
1
4
9

3 3
0

2 2
2
1. Para k=1  con j=2, =(0,1)

  = min(∞, min(D0(0)+c02, D0(1)+c12) )

  = min(∞,min(0+2, ∞+ 3) = 2

 con j=3, =(1,2)


1. Para k=1
 = min(∞, min(D0(1)+c13, D0(2)+c23) )

  = min(∞,min(∞+4, ∞+ 2) = ∞
En resumen hasta ahora:
 0
D0(1) = ∞
D0 (2) = ∞
D0 (3) = ∞
0
D1(1) = 9
D1 (2 ) = 2
D1 (3) = ∞
1
4
9

3 3
0

2 2
Con máximo dos arcos, 2
se puede ir desde s=0
2. Para k=2 hasta: 1, 2, 3

 con j=1, =(0,3)


  = min(9, min(D1(0)+c01, D1(3)+c31) )

  (9, min(0+9,∞+4) = 9
  con j=2, =(0,1)
 = min(2, min(D1(0)+c02, D1(1)+c12) )

  (2, min(0+2,9+3) = 2

  con j=3, =(1,2)


 = min(∞, min(D1(1)+c13, D1(2)+c23) )

  (∞, min(9+4,2+2) = 4
En resumen hasta ahora:
 0
D0(1) = ∞
D0 (2) = ∞
D0 (3) = ∞
0
D1(1) = 9
D1 (2) = 2
D1 (3) = ∞
0
D2(1) = 9
D2 (2) = 2
D2 (3) = 4
1
4
9

3 3
0

2 2
3. Para k=3 2

  con j=1, =(0,3)


 = min(9, min(D2(0)+c01, D2(3)+c31) )

  (9, min(0+9,4+4) = 8

  con j=2, =(0,1)


 = min(2, min(D2(0)+c02, D2(1)+c12) )

  (2, min(0+2,9+3) = 2

  con j=3, =(1,2)


 = min(4, min(D2(1)+c13, D2(2)+c23) )

  (4, min(9+4,2+2) = 4
En resumen hasta ahora: resultado final
 0
D0(1) = ∞
D0 (2) = ∞
D0 (3) = ∞
0
D1(1) = 9
D1 (2) = 2
D1 (3) = ∞
0
D2(1) = 9
D2 (2) = 2
D2 (3) = 4
0
D3(1) = 8
D3 (2) = 2
D3 (3) = 4
El Problema de Tamaño del Lote Económico con capacidades de producción y
de almacenamiento ilimitadas (Uncapacitated Lot Sizing)

Este problema fue Ilustrado en la clase 1 y en él se trata de encontrar un plan de


producción de mínimo costo total que satisfaga todas las demanda positivas d t dados
unos costos de producción pt, de almacenamiento ht y de preparación ft, donde xt denota
la producción en el periodo t y st el inventario al final del período t para t = 1,…,n.

𝑛 𝑛 𝑛
 
𝑚𝑖𝑛 ∑ 𝑝𝑡 𝑥 𝑡 + ∑ h𝑡 𝑠 𝑡 + ∑ 𝑓 𝑡 𝑦 𝑡
𝑡=1 𝑡 =1 𝑡 =1

  para t=1,…,n.
  para t=1,…,n.
  , para t=1,…,n.
Este problema se puede representar como un problema de flujo en redes:

x1
x2 x3 x4 x5

1 2 3 4 5
S1 S2 S3 S4

d1 d2 d3 d4 d5

Se produce a través del arco (0,t) para alimentar el nodo t, de donde sale lo que se
demanda en el periodo t y queda un sobrante de lo que no se vendió, que va a venir a
ser el inventario para el siguiente periodo, es decir que va a alimentar el nodo
siguiente.
0

x1
x2 x3 x4 x5

1 2 3 4 5
S1 S2 S3 S4

d1 d2 d3 d4 d5

Propiedades Estructurales Importantes desde el Punto de Vista de


Redes.

 Proposición 5.1 Existe Una solución óptima con (solamente se produce cuando el
Inventario es cero).
Existe una solución óptima tal que si = para algún k0. (si se produce en t, la cantidad
producida satisface exactamente la demanda para los periodos t hasta t+k).
 Denotemos la suma de las demandas para los periodos i hasta t,

  Continuación se busca eliminar el de la función objetivo, para obtener una expresión


A
más fácil que permita definir una relación de recurrencia sencilla para el problema de Lot
Sizing (tamaño del lote) visto como un problema de flujo en redes.

 
Observación 5.4 Como entonces la variable de inventarios se puede eliminar de la FO
de la siguiente manera:

donde ya que: Término


constante
= p1x1+h1x1+p2x2+h2(x1+x2)+p3x3+h3 (x1+x2+x3)+…

=(p1+h1+h2+h3+…+hn)x1+(p2+h2+h3+…+hn)x2+…+(p3+h3+…+hn)xn
Así la función de costos queda reducida y se puede expresar como sigue:

  Z= +
  H(k) el costo mínimo de una solución para los periodos 1,……,k. Si tk es el último
Sea
periodo en el que se produce (, entonces queremos saber que pasa en los periodos 1,
…..,t-1?. Note que la solución de mínimo costo H(k) debe ser óptima para los periodos 1,
…….,t-1, y por tanto tiene un costo de H(t-1).

Esto da la siguiente Recursión hacia adelante


  𝒎 𝒊𝒏
𝑯 ( 𝒌 )= ={ 𝑯 (𝒕 − 𝟏) } +𝒇 𝒕 +𝒄 𝒕 𝒅 𝒕𝒌
𝟏≤ 𝒕 ≤ 𝒌
Con H(0)=0
Esto da la siguiente recursión hacia adelante
  𝒎 𝒊𝒏
𝑯 ( 𝒌 )= ={ 𝑯 (𝒕 − 𝟏) } +𝒇 𝒕 +𝒄 𝒕 𝒅 𝒕𝒌
𝟏≤ 𝒕 ≤ 𝒌
Con H(0)=0

 
Calculando H(k) para k=1,…….,n, se llega al valor óptimo H(n) para el problema ULS
(Uncapacitated Lot Sizing Problem). Al devolverse se puede encontrar la solución
óptima (el valor de las variables). Los cálculos para este problema son de O(
Ejemplo 5.1.
Considere Una Instancia de ULS con n=4, d=(2,4,5,1), p=(3,3,3,3), h=(1,2,1,1), y
f=(12,20,16,8).
  K= 1 2 3 4
Cálculos iniciales: K 1 2 3 4 t= 1 2 6 11 12
f 12 20 16 8 dtk = 2 - 4 9 10
p 3 3 3 3 1≤t≤k 3 - - 5 6
h 1 2 1 1 4 - - - 1
c 8 7 5 4
= +++
= 1*2 + 2*6 + 1*11 + 1*12 = 37

H(1) = min (0+12+8*2) = 28
H(2) = min (0+12+8*6, 28+20+7*4 = min (60, 76) = 60
H(3) = min (0+12+8*11, 28+20+7*9, 60+16+5*5) = min (100, 111, 101) = 100
H(4)= min (0+12+8*12, 28+20+7*10, 60+16+5*6, 100+8+4*1) = min (108, 118, 106, 112) = 106
Solución hacia atrás: H(4)=106 f3=1, x3=6, y3=1
H(2)=60 f1=1, x1=6, y1=1

Solución: x = (6, 0, 6 , 0) y = (1, 0, 1, 0) s = (4, 0, 1, 0)


Z óptimo = 106 – K = 106 – 37 = 69
  EL valor de z óptimo es 106 - K = 106 – 37 = 69

Solución: x = (6, 0, 6 , 0) y = (1, 0, 1, 0) s = (4, 0, 1, 0)


p =(3, 3, 3, 3) f = (12,20,16,8) h= (1, 2 ,1, 1)

Otra forma de obtener el valor de la función objetivo con los datos iniciales:
= p1*x1+ p3*x3 + h1*s1 + h3*s3 + f1*y1+ f3*y3
= 3*6 + 3*6 + 1*4 + 1*1 + 12*1 +16* 1
= 18 + 18 + 4 + 1 + 12 + 16
= 69
 ULS visto como un Problema de la Ruta Más Corta

Considere un grafo dirigido con nodos (0, 1, 2…, n) y arcos (i,j) para todo i<j.
El costo del arco (i, j): eij es el costo de producir desde el período i+1 hasta el j =

e01 = 12+3*2=18
e02 = 12+3*(2+4)+(1*4) = 34
e03 = 12+3*(2+4+5)+1*9+2*5 = 64
e04 = 12+3*(2+4+5+1)+1*10+2*6+1*1 = 71
e12 = 20+3*4 = 32
e13 = 20+3*(4+5)+2*5 = 57
e14 = 20+3*(4+5+1)+2*6+1*1 = 63
e23 = 16+3*5 = 31
e24 = 16+3*(5+1)+1*1 = 35
e34 = 8 +3*1 = 11
ULS visto como un Problema del Camino Más Corto

71

64
34 35

0 1 2 3 4
18 32 31 11

57

63
Observemos que H(k) es el costo de la ruta más corta de los nodos 0 a k, y como el grafo
dirigido es acíclico, se sabe de la observación 5.3. que el correspondiente algoritmo de la
ruta más corta es O(m).
UN SUB-ÁRBOL ÓPTIMO DE UN ÁRBOL

  problema del sub-árbol óptimo de un árbol incluye un árbol con una raíz r y
El
pesos . El problema es escoger un sub-árbol de con raíz en r de máximo peso, o el
árbol vacío si no hay un sub-árbol con peso positivo que tenga raíz.

Notación para describir la recursión de programación dinámica

 
-Para cada árbol con raíz, cada nodo tiene un predecesor bien definido en el único
camino de la raíz a y para cada .

-Sea el conjunto de sucesores inmediatos .

-Sea el sub-árbol de, con raíz en que contiene todos los nodos para los cuales el
camino de a contiene a

-Para cualquier nodo de sea el valor de la solución óptima del problema del sub-árbol
con raíz definido en el árbol con el nodo como raíz.
Si el sub-árbol óptimo es vacío, claramente . De otra manera el sub-árbol óptimo contiene
También puede contener los sub-árboles de con raíz en para .
Por el principio de optimalidad, estos sub-árboles deben ellos mismos ser
subárboles óptimos con raíz. Por tanto se obtiene la siguiente recursión:

𝐻
 
( 𝑣 )=𝑚𝑎𝑥 0,𝑐 𝑣 + ∑ 𝐻 (𝑤 )
{ 𝑤 ∈𝑠 (𝑣) }
 
Para inicializar la recursión, se debe empezar por las hojas (nodos que no tienen
sucesores)
Para cada hoja .

Los cálculos se llevan a cabo, trabajando desde las hojas hasta la raíz, hasta que el
optimo sea encontrado.

La solución se encuentre trabajando hacia atrás eliminando cada sub-árbol


encontrado con

El Algoritmo es de orden n O(n), ya que los términos y ocurren sólo una vez durante
los cálculos de recursión.
 Ejemplo 5.2 Sea la instancia del problema del subárbol óptimo de un árbol mostrado
en la siguiente figura. con raíz

El problema es encontrar un sub-


-2 árbol tal que se halle el max valor
1 en la función objetivo.

2 -8
2 3

-1 -6 -1 -1 2
4 5 6 7 8

9 10 11 12 13
5 3 -2 3 3
-2
1

2 -8
2 3

-1 -6 -1 -1 2
4 5 6 7 8

9 10 11 12 13
5 3 -2 3 3
Empezando
  con los nodos hoja,
  Recuerde que
Trabajando Hacia adentro,
Y

Note que los valores de para todos los sucesores de los nodos 2 y 3 son conocidos y por
tanto .
Finalmente
 
Descartando los sub-árboles , y queda el sub-árbol óptimo con nodos
1,2,5,9,10 de valor
-2
1 Sub-árbol óptimo

2 -8
2 3

-1 -6 -1 -1 2
4 5 6 7 8

9 10 11 12 13
5 3 -2 3 3
5.4. Problema binario de la Mochila

Mientras problemas como el ULS (Uncapacitated lot sizing problem) y el problema del
subárbol óptimo tienen la propiedad de optimización eficiente, los problemas de la
mochila son en general más difíciles.

La programación dinámica proporciona un enfoque efectivo para esta clase de


problemas; siempre y cuando el tamaño de los datos sea restringido.

5.4.1 Problemas 0-1 de la Mochila

Primero considere el problema 0-1 de la mochila:


 
 
 𝑥 ∈ 𝐵 𝑛
 Donde y son enteros positivos.
  se piensa que el lado derecho es λ, y este λ toma valores de 0,1…,b (0) como el
Si
estado, y el conjunto de variables representadas por como la etapa, entonces esto
conduce a definir el problema y la función de valor óptimo como sigue:

     
Esto equivale a tomar una parte de los
  artículos y definir una capacidad para ellos.

 𝑥 ∈ 𝐵 𝑟
 Entonces da el valor óptimo del problema de la mochila. Por tanto es necesario definir
una recursión que permita calcular en términos de los valores de para y .

  la solución óptima para el problema con valor se pueden decir dos cosas;
De
que ó

  Si , entonces por el mismo argumento de optimalidad usado en los caminos más


(i)
cortos,

  (ii) Si entonces
Entonces se llega a la recursión:

 
 
Ahora, al comenzar la recursión con para o alternativamente con para y para ,
entonces use la recursión para calcular sucesivamente

Ahora la pregunta es: Cómo encontrar una solución óptima asociada?


 
Existen dos opciones relacionadas que ayudan a saber como encontrar una solución
óptima asociada. En estos dos casos se itera hacia atrás del valor óptimo ; se deben
mantener todos los valores , o un indicador el cual es 0 si y 1 de otra manera.

•  Si entonces como , se establece y se continúa buscando una solución óptima de


valor .

 • Si entonces como , se establece y entonces se busca una solución óptima de valor .

Iterando n veces permite encontrar una solución óptima.


 
Contando el número de cálculos requeridos para llegar a , se puede ver que para cada
calculo para y hay un número constante de adiciones, sustracciones, y
comparaciones. Calcular la solución óptima requiere como máximo la misma cantidad
de trabajo. Por tanto el algoritmo PD (programación dinámica) es .

Ejemplo 5.3. Considere la instancia 0-1 de la mochila:


 𝑧=max 10 𝑥 1+7 𝑥 2+ 25 𝑥 3 +24 𝑥 4

2  𝑥 1 +1 𝑥 2 +6 𝑥3 +5 𝑥 4 ≤7
 𝑥 ∈ 𝐵 4

 Los valores y se muestran en la tabla 5.1.


.
  valores de se calculan por la fórmula descrita anteriormente:
Los
(). La siguiente columna es entonces calculada desde arriba hacia abajo usando la
recursión.
Por ejemplo y como el segundo término de la maximización da el valor de , se establece
el valor óptimo
 ( c1=10, c2=7, c3=25, c4=24
a1= 2, a2=1, a3= 6, a4= 5
r λ
2 1 f2(1) = max(f1(1), 7+f1(1-1) = max( 0, 7+0) = 7
2 2 f2(2) = max(f1(2), 7+f1(2-1) = max(10, 7+0 ) = 10
2 3 f2(3) = max(f1(3), 7+f1(3-1) = max(10, 7+10 ) = 17
2 4 f2(4) = max(f1(4), 7+f1(4-1) = max(10, 7+10 ) = 17
2 5 f2(5) = max(f1(5), 7+f1(5-1) = max(10, 7+10 ) = 17
2 6 f2(6) = max(f1(6), 7+f1(6-1) = max(10, 7+10 ) = 17
2 7 f2(7) = max(f1(7), 7+f1(7-1) = max(10, 7+10 ) = 17
3 1 f3(1) = max(f2(1), 25+f2(1-6) = max( 7, -) = 7
3 2 f3(2) = max(f2(2), 25+f2(2-6) = max(10, - ) = 10
3 3 f3(3) = max(f2(3), 25+f2(3-6) = max(17, - ) = 17
3 4 f3(4) = max(f2(4), 25+f2(4-6) = max(17, - ) = 17
3 5 f3(5) = max(f2(5), 25+f2(5-6) = max(17, - ) = 17
3 6 f3(6) = max(f2(6), 25+f2(6-6) = max(17, 25 ) =25
3 7 f3(7) = max(f2(7), 25+f2(7-6) = max(17, 25+ 7) = 32
4 1 f4(1) = max(f3(1), 24+f3(1-5) = max(7, -) = 7
4 2 f4(2) = max(f3(2), 24+f3(2-5) = max(10, - ) = 10
4 3 f4(3) = max(f3(3), 24+f3(3-5) = max(17, - ) = 17
4 4 f4(4) = max(f3(4), 24+f3(4-5) = max(17, - ) = 17
4 5 f4(5) = max(f3(5), 24+f3(5-5) = max(17, 24+0 ) = 24
4 6 f (6) = max(f (6), 24+f (6-5) = max(25, 24+7 ) = 31
 
Solución
Trabajando hacia atrás por tanto

y por tanto Entonces es una solución óptima.


Referencias

[1] Wolsey, Laurence A. Integer Programing, Chap-1,

[2] Nadjib Brahimi , Stephane Dauzere-Peres, Najib M. Najid & Atle Nordli. Single Item
Lot Sizing Problems, European Journal of Operation Research, 168 (2006) 1-16

También podría gustarte