Programación dinámica
99
4 Programación dinámica
4.1 Programación dinámica
La programación dinámica consiste en una técnica que permite determinar de manera eficiente las decisiones que optimizan el comportamiento de un sistema que evoluciona a lo largo de una serie de etapas. En otras palabras, trata de encontrar la secuencia de decisiones que optimiza el comportamiento de un proceso polietápico. La naturaleza del razonamiento que se debe realizar en programación dinámica es muy diferente al de la programación lineal. En programación lineal, intenta describir una determinada situación en términos de un modelo matemático determinado; una vez conocida la naturaleza de las variables de decisión, y expresadas la función objetivo y las restricciones en función de esas variables, la resolución del modelo puede confiarse, sin mayores problemas, a un programa informático. La programación dinámica no admite una resolución sistemática de este tipo; más que un modelo concreto, es una estrategia de resolución común a muchas situaciones en principio diferentes entre sí. Además, es frecuente que la resolución del modelo esté muy relacionada con la situación que se ha de modelizar. En contrapartida, las simplificaciones que en ocasiones deben realizarse en programación lineal para poder resolver el modelo no son necesarias en programación dinámica, que admite gran variedad de relaciones entre variables. La estrategia seguida en este módulo para introducir al lector a la programación dinámica, compartida por otros autores que se han enfrentado a esta situación, consiste en comenzar con una introducción teórica que describe las características de los procesos que pueden ser representados por programación dinámica: los procesos polietápicos i ntroducen los elementos comunes polietápicos de decisión. A continuación, se introducen a cualquier modelo de programación dinámica: las etapas, los estados, las variables de decisión y la función de recurrencia recurrencia. Finalmente se muestran los diversos tipos de programación dinámica existentes:
•
Programación dinámica no homogénea, frente a programación dinámica homogénea en el tiempo. Para este último caso, podremos plantearnos encontrar la solución para horizonte finito o para horizonte infinito.
•
Programación dinámica determinista, frente a programación dinámica aleatoria. En este caso, es interesante destacar que las cadenas de Markov con remuneración y decisión son un caso particular de programación dinámica aleatoria homogénea en el tiempo.
Estos tipos de programación dinámica se introducirán mediante ejemplos, que esperamos que ayuden al lector a internalizar la lógica de la programación dinámica.
Métodos cuantitativos cuantitativos de organización organización industrial II
100
4.2 Procresos polietápicos de decisión
Las situaciones susceptibles de ser representadas mediante programación dinámica pueden describirse como procesos polietápicos de decisión. Seguidamente se exponen algunas características propias de este tipo de procesos. El problema puede dividirse en etapas. En cada una de esas etapas, debe tomarse una decisión. Tendremos la solución del problema cuando conozcamos la decisión óptima para cualquier situación que pueda presentarse presentarse en la evolución del sistema. La programación dinámica va asociada a situaciones de evolución de un sistema que va evolucionando a lo largo de varias etapas (de ahí su carácter dinámico). En la mayoría de las ocasiones, se tratará de representar el comportamiento de un sistema que evoluciona a lo largo del tiempo. En otros casos, se trata de situaciones en las que las decisiones se toman de manera simultánea en el tiempo, pero en las que se evalúan las decisiones de manera secuencial. Nótese la diferencia con la programación lineal, en las que las decisiones se toman de manera simultánea (aunque en ocasiones representemos sistemas que evolucionan a lo largo del tiempo, como los planes de producción). Al comenzar cada una de las etapas, antes de tomar la decisión, el sistema podrá encontrarse en un estado de los varios posibles para esa etapa. Esto significa que para cada etapa debe definirse un conjunto de estados. El estado debe sintetizar toda la información que debemos conocer de la evolución del sistema en las etapas anteriores. Los estados posibles para una etapa no tienen por qué ser los mismos que para las etapas siguientes (aunque sí deben definirse de la misma manera: los estados aseguran la continuidad entre una y otra etapa) y el número de estados puede ser finito o infinito. Una vez tomada la decisión en el estado correspondiente, el sistema evolucionará hacia alguno de los estados posibles para la etapa siguiente. Por lo tanto, el comportamiento del sistema puede percibirse como una secuencia de decisiones y evoluciones. Dicha evolución puede ser conocida con certeza, una vez tomada la decisión (tendremos una situación de programación dinámica determinista), o bien el sistema puede evolucionar hacia diferentes estados, según una ley de probabilidad conocida (siendo entonces programación dinámica aleatoria). El objetivo de la programación dinámica es de encontrar cuál es la política óptima para cada una de las etapas de la evolución del sistema. La política para una determinada etapa es la decisión óptima en cada uno de los posibles estados del sistema en dicha etapa. Nótese que, para cada etapa, debe definirse una variable de decisión xn. Si el sistema tiene k estados estados en esa etapa, una política será un vector de k componentes, componentes, cuya componente e –sima es el valor de la variable de decisión para el estado e en la etapa n. La esencia de la estrategia de la programación dinámica se expresa mediante el principio de optimalidad: En un modelo de programación dinámica, la política óptima para las etapas que faltan hasta la finalización del proceso es independiente de las políticas adoptadas en las etapas anteriores. Esta propiedad es la esencia de la programación dinámica y tiene dos implicaciones importantes:
Programación dinámica
101
En primer lugar, la evolución futura del sistema a partir de una determinada etapa depende exclusivamente del estado en que nos encontremos en esa etapa. Nótese entonces que todo modelo de programación dinámica debe cumplir la propiedad markoviana: sólo necesitamos conocer la situación del sistema en el momento presente para determinar su evolución en las etapas siguientes. En segundo lugar, un modelo de programación dinámica debe resolverse hacia atrás. Esto admite dos formulaciones, en esencia equivalentes:
• •
Si n son las etapas que ya ha realizado el sistema, conociendo la política óptima para la etapa n + 1, podremos encontrar la política óptima para la etapa n. Si N son son las etapas que faltan para que finalice la evolución del sistema, conociendo la política óptima cuando faltan N – – 1 etapas, podremos encontrar la política óptima para cuando falten N etapas. Esta segunda formulación es especialmente útil para problemas de horizonte infinito. El procedimiento de solución se inicia al encontrar la política óptima para la última etapa.
Esta propiedad tiene que ver con la solución hacia atrás de la que se hablaba en la propiedad anterior. Es conveniente que la solución para la última etapa sea trivial, esto es, que pueda encontrarse sin problemas la decisión óptima para cada uno de los estados de la última etapa. Esto puede lograrse definiendo adecuadamente la función a optimizar. Es frecuente definir la función f N a optimizar en la etapa N como como el valor de dicha función para las N últimas últimas etapas. Para encontrar la política óptima para las etapas anteriores, es necesario definir una relación recursiva para la función a optimizar. Esto significa que, para la etapa n, la función a optimizar ha de poder expresarse en función de alguno de estos elementos: • El estado en que nos encontremos en la etapa n –ésima. • Los valores de la variable de decisión xn posibles para cada estado en. • El óptimo de la función para la etapa n+1, para el estado (o estados) en+1 a que evolucione el sistema después de tomar la decisión xn Para cada uno de los estados, deberemos determinar el valor óptimo de la función (que dependerá exclusivamente del estado del sistema), así como el valor x*n de la variable de decisión que optimiza el comportamiento del sistema para ese estado. Ese valor x*n formará parte de la política óptima para esa etapa. El amplio abanico de posibilidades de la programación dinámica nos obliga, en este momento de la exposición, a emplear una notación imprecisa, y a no poder expresar la ecuación recursiva con propiedad. Al definir los diferentes tipos tipos de programación dinámica, podremos establecer una una notación algo más exacta. Existen muchos problemas que pueden definirse como procesos polietápicos de decisión. Seguidamente se expondrán algunos ejemplos de procesos de este tipo. El lector puede intentar definir las etapas, estados, variables de decisión y función de recurrencia para cada uno de ellos. En la sección siguiente, definiremos los elementos del un modelo de programación dinámica a partir del ejemplo 4.2.a Ejemplo 4.2.a Reparto de recursos a actividade actividadess (A)
La tabla siguiente muestra el rendimiento (en um.) resultante de asignar un determinado número de trabajadores a cuatro actividades:
Métodos cuantitativos cuantitativos de organización organización industrial II
102
Tabla 4.2.a Rendimiento de la asignación de recursos a actividades para el ejemplo 4.2.a
0 1 2 3 4
A
B
C
D
0 3 7 9 15
0 4 8 10 13
0 6 9 12 14
0 5 10 11 11
Sabiendo que contamos con cuatro trabajadores, ¿cuántos trabajadores deberemos asignar a cada campo para que el rendimiento sea óptimo? Ejemplo 4.2.b Catalizador Catalizador (A)
Un determinado proceso químico mejora notablemente su rendimiento si introducimos un catalizador. Dicho catalizador tiene una vida útil máxima de cinco semanas, después de las cuales debe ser reemplazado de inmediato. También es posible reemplazarlo antes, si las condiciones económicas del proceso así lo aconsejan. Efectivamente, a medida que el catalizador envejece, su rendimiento disminuye y aumenta su coste de utilización, según la tabla siguiente: TABLA 4.2.b Rendimiento del catalizador en función de las semanas de funcionamiento para el ejemplo 4.2.b
Semana funcionamiento
Coste (unidades monetarias)
1 2 3 4 5
10 12 18 25 33
Cada vez que se reemplaza el catalizador, se incurre en unos costes adicionales de instalación de 20 um. ¿Cuántas veces deberemos reemplazar el catalizador las primeras cuatro semanas de funcionamiento si al iniciar el proceso instalamos un catalizador nuevo? Ejemplo 4.2.c Planificación Planificación de inventari inventarios os (A)
El precio de venta de un determinado artículo es de 10 €/unidad y la demanda diaria sigue la siguiente ley de probabilidad: Demanda Probabilidad
0 0,4
1 0,3
2 0,2
3 0,1
El coste de posesión de cada unidad en inventario al final de día es de 1 €. Al final de día, tenemos la posibilidad de pedir una cantidad cualquiera a un proveedor que nos la sirve el día siguiente a primera hora de la mañana, con un coste de 2 €/unidad, más 3 € por costes de transporte. ¿Cuántas unidades debemos comprar cada día para maximizar el beneficio esperado?
Programación dinámica
103
4.3 Etapas, estados, variables de decisión y función de recurrencia
La tarea más compleja en programación dinámica es la de definir el modelo. Aunque es difícil dar una sistemática, podemos dar un listado de cuestiones que pueden ayudar a obtener dichos modelos. 4.3.1 Etapas de la evolución del sistema
En primer lugar, debe establecerse la naturaleza de las etapas del proceso. En ocasiones, dichas etapas son el resultado de una evolución natural del modelo a lo largo del tiempo (como en los ejemplos 4.2.b y 4.2.c) y en otras ocasiones estas etapas tienen más que ver con el razonamiento empleado para resolver el problema que con una verdadera evolución temporal del sistema (como en el ejemplo 4.2.a). Para un determinado proceso, podemos plantear su evolución a largo plazo, o bien para un número finito de etapas. En el primer caso, se plantea una situación en la que el número de etapas es infinito (programación dinámica con horizonte infinito), esperando que el sistema converja a una política óptima tras un número determinado de etapas. En el segundo caso, el número de etapas del sistema estará limitado, bien por sus propias características, o porque nos interese conocer su evolución para ese número de etapas (programación dinámica con horizonte finito). El ejemplo 4.2.a debe ser forzosamente de horizonte finito, puesto que sólo tenemos cuatro actividades. Los ejemplos 4.2.b y 4.2.c pueden plantearse como problemas de horizonte finito o de horizonte infinito. Ejemplo 4.3.1.a Reparto de recursos a actividades (B): determinación de las etapas
El problema planteado en el ejemplo 4.2.a es un caso particular de asignación de recursos (trabajadores) a actividades (tareas). El proceso puede realizarse a lo largo de diferentes etapas si vamos asignando trabajadores a las actividades de manera secuencial. Así, podemos definir las etapas del modo siguiente: Primera etapa (n = 1): asignación de trabajadores a la actividad A Primera etapa (n = 2): asignación de trabajadores a la actividad B Primera etapa (n = 3): asignación de trabajadores a la actividad C Primera etapa (n = 4): asignación de trabajadores a la actividad D En este caso, no puede decirse que realmente exista una evolución temporal: la definición de las etapas se trata de una estrategia para resolver el problema. En consecuencia, habría valido cualquier otro orden de asignación (por ejemplo, B C D A en vez del definido A B C D). Ejemplo 4.3.1.b Catalizador (B): determinación de las etapas
El problema planteado en el ejemplo 4.2.b sí que supone una evolución temporal. Como la decisión de cambiar el catalizador debe plantearse al principio de cada semana, de manera natural las etapas serán las semanas de funcionamiento del catalizador. En este caso, podemos plantear el problema para un número determinado de semanas (por ejemplo, para tres meses de funcionamiento o doce semanas) o para un número indeterminado de semanas. En este último caso, tendríamos un problema de horizonte infinito. Los problemas que pueden plantearse como de horizonte infinito admiten dos definiciones de las etapas del sistema. A modo de ejemplo, definiremos las etapas de las dos formas para el problema consistente en determinar la política óptima para 5 semanas:
Métodos cuantitativos de organización industrial II
104
Etapa n = 1: primera semana de funcionamiento del sistema Etapa n = 2: segunda semana de funcionamiento del sistema Etapa n = 3: tercera semana de funcionamiento del sistema Etapa n = 4: cuarta semana de funcionamiento del sistema Etapa n = 5: quinta semana de funcionamiento del sistema
Etapa N = 5: faltan cinco semanas para finalizar Etapa N = 4: faltan cuatro semanas para finalizar Etapa N = 3: faltan tres semanas para finalizar Etapa N = 2: faltan dos semanas para finalizar Etapa N = 1: falta una semana para finalizar
La segunda formulación del problema permite plantear el caso de horizonte infinito: bastará con plantear el problema cuando N tiende a infinito. 4.3.2 Estados del sistema
La variable de estado del sistema (frecuentemente la más difícil de determinar) ha de ser tal que describa la información necesaria para conocer la evolución del sistema desde la primera etapa hasta la etapa actual. La programación dinámica admite múltiples formulaciones de las variables de estado: en cada etapa podemos tener un número finito o infinito de estados y los estados pueden ser los mismos en cada etapa o ser diferentes para cada una de ellas. Ejemplo 4.3.2.a Reparto de recursos a actividades (C): determinación de los estados
En el caso del problema de asignación de recursos a actividades, tenemos que el elemento determinante para saber cuántos trabajadores podemos asignar son los trabajadores disponibles. Esta variable será, entonces, una buena candidata a variable de estado del sistema. De manera que tenemos los estados siguientes: Estado e = 0: Estado e = 1: Estado e = 2: Estado e = 3: Estado e = 4:
no hay ningún trabajador disponible queda un trabajador disponible quedan dos trabajadores disponibles quedan tres trabajadores disponibles los cuatro trabajadores están disponibles
Esta no es la única definición posible de estado. También puede definirse como el número de trabajadores que han sido asignados en etapas anteriores. En cierto modo, se trata de los mismos estados: si se han asignado cuatro trabajadores en etapas anteriores (e’ = 4 según esta nueva definición), no tenemos ningún trabajador por asignar (e = 0 según la definición anterior). Para la etapa n = 1, no hemos asignado ningún trabajador todavía, por lo que nos encontraremos en el estado e = 4. En las otras etapas, podremos encontrarnos en cualquiera de los cinco estados. Ejemplo 4.3.2.b Catalizador (C): determinación de los estados
En el problema del catalizador, la información relevante para tomar la decisión es la edad del catalizador (de la que depende el rendimiento). En particular, nos interesa saber el número de semanas que lleva funcionando el catalizador al principio de la semana, cuando hemos de tomar la decisión. Por tanto, este número de semanas puede ser la definición de los estados. Como para plantearnos la decisión el catalizador ha debido funcionar un cierto tiempo, los estados del sistema para este caso son: Estado e = 1: el catalizador tiene una vida de una semana Estado e = 2: el catalizador tiene una vida de dos semanas Estado e = 3: el catalizador tiene una vida de tres semanas Estado e = 4: el catalizador tiene una vida de cuatro semanas Estado e = 5: el catalizador tiene una vida de cinco semanas
Programación dinámica
105
En este caso, no es necesario plantear estados superiores a seis, puesto que nos vemos obligados a cambiar el catalizador cuando lleva cinco semanas funcionando. 4.3.3 Variables de decisión y políticas
Un elemento fundamental de la programación dinámica es la necesidad de tomar una decisión. Esta decisión debe representarse con una variable de decisión que describa la decisión a tomar. El rango de valores que puede tomar la variable de decisión puede ser diferente para cada uno de los estados del sistema, en función de sus características, y el número de variables de decisión para cada etapa puede ser finito o infinito. Estableceremos una política para una etapa del sistema cuando determinemos el valor de las variables de decisión para cada una de las etapas del sistema. Resolver un modelo de programación dinámica exige hallar, para cada uno de los estados del sistema en cada una de las etapas, el valor óptimo de la variable de decisión. En otras palabras, deberemos obtener la política óptima para cada una de las etapas del sistema. Ejemplo 4.3.3.a Reparto de recursos a actividades (D): determinación de las variables de decisión
Para el problema de asignación de recursos a actividades, la decisión a tomar en cada etapa es claramente cuántos trabajadores podemos asignar a cada actividad. Así, la variable de decisión se definirá para cada etapa n como: xn = trabajadores a asignar a la actividad propia de la etapa n
Dependiendo del estado en que los encontremos, no tendremos disponibles todas las variables de decisión. En la tabla siguiente, tenemos los valores posibles de xn para cada uno de los estados. Recordemos que la variable de estado representa el número de trabajadores disponibles: en consecuencia, no podremos asignar más trabajadores de los que efectivamente tenemos. Tabla 4.3.3.a Variables de estado y de decisión para el ejemplo 4.3.3.a
Valor variable de estado e
e=0 e=1 e=2 e=3 e=4
Valores posibles de la variable de decisión xn
xn = 0 xn = 0, 1 xn = 0, 1, 2 xn = 0, 1, 2, 3 xn = 0, 1, 2, 3, 4
Ejemplo 4.3.3.b Catalizador (D): determinación de las variables de decisión
En este caso, la decisión a tomar puede definirse mediante una variable binaria: cambiar el catalizador (C) o no cambiarlo (N). En este caso, para los estados e = 1, 2, 3 y 4 son posibles los valores N y C de la variable. En el estado e = 5, la única variable posible es C , dado que cuando el catalizador lleva cinco semanas funcionando, es obligatorio cambiarlo. 4.3.4 Función de recurrencia
Se supone que las decisiones que debemos tomar en cada una de las etapas deben conducir a optimizar (hacer máxima o mínima) una determinada función, descriptiva del comportamiento del sistema. A
Métodos cuantitativos de organización industrial II
106
diferencia de la programación lineal, no existen restricciones acerca de la forma de esta función: puede ser lineal, cuadrática, exponencial, pueden multiplicarse variables, etc. Ahora bien, la función a optimizar debe cumplir una condición importante: la función a optimizar debe ser recursiva . Esto significa que el valor de la función a optimizar en la etapa n debe ser función del valor de la función óptima para alguno (o algunos) de los estados en la etapa n+1. En consecuencia, debemos conocer también cómo será la evolución del sistema en la etapa n, para cada una de las combinaciones posibles de variables de estado y de decisión. Ejemplo 4.3.4.a Reparto de recursos a actividades (E): determinación de la función de recurrencia
Para este problema, se trata de maximizar el rendimiento de la asignación global de recursos a las actividades. En este caso, el rendimiento propio de la asignación de la etapa n es función de la variable de decisión xn, por lo que puede representarse como r n(xn). Por otra parte, tal como se han definido los estados y las variables de decisión (ver ejemplos 4.3.2.a y 4.3.3.a), si en la etapa n nos encontramos en el estado en y optamos por un determinado valor de la variable de decisión xn, evolucionamos al estado en – xn. En otras palabras, si tenemos disponibles en trabajadores y decidimos asignar a la actividad xn trabajadores, para la etapa siguiente quedarán disponibles en – xn trabajadores. De este modo, la función de recurrencia será: f n ( en , xn ) = rn ( xn ) + f n*+1 ( en
− xn )
En este caso, f n representa el rendimiento obtenido por la asignación de recursos a actividades desde la etapa n hasta la última etapa. Ejemplo 4.3.4.b Catalizador (E): determinación de la función de recurrencia
En este caso, el rendimiento del catalizador en la etapa considerada dependerá de la decisión de cambiar o no el catalizador y del estado en que nos encontremos. En cualquier caso, tendremos que r n(en, C ) = 30: si cambiamos el catalizador, debemos asumir unos costes de reemplazo de 20 (ver ejemplo 4.2.a), más el coste de funcionamiento para la primera semana. Si no cambiamos el catalizador, entonces deberemos buscar en la tabla 4.2.b los valores de r n(en, N ). En cuanto a la evolución del sistema a la etapa siguiente, dependerá de la variable de decisión: si decidimos cambiar el catalizador, éste será nuevo y en la etapa siguiente llevará una semana funcionando, por lo que el estado del sistema será 1. Si, en cambio, no cambiamos el catalizador, esté se hará una semana más viejo: esto significa que si estábamos en el estado en y no cambiamos el catalizador, en la siguiente etapa pasaremos al estado en +1 . De esta manera, la función de recurrencia para los dos valores de la variable de decisión se definirá como: *
f n ( en , C ) = 30 + f n +1 (1) f n ( en , N ) = rn ( en , N ) + f n*+1 ( en
+ 1)
En este caso, f n representa el rendimiento obtenido por el funcionamiento del catalizador desde la etapa n hasta la última etapa.
Programación dinámica
107
4.4 Tipos de programación dinámica
El lector habrá podido comprobar que la programación dinámica puede admitir gran número de formulaciones y resolver problemas de muy diversa naturaleza. Una clasificación de las diferentes situaciones puede ser de ayuda para explorar, de manera más sistemática, las diferentes posibilidades. En principio, los problemas de programación dinámica pueden clasificarse según dos criterios: su homogeneidad o no homogeneidad, y su carácter determinista o aleatorio. Programación dinámica homogénea y no homogénea
Diremos que un modelo de programación dinámica es homogéneo si presenta la misma estructura para todas las etapas del sistema. Más concretamente:
• • • •
El sistema puede presentar los mismos estados en cualquiera de sus etapas. Los valores posibles de las variables de decisión para cada uno de los estados son las mismas para todas las etapas del sistema. La función a optimizar es la misma para todas las etapas del sistema. La evolución del sistema, para un determinado estado y para un determinado valor de la variable de decisión de los disponibles para dicho estado, es la misma para todas las etapas del sistema.
Una consecuencia de esta definición es que un modelo de programación dinámica homogénea puede evolucionar indefinidamente en el tiempo, esto es, el número posible de etapas es infinito. Entonces podemos plantearnos analizar su evolución para un número infinito de etapas (problema de horizonte infinito) o para un número finito de éstas (problema de horizonte finito). Los ejemplos 4.2.b y 4.2.c reúnen las condiciones necesarias para ser problemas de programación dinámica homogénea. Cuando el modelo no cumple alguna de estas condiciones, tenemos programación dinámica no homogénea. Todos aquellos modelos que tengan un número finito de etapas posibles entrarán dentro de esta categoría. También puede suceder que el número de etapas sea infinito, aunque los problemas de programación dinámica no homogénea suelen ser de horizonte finito. El ejemplo 4.2.a es un caso de programación dinámica no homogénea. Programación dinámica determinista y aleatoria
Esta categoría tiene que ver con la naturaleza de la evolución del sistema, una vez se ha tomado la decisión. Cuando, en una etapa determinada, podemos conocer con certeza la evolución del sistema para un determinado estado y un determinado valor de la variable de decisión, tenemos un modelo de programación dinámica determinista. Para estos modelos, podremos determinar las decisiones que, en cada etapa, dan el valor óptimo de la función de recurrencia. Los ejemplos 4.2.a y 4.2.b son ejemplos de programación dinámica determinista. Si, para una etapa determinada, en un estado cualquiera i, al escoger un determinado valor de la variable de decisión, encontramos que el sistema puede evolucionar hacia diferentes estados j de la siguiente etapa con una probabilidad conocida pij, entonces el modelo es de programación dinámica aleatoria. En este caso, podremos determinar las decisiones que optimicen el valor esperado de la función de recurrencia. El ejemplo 4.2.c es un caso de programación dinámica aleatoria, dado que la demanda sigue una determinada distribución de probabilidad. El cuadro siguiente muestra las posibles situaciones que podemos encontrar en programación dinámica (PD), según esta clasificación:
Métodos cuantitativos de organización industrial II
108
Tabla 4.4.a Tipos de programación dinámica
PD homogénea
PD determinista PD aleatoria
PD no homogénea
PDD homogénea Horizonte finito Horizonte infinito PDA homogénea Horizonte finito Horizonte infinito
PDD no homogénea PDA no homogénea
4.5 Programación dinámica determinista
En la programación dinámica determinista, el estado al que evolucionará el sistema en la etapa n+1 vendrá determinada por el estado en que se encuentra en la etapa n, así como por la decisión tomada. Así, la función objetivo dependerá de:
• •
El estado ei en que se encuentre el sistema en la etapa n. El valor de la variable de decisión xn, representativo de la decisión que se toma en la etapa n. La decisión a tomar puede ser diferente para cada estado ei, por lo que representaremos dicho valor por xn(ei).
Entonces, podremos definir los elementos siguientes: El valor de la función a optimizar en la etapa n, si nos encontramos en el estado ei y se toma la decisión xn(ei): f n ei , xn ( ei )
La contribución a la función objetivo en la etapa n. Esta contribución puede depender del estado del sistema ei y de la variable de decisión xn(ei): c ei , xn ( ei )
El valor óptimo de la función objetivo en la etapa n+1. Como es un modelo determinista, podremos determinar la evolución del sistema con certeza: si nos encontramos en el estado ei y tomamos la decisión xn(ei), deberemos evolucionar necesariamente a algún estado e j: f n +1 ( e j ) *
Si el primer elemento puede ponerse en función de los otros dos, la función objetivo será de tipo recursivo: la función en la etapa n es función del valor de la función de la etapa n+1. Por ejemplo (aunque no necesariamente), la función puede ser de tipo aditivo: Función en la etapa (n) = contribución en la etapa (n) + valor óptimo de la función en la etapa (n+1) f n ei , xn ( ei ) = c ei , xn (ei ) + f n+1 ( e j ) *
A este tipo de función le es aplicable el principio de optimalidad de la programación dinámica: la política óptima para las etapas que faltan hasta la finalización del proceso (n, n+1, n+2, ...) es independiente de las políticas adoptadas en las etapas anteriores. Como conocemos las políticas
Programación dinámica
109
óptimas para n+1 y las siguientes etapas, podremos ahora determinar la política óptima para la etapa n. Efectivamente, para cada uno de los estados ei podemos determinar la decisión óptima: *
{
}
f n ( ei ) = OPT f n ei , xn ( e i ) xn ( ei )
Además de los valores de f n* ( ei ) , también conviene retener los valores de la variable de la decisión para los que se ha encontrado el óptimo xn* ( ei ) . El listado de los valores de la variable de decisión óptimos para cada estado constituirán la política para la etapa n. Como ahora conocemos los valores de f n* ( ei ) , ahora podremos realizar el mismo proceso para la etapa n –1: Función en la etapa (n–1) = contribución en la etapa (n–1) + valor óptimo de la función en la etapa (n) f n −1 ei , xn −1 ( ei ) = c ei , x n−1 (ei ) + f n ( e j ) *
En los problemas de programación dinámica determinista, pueden cumplirse las propiedades siguientes:
• • •
Las variables de decisión propias de cada estado son las mismas para todas las etapas del sistema. La contribución a la función objetivo para la variable de decisión xn y el estado ei se calcula de la misma manera para todas las etapas del sistema. La regla que determina la evolución del estado ei al e j en la transición de una etapa a la siguiente es la misma para todas las etapas.
Cuando esto sucede, tendremos un problema de programación dinámica determinista homogénea en el tiempo. Si no se cumple alguna de las tres condiciones, el problema será de programación dinámica no homogénea. Seguidamente, mostraremos con ejemplos ilustrativos sencillos la operativa de la operación dinámica, centrándonos en primer lugar en la programación dinámica no homogénea, resolviendo el problema planteado en el ejemplo 4.2.a. 4.5.1 Programación dinámica determinista no homogénea
Seguidamente se ilustrará el procedimiento de resolución usado en programación dinámica a través del modelo de programación dinámica no homogénea expuesto en el ejemplo 4.2.a, cuyos elementos se han ido deduciendo a lo largo de la sección 4.3. Ejemplo 4.5.1.a Reparto de recursos a actividades (F): obtención de la solución
Recordemos el planteamiento del problema del ejemplo 4.2.a: La tabla siguiente muestra el rendimiento (en um) resultante de asignar un determinado número de trabajadores a cuatro actividades:
Métodos cuantitativos de organización industrial II
110
Tabla 4.5.1.a Rendimiento de la asignación de recursos a actividades para el ejemplo 4.2.a
0 1 2 3 4
A
B
C
D
0 3 7 9 15
0 4 8 10 13
0 6 9 12 14
0 5 10 11 11
Sabiendo que contamos con cuatro trabajadores, ¿cuántos trabajadores deberemos asignar a cada campo para que el rendimiento sea óptimo?
Si el rendimiento en función de los trabajadores fuera lineal, el problema puede resolverse mediante programación lineal. Por ser no lineal la función objetivo, es aconsejable resolverlo mediante programación dinámica. Recapitulemos cómo se ha ido definiendo el modelo, en los ejemplos 4.3.1.a, 4.3.2.a, 4.3.4.3.a y 4.3.4.a: Definición de las etapas:
Aquí no hay una sucesión temporal clara, puesto que se trata de asignar recursos a actividades. Sin embargo, podemos definir las etapas como sigue: Primera etapa (n = 1): asignación de trabajadores a la actividad A Primera etapa (n = 2): asignación de trabajadores a la actividad B Primera etapa (n = 3): asignación de trabajadores a la actividad C Primera etapa (n = 4): asignación de trabajadores a la actividad D Estados:
La información necesaria para conocer el comportamiento del sistema en el futuro es claro, y determina la naturaleza del estado: para una determinada etapa, el estado del sistema puede definirse como los trabajadores disponibles para ser asignados a esta etapa y las siguientes. De modo que tenemos: Estado e = 0: Estado e = 1: Estado e = 2: Estado e = 3: Estado e = 4:
no hay ningún trabajador disponible queda un trabajador disponible quedan dos trabajadores disponibles quedan tres trabajadores disponibles los cuatro trabajadores están disponibles
Variable de decisión:
La variable de decisión xn se ha definido como los trabajadores que se asignan en la etapa considerada. El valor de la variable de decisión no puede ser más grande que el estado en que nos encontremos (esto es, no podemos asignar más trabajadores de los que disponemos). Esto nos da para el problema una estructura como la que se muestra
Programación dinámica
111
EXPLORACIÓN EXHAUSTIVA: 120 POSIBILIDADES
4
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
ACTIVIDAD A
ACTIVIDAD B
ACTIVIDAD C
0
ACTIVIDAD D
Fig. 4.5.1.a Estados y etapas para el problema del ejemplo 4.2.a
El número de posibles soluciones es finito: en este caso tenemos 120 posibilidades. La programación dinámica permite una exploración de este conjunto de posibilidades más eficiente que su simple enumeración. Como se ha indicado, la estrategia a seguir es resolver el programa hacia atrás: para las etapas 4, 3, 2 y 1 se trata de encontrar la variable de decisión óptima para cada estado. Función de recurrencia: La función f de recurrencia para una etapa n puede definirse como el rendimiento obtenido entre esta etapa y el resto de asignaciones que faltan hasta el final. Por ejemplo, f 2 es el rendimiento obtenido por asignar trabajadores a las actividades B (n = 2), C ( n = 3) y D ( n = 4). Así definida, la función de
recurrencia puede expresarse como: f n ( en , xn ) = rn ( xn ) + f n*+1 ( en
− xn )
La forma de esta función se debe a que, si tengo disponibles en trabajadores en la etapa n, y asigno xn trabajadores en esta etapa, para la etapa n + 1 y las siguientes quedarán disponibles en – xn trabajadores. La función óptima será el máximo para cada estado: f n* ( en ) = MAX { f n ( en , xn )} xn
Con estos elementos, ya puedo iniciar las iteraciones para obtener la solución óptima de este problema: Primera iteración (n = 4, asignación a D)
Dado que el rendimiento obtenido hasta el momento es nulo, tenemos:
Métodos cuantitativos de organización industrial II
112
f 4 ( en , xn ) = rD ( xn )
El número de trabajadores que podamos asignar no podrá ser mayor que los disponibles, que vendrán determinados por el estado en. Así, tendremos la siguiente tabla: Tabla 4.5.1.b Tabla para la etapa n = 4 para la resolución del ejemplo 4.2.a
en
f 4 ( en ,0 )
f 4 ( en ,1)
0 1 2 3 4
0 0 0 0 0
5 5 5 5
f 4 ( en ,2 )
10 10 10
f 4 ( en ,3)
*
f 4 ( en ,4 )
x n*
f 4 ( en )
11
0 1 2 3 3,4
0 5 10 11 11
11 11
Los valores de f 4 ( en , xn ) se han obtenido a partir de la función de utilidad de D, puesto que estamos asignando trabajadores a esta actividad, según la secuencia que hemos establecido al definir las etapas. Ahora, para cada uno de los estados de la etapa 4, conoceremos el valor de la variable de decisión. Podremos encontrar dicho valor en la columna de xn*.
ETAPA n = 4: ASIGNACIÓN A D
4 ACTIVIDAD A
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
ACTIVIDAD B
ACTIVIDAD C
0
ACTIVIDAD D
Fig. 4.5.1.b Política óptima para n = 4 (ejemplo 4.2.a)
Segunda iteración (n = 3, asignación a C)
La función objetivo en la etapa n = 3 es igual a la contribución obtenida al asignar trabajadores a C, más el valor asociado al comportamiento óptimo a partir de n = 4. Por lo tanto, tendremos: f 3 ( en , xn ) = rC ( xn ) + f 4* ( en
− xn )
Programación dinámica
113
Tabla 4.5.1.c Tabla para la etapa n = 3 para la resolución del ejemplo 4.2.a
en
f 3 ( en ,0 )
0 1 2 3 4
0 +0 0+ 5 0 + 10 0 + 11 0 + 11
f 3 ( en ,1)
f 3 ( en ,2 )
6+0 6+5 6 + 10 6 + 11
f 3 ( en ,3)
9+0 9+5 9 + 10
*
f 3 ( en ,4 )
x n*
f 3 ( en )
14 + 0
0 1 1 1 2
0 6 11 16 19
12 + 0 12 + 5
Ahora ya hemos establecido la política óptima para las etapas 3 y 4. Dichas políticas se muestran en la figura 4.5.1.c: ETAPA n = 3: ASIGNACIÓN A C
4
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
ACTIVIDAD A
ACTIVIDAD B
ACTIVIDAD C
0
ACTIVIDAD D
Fig. 4.5.1.c Política óptima para n = 3 (ejemplo 4.2.a)
Tercera iteración (n = 2, asignación a B)
La tercera iteración se produce de la misma manera que la segunda, pero ahora utilizamos la función de utilidad de B: f 2 ( en , xn ) = rB ( xn ) + f 3* ( en
− xn )
De modo que ahora tendremos la siguiente tabla, obtenida como Tabla 4.5.1.d Tabla para la etapa n = 2 para la resolución del ejemplo 4.2.a
en
f 2 ( en ,0 )
0 1 2 3 4
0 +0 0+6 0 + 11 0 + 16 0 + 19
f 2 ( en ,1)
4+0 4+6 4 + 11 4 + 16
f 2 ( en ,2 )
8+0 8+6 8 + 11
f 2 ( en ,3)
10 + 0 10 + 6
*
f 2 ( en ,4 )
x n*
f 2 ( en )
113 + 0
0 0 0 0 1
0 6 11 16 20
Métodos cuantitativos de organización industrial II
114
ETAPA n = 2: ASIGNACIÓN A B
0
0
0
1
1
1
4
2
2
2
3
3
3
4
4
4
ACTIVIDAD A
ACTIVIDAD B
0
ACTIVIDAD C
ACTIVIDAD D
Fig. 4.5.1.d Política óptima para n = 2 (ejemplo 4.2.a)
Cuarta y última iteración (n = 1, asignación a A)
En la última iteración, correspondiente a la primera etapa, está claro que no hemos asignado aún ningún individuo a ninguna actividad, con lo que el único estado posible para el sistema es de 4. Por este motivo, sólo necesitaremos plantear la función de recurrencia para este estado: * f1 ( 4, xn ) = rA ( xn ) + f 2 ( 4 − xn )
Y la tabla tendrá ahora únicamente la fila del estado 4: Tabla 4.5.1.e Tabla para la etapa n = 1 para la resolución del ejemplo 4.2.a
en
f1 ( en ,0 )
4
0 + 20
f1 ( en ,1)
3 + 16
f1 ( en ,3)
f1 ( en ,4 )
x n*
f1 ( en )
7 + 11
9+6
15 + 0
0
20
ETAPA n = 1: A SIGNACIÓN A A
4 ACTIVIDAD A
*
f1 ( en ,2 )
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
ACTIVIDAD B
ACTIVIDAD C
0
ACTIVIDAD D
Fig. 4.5.1.e Política óptima para n = 1 (ejemplo 4.2.a)
Programación dinámica
115
Obtención de la solución
La solución del problema se determina a partir de las tablas, sabiendo a qué estado evolucionamos en cada etapa y, a partir de aquí, seleccionando la decisión óptima para ese estado y determinando el estado al que se evoluciona en la etapa siguiente: En la etapa n = 1, vemos que xn* = 0 (ver Tabla 4.5.1.e). Esto significa que no asignamos ningún trabajador a la actividad A, y que en la etapa n = 2 quedan por asignar 4 trabajadores. Por lo tanto, en la etapa siguiente evolucionaremos al estado 4. En n = 2 nos encontramos en el estado 4: la decisión óptima para ese estado es asignar un trabajador la actividad B (tabla 4.5.1.d), y quedan por asignar tres trabajadores. En n = 3 evolucionaremos al estado 3, la decisión óptima para este estado es asignar un trabajador a la actividad C (tabla 4.5.1.c). Quedan, en consecuencia dos trabajadores por asignar. Y como es lógico, si en n = 4 nos encontramos en el estado 2, asignaremos dos trabajadores a la actividad A (tabla 4.5.1.b). Por otra parte, vemos que f 1* ( 4 ) es igual a 20, que será precisamente el valor máximo del rendimiento conjunto de las cuatro actividades. Así, tendremos: El rendimiento máximo obtenido es de 20, que se obtiene asignando un trabajador a la actividad B, otro a la actividad C y otros dos a la actividad D. No resulta rentable, en estas condiciones, realizar la actividad A.
DETERMINACIÓN DE LA SOLUCIÓN
4 ACTIVIDAD A X*A = 0
0
0
0
1
1
1
2
2
2
3
3
3
4
4
4
ACTIVIDAD B X*B = 1
ACTIVIDAD C X*C = 1
0
ACTIVIDAD D X*D = 2
Fig. 4.5.1.f Obtención del óptimo para el ejemplo 4.2.a
Métodos cuantitativos de organización industrial II
116
4.5.2 Programación dinámica determinista homogénea: horizonte finito
Seguidamente se obtiene la solución del modelo de programación dinámica que se planteó en el ejemplo 4.2.b, y cuyos elementos se definieron en el capítulo 3. La resolución no es sustancialmente diferente del caso anterior: la única diferencia es que la función de recurrencia es la misma para todas las etapas del sistema, por tratarse de programación dinámica homogénea. Ejemplo 4.5.1.a Catalizador (F): resolución problema de horizonte finito
Un determinado proceso químico mejora notablemente su rendimiento si introducimos un catalizador. Dicho catalizador tiene una vida útil máxima de cinco semanas, después de las cuales debe ser reemplazado de inmediato. También es posible reemplazarlo antes, si las condiciones económicas del proceso así lo aconsejan. Efectivamente, a medida que el catalizador envejece, su rendimiento disminuye y aumenta su coste de utilización, según la tabla siguiente: Tabla 4.5.2.a Rendimiento del catalizador en función de las semanas de funcionamiento para el ejemplo 4.2.b
Semana funcionamiento
Coste (unidades monetarias)
1 2 3 4 5
10 12 18 25 33
Cada vez que se reemplaza el catalizador, se incurre en unos costes adicionales de instalación de 20 um. ¿Cuántas veces deberemos reemplazar el catalizador las primeras cuatro semanas de funcionamiento, si al iniciar el proceso instalamos un catalizador nuevo?
Podemos recapitular los razonamientos expuestos a lo largo de la sección 3, en los que se definían las etapas, estados, variables de decisión y función de recurrencia para resolver este problema mediante programación dinámica: Etapas:
Cada semana de funcionamiento del catalizador tendremos una nueva etapa del sistema. Al principio de la semana se toma la decisión (cambiar el catalizador, o no cambiarlo), que determina completamente la evolución del sistema a lo largo de la semana, en cuanto a costes de funcionamiento. Como hemos de determinar el comportamiento del sistema para cuatro semanas, definiremos las etapas como sigue: Etapa n =1: primera semana de funcionamiento Etapa n =2: segunda semana de funcionamiento Etapa n =3: tercera semana de funcionamiento Etapa n =4: cuarta semana de funcionamiento Estados del sistema:
Se trata de una variable que aporte la información necesaria para caracterizar la situación del sistema a la hora de tomar la decisión, en este caso, al principio de la semana. Hemos escogido como variable de estado el número de semanas que lleva funcionando el catalizador al principio de la semana. Dicha variable de estado podrá tomar los valores siguientes:
Programación dinámica
117
1, 2, 3, 4 y 5 (fin de la vida del catalizador).
Nótese que cuando el sistema se encuentra en el estado 5, debe evolucionar necesariamente al estado 1: lo habremos reemplazado necesariamente, y al empezar la siguiente etapa llevará una semana funcionando. Variable de decisión:
En este caso sólo podremos tomar dos decisiones: cambiar en catalizador (C ), o no cambiarlo ( N ). Para cada una de las etapas, la variable de decisión puede tomar los valores siguientes: Tabla 4.5.2.b Variables de decisión para los estados del problema del ejemplo 4.2.b
Estado 1 2 3 4 5
N N N N
C C C C C
Función de recurrencia:
Ahora debemos establecer la función de recurrencia para cada una de las variables de decisión: cambiar el catalizador (C), o no cambiarlo (N): Si cambiamos el catalizador (variable de decisión C ), reemplazamos el viejo por uno nuevo, por lo que incurriremos en un coste de 20 por su reemplazo. Entonces, el catalizador funcionará durante una semana, con un coste de 10. El coste total de funcionamiento será de: 20 + 10 = 30, y al final del proceso llevará una semana funcionando, por lo que el sistema evolucionará hasta el estado 1. La función valdrá: *
f n ( en , C ) = 30 + f n +1 (1)
Donde f n*+1 (1) representa el valor del coste de funcionamiento del sistema desde la etapa n+1 hasta el final de su evolución, si se toman las decisiones óptimas a partir de dicha etapa n+1 y el catalizador actual lleva funcionando una semana. En este caso en = 1, 2, 3, 4 o 5. Si decidimos no cambiar el catalizador (variable de decisión N ), éste aumentará su edad en una semana: esto significa que evolucionaremos del estado en al estado en+1. El valor de la función recursiva será: f n ( en , N ) = rn ( en , N ) + f n*+1 ( en
+ 1)
donde f n*+1 (en + 1) tiene un significado análogo al de f n*+1 (1) en el caso anterior, pero para el estado en+1. El coste c(en ,N) variará con el tiempo, siguiendo una evolución no necesariamente lineal. En este caso, tendremos: Estado c(en ,N)
1
2
3
4
12
18
25
33
Obsérvese que, tal como hemos definido los estados, la evolución del estado 1 al estado 2 es la segunda semana de funcionamiento del catalizador, por lo que el coste asociado a esta transición será
Métodos cuantitativos de organización industrial II
118
de 18, que es el coste de que funcione durante esa semana. Como se ha indicado anteriormente, la opción de no cambiar el catalizador sólo es válida para los estados 1, 2, 3 o 4.
1
1
2
2
3
3
4
4
Cambiar el catalizador
No cambiar el catalizador
5
5
Etapa n
Etapa n +1
Fig. 4.5.2.a Evolución de los estados para el problema del catalizador (problema 4.2.b)
Finalmente, obtendremos los valores óptimos de la función de costes para cada estado, en cada una de las etapas, simplemente comparando las dos alternativas: f n ( en ) = MIN { f n ( en , N ), f n ( en , C )} *
N ,C
Y una vez conocidos los valores óptimos de la variable de decisión para cada uno de los cinco estados, habremos determinado también la política de la etapa n. Los valores de f n* ( en ) obtenidos nos permitirán obtener la política óptima para la etapa n – 1, de la misma manera que la hemos obtenido para n. Ya hemos establecido la operativa para cada una de las etapas. Ahora basta con hacer cuatro iteraciones con este modelo, para determinar el comportamiento óptimo para las cuatro primeras semanas. Política para la etapa n = 4
Es propio de la programación dinámica que la determinación del óptimo para cada uno de los estados del sistema en la primera operación sea sencilla. Efectivamente, tal como hemos definido la función, tenemos: f 4 ( en , C ) = 30 f 4 ( en , N ) = c ( en , N )
Programación dinámica
119
De manera que deberemos comparar los valores de los costes asociados a cambiar y a no cambiar el catalizador para cada estado, tal como se muestra en la tabla 4.5.2.b Tabla 4.5.2.b Determinación de la política óptima para n = 4 para el problema del ejemplo 4.2.b
Estado
f 4 ( en , N )
f 4 ( en , C )
xn*
f 4* ( en )
1 2 3 4 5
12 18 25 33 -
30 30 30 30 30
N N N C C
12 18 25 30 30
En la segunda columna encontramos los resultados de la decisión N (no cambiar el catalizador), y en la tercera, los resultados de la decisión C (cambiar el catalizador). En la cuarta columna tenemos el valor de la decisión óptima para cada etapa (la columna donde se encuentra el mínimo), por lo que expresa la política óptima para este estado: según el resultado obtenido, el catalizador debe cambiarse si tiene más de tres semanas al empezar la última etapa. Política para la etapa n = 3
Para la etapa n =3, correspondiente a la tercera semana de funcionamiento, hemos de tener el cuenta que el coste óptimo de las dos últimas etapas es igual al obtenido al tomar la decisión óptima en la cuarta etapa, más el coste óptimo en la tercera. Ahora, para cada una de las decisiones tendremos: f 3 ( en , C ) = 30 + f 4* (1) f 3 ( en , N ) = c ( en , N ) + f 4* ( en
+ 1)
Tabla 4.5.2.c Determinación de la política óptima para n = 3 para el problema del ejemplo 4.2.b *
*
Estado
f 3 ( en , N )
f 3 ( en , C )
xn
f 3 ( en )
1 2 3 4 5
30 43 55 63 -
42 42 42 42 42
N C C C C
30 42 42 42 42
Obsérvese que, para elaborar esta tabla, necesitamos los valores de f* de la etapa anterior, que pueden obtenerse de la tabla 4.5.2.b. La política para la segunda iteración es diferente a la de la primera: dos etapas antes de acabar el proceso, deberemos cambiar el catalizador si éste funciona desde hace dos semanas o más. Política para la etapa n = 2
Para la etapa n = 2, que representa la segunda semana de funcioamiento, actuamos igual que con la segunda: * f 2 ( en , C ) = 30 + f 3 (1) *
f 2 ( en , N ) = c ( en , N ) + f 3 ( en
+ 1)
Métodos cuantitativos de organización industrial II
120
Tabla 4.5.2.d Determinación de la política óptima para n = 2 para el problema del ejemplo 4.2.b *
*
Estado
f 2 ( en , N )
f 2 ( en , C )
xn
f 2 ( en )
1 2 3 4 5
54 60 67 75 -
60 60 60 60 60
N N, C C C C
54 60 60 60 60
Es destacable, en este caso, lo que sucede en esta etapa para el estado 2: se obtiene el mismo rendimiento para las dos decisiones, por lo que resulta irrelevante tomar una u otra en esta situación. El valor de f 3* ( 2 ) es de 60 sea cual sea la decisión que se tome, por lo que no afecta a cálculos posteriores. Política para la etapa n =1
Ya hemos alcanzado la etapa inicial, en la que el catalizador empieza su vida útil necesariamente: por lo tanto, sólo debemos efectuar los cálculos para el estado 5. Como en el estado 5 debe cambiarse el catalizador, representa también la situación en que el catalizador es nuevo y comienza en funcionamiento del sistema. f1 ( 5, C ) = 30 + f 2* (1) Tabla 4.5.2.e Determinación de la política óptima para n = 1 para el problema del ejemplo 4.2.b
Estado
f1 ( en , N )
f1 ( en , C )
xn*
f1* ( en )
5
-
84
C
84
La política óptima para este estado será, como es natural, cambiar el catalizador (en esta etapa, esto significa instalar un catalizador nuevo). Obtención de la solución
Una vez obtenidas las tablas, queda explotar éstas para obtener la solución: Valor función objetivo: si seguimos la estrategia adecuada óptima con el catalizador, el coste total para
las primeras cuatro etapas será de 84. ¿Cuándo debemos cambiar el catalizador?: Para ello, basta con evaluar la decisión del sistema a
tomar en cada etapa. A partir de las tablas obtenidas sabemos que:
• • • •
En la etapa inicial n = 1, hemos de cambiar el catalizador (mejor, poner uno nuevo), y evolucionamos al estado 1. Para la etapa n = 2, si nos encontramos en el estado 1 no debemos cambiar el catalizador, y el sistema evoluciona al estado 2. Para n = 3, si nos encontramos en el estado 2 debemos cambiar el catalizador. Si lo hacemos así, evolucionamos al estado 1. Finalmente, en n = 4 no debemos cambiar el catalizador si nos encontramos en el estado 1.
Programación dinámica
121
En consecuencia, además de instalar un catalizador nuevo al principio, obtendremos el coste óptimo para un horizonte finito de cuatro semanas si cambiamos el catalizador en la tercera semana de funcionamiento. 4.5.3 Programación dinámica determinista homogénea: horizonte infinito
En programación dinámica homogénea, puede interesarnos conocer la evolución del sistema a largo plazo, es decir, después de un gran número de etapas. En algunos casos, especialmente cuando la función a optimizar es la suma de contribuciones realizadas en determinadas etapas, es de esperar (aunque como se verá, no siempre sucede así) que la política óptima sea la misma para cada una de las etapas, a partir de un número de estados lo bastante alto. Algunas consideraciones para la resolución del problema de horizonte infinito:
•
Es conveniente caracterizar las etapa en que nos encontramos en función del número de etapas que faltan para acabar la evolución del sistema. Así, cuando falte una etapa para acabar, tendremos N = 1, la penúltima etapa es N = 2, etc. El sistema evolucionará de la etapa N a la N – 1, y determinaremos el comportamiento del sistema a largo plazo haciendo que N tienda a infinito.
•
Si la función objetivo es la suma de contribuciones de cada una de las etapas, la programación dinámica determinista es un caso particular de cadenas de Markov con remuneración y decisión, en la que la matriz P sólo tendrá unos y ceros, y representará la evolución del sistema en función de la política adoptada. En consecuencia, pueden usarse para resolver este tipo de problemas las técnicas de iteración en el espacio de los estados (que no es más que programación dinámica aplicada a un contexto particular) y de iteración del espacio de las políticas definidas para las cadenas de Markov con remuneración y decisión.
El ejemplo siguiente ilustra estas consideraciones, para la evolución a largo plazo del sistema que se definió en el ejemplo 4.5.1.a. Ejemplo 4.5.3.a Catalizador (G): resolución para el caso de horizonte infinito
Analizar la política óptima en el largo plazo (esto es, cuando lleva gran número de semanas funcionando) por el catalizador del ejemplo 2.a.
Realizaremos la iteración en el espacio de los estados, normalizando el valor de la función objetivo para cada una de las etapas. La normalización consistirá en restar el mínimo de los valores de f obtenidos a cada uno de esos valores. Para la siguiente iteración, utilizaremos los valores normalizados de f así obtenidos. Primera iteración (etapa N = 1)
La etapa N =1 corresponde a la última semana de funcionamiento del catalizador. Como en el caso de horizonte finito, la determinación del óptimo en la primera etapa es relativamente sencilla: f1 ( en , C ) = 30 f1 ( en , N ) = c ( en , N )
El óptimo se obtendrá escogiendo el valor de la mejor política para cada uno de los estados:
Métodos cuantitativos de organización industrial II
122
f1 ( en ) = MIN { f1 ( en , N ) , f1 ( en , C )} *
N ,C
Para determinar la evolución en horizonte infinito, debemos ahora realizar la normalización. Para ello determinamos la ganancia de la transición como: g1
= MIN { f1* ( en )} en
Y encontraremos los valores normalizados de la función objetivo haciendo: f1*' ( en ) = f1* ( en ) − g 1 Tabla 4.5.3.a Determinación de la política óptima para N = 1 para el problema del ejemplo 4.2.b
Estado
f1 ( en , N )
f1 ( en , C )
xn*
f1* ( en )
f1*' ( en )
1 2 3 4 5 g 1
12 18 25 33
30 30 30 30 30
N N N C C
12 18 25 30 30
0 6 13 18 18 12
Segunda iteración (etapa N = 2)
Para encontrar los valores de las funciones en la segunda iteración, necesitaremos los resultados normalizados de la primera. Una vez determinado el óptimo para cada estado, volvemos a normalizar los resultados. Funciones a comparar: f 2 ( en , C ) = 30 + f 1*' (1) *'
f 2 ( en , N ) = c ( en , N ) + f1
( en + 1)
Determinación del óptimo: *
f 2 ( en ) = MIN { f 2 ( en , N ), f 2 ( en , C )} N ,C
Normalización: g 2
= MIN { f2* ( en )}
*'
*
en
f 2 ( en ) = f 2 ( en ) − g 2
Aplicando la operativa aquí descrita, tenemos la tabla 4.5.3.b. Para su obtención, se han precisado los valores de las funciones normalizadas en 4.5.3.a:
Programación dinámica
123
Tabla 4.5.3.b Determinación de la política óptima para N = 2 para el problema del ejemplo 4.2.b *
*
*'
Estado
f 2 ( en , N )
f 2 ( en , C )
xn
f 2 ( en )
f 2 ( en )
1 2 3 4 5 g 2
18 31 43 51
30 30 30 30 30
N C C C C
18 30 30 30 30
0 12 12 12 12 18
Tercera iteración (etapa N = 3)
Para la tercera iteración, se opera exactamente de la misma forma que en la segunda: Tabla 4.5.3.c Determinación de la política óptima para N = 3 para el problema del ejemplo 4.2.b
Estado
f 3 ( en , N )
f 3 ( en , C )
xn*
f 3 ( en )
*
f 3 ( en )
*'
1 2 3 4 5 g 3
24 30 37 45
30 30 30 30 30
N N, C C C C
24 30 30 30 30
0 6 6 6 6 24
Cuarta iteración (etapa N = 4) Tabla 4.5.3.d Determinación de la política óptima para N = 4 para el problema del ejemplo 4.2.b *
*
*'
Estado
f 4 ( en , N )
f 4 ( en , C )
xn
f 4 ( en )
f 4 ( en )
1 2 3 4 5 g 4
18 24 31 39
30 30 30 30 30
N N C C C
18 24 30 30 30
0 6 12 12 12 18
Ya hemos realizado cuatro iteraciones, igual que en el problema anterior. Con este procedimiento, podemos resolver también el problema de horizonte finito. El lector puede comprobar que las políticas en cada etapa son las mismas que las obtenidas con universo finito, con lo que las decisiones óptimas en cada etapa, así como el estado de cada etapa por el que se pasa en el óptimo, pueden determinarse de la misma manera. En cuanto al valor de la función objetivo, es fácil ver que puede obtenerse como: g1 + g 2 + g3
+ g4 + f 4*' ( 5 )
12 + 18 + 24 + 18 + 12 = 84 Sin embargo, no hemos logrado resolver el problema para universo infinito, porque no se ha observado convergencia en las wi, ni en la ganancia esperada por transición g . Hemos de realizar más iteraciones para obtener el comportamiento a largo plazo del sistema.
Métodos cuantitativos de organización industrial II
124
Quinta iteración (etapa N = 5) Tabla 4.5.3.e Determinación de la política óptima para N = 5 para el problema del ejemplo 4.2.b *
*
*'
Estado
f 5 ( en , N )
f 5 ( en , C )
xn
f 5 ( en )
f 5 ( en )
1 2 3 4 5 g
18 30 37 45
30 30 30 30 30
N N, C C C C
18 30 30 30 30
0 12 12 12 12 18
Sexta iteración (etapa N = 6) Tabla 4.5.3.f Determinación de la política óptima para N = 6 para el problema del ejemplo 4.2.b
Estado
f 6 ( en , N )
f 6 ( en , C )
xn*
f 6 ( en )
*
f 6 ( en )
*'
1 2 3 4 5 g
24 30 37 45
30 30 30 30 30
N N, C C C C
24 30 30 30 30
0 6 6 6 6 24
Nótese que el resultado de la sexta iteración es igual al obtenido en la tercera (N = 3), por lo que N = 7 es igual a N = 4, N = 8 igual a N = 5, N = 9 igual a N = 3, N = 10 igual a N = etc... Parece que el sistema sigue una evolución cíclica, de periodo 3. La ganancia promedio del sistema, de confirmarse este comportamiento, sería de: g3
+ g 4 + g 5 = 20 3
En cuanto a la política óptima, parece que el sistema tiende a la política {N, N, C, C, C}, si bien en las etapas primera y tercera de cada periodo, la política es equivalente a {N, C C, C, C}. Esta situación requiere un examen más atento de la evolución a largo plazo de la política {N, N, C, C, C}. La matriz de probabilidades de transición de esta política es: 0 0 P= 1 1 1
1 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
El lector puede comprobar que se trata de una cadena de Markov regular, con dos clases de paso: {4}y {5} y una clase final {1, 2, 3} cíclica de periodo p = 3.
Programación dinámica
125
La matriz de remuneraciones es:
− − R = 30 30 30
12 − − − −
− 18 − − −
− − − − −
− − − − −
De modo que el vector q resultante es: 12 18 q = 30 30 30 Por ser una cadena regular, tenemos un vector de ganancias promedio g con todas las componentes iguales a la ganancia media por transición. Podemos obtener g a partir de P*, sabiendo que ésta vale: 1/ 3 1/ 3 P* = 1/ 3 1/ 3 1/ 3
1/ 3 1/ 3 1/ 3 1/ 3 1/ 3
1/ 3 1/ 3 1/ 3 1/ 3 1/ 3
0 0 0 0 0
0 0 0 0 0
Y entonces g vale: 20 20 g = P * ⋅q = 20 20 20 Por lo tanto, tendremos el conjunto de ecuaciones: 20 + w1 = 12 + w2 20 + w2 = 18 + w3 20 + w3 = 30 + w1 20 + w4 = 30 + w1 20 + w5 = 30 + w1 Cuya solución es: w1 = 0 w2 = 8 w3 = 10 w4 = 10
w5 = 10
Métodos cuantitativos de organización industrial II
126
Nótese como, para los estados de la clase final, la ganancia a largo plazo resulta ser el promedio de las ganancias a lo largo de un ciclo, tal como se había visto anteriormente. Para las wi de la clase final se observa un comportamiento parecido: w2
w3
=
6 + 6 + 12 =8 3
= w4 = w5 =
6 + 12 + 12 = 10 3
Por lo tanto, podemos concluir que si se sigue la política {N, N, C, C, C }, se obtendrá la ganancia media por transición mínima, que es 20. Cualquier otra ganancia media será superior: por ejemplo, la de la política {N, N, N, N, C} es de 23, 6 (compruébelo el lector). El sistema es asimilable a una cadena de Markov con remuneración y decisión, que en la política óptima da lugar a una cadena semirregular, cuya clase final tiene periodo 3. 4.6 Programación dinámica aleatoria
Mediante los modelos de programación dinámica aleatoria, se estudian aquellos procesos polietápicos de decisión en los que, si en la etapa n nos encontramos en el estado i y tomamos la decisión d , no conocemos de manera exacta hacia qué estado evoluciona el sistema. Todo lo más, podemos llegar a conocer la probabilidad de que el sistema evolucione en la etapa siguiente a otro estado cualquiera j. A un sistema de este tipo le es aplicable la metodología de la programación dinámica, aunque deben destacarse dos implicaciones importantes:
• No podrá alcanzarse de manera cierta la optimización del sistema, dado que evoluciona de forma aleatoria. Todo lo más, podremos aspirar a optimizar el valor esperado de la función de recurrencia. • Por las características de este tipo de procesos, no podemos conocer de antemano en qué estado nos encontraremos en una etapa cualquiera n. Por este motivo, la decisión óptima deberá expresarse como política óptima: en dicha política se indicará, para cada estado, los valores de la variable de decisión que aseguran un mejor valor esperado de la función objetivo en las etapas posteriores. Otra cuestión importante es que, si la función de recurrencia es de tipo aditivo y las probabilidades de transición se definen de la misma manera para todas las etapas, el modelo de programación dinámica aleatoria puede entenderse también como un proceso de decisión markoviano, al que le son aplicables las técnicas que se describieron para este tipo de procesos en el tema sobre cadenas de Markov. Este hecho se introdujo ya en el ejemplo 4.5.3.a para el caso de programación dinámica determinista. En esta sección, se mostrarán las características de la programación dinámica aleatoria a través del modelo de planificación de inventarios expuesto en el ejemplo 4.2.c. 4.6.1 Programación dinámica aleatoria en horizonte finito
El ejemplo de la planificación de inventarios que se expone en el ejemplo 4.6.a, que ya se introdujo en la sección 4.2, describe un proceso susceptible de ser modelizado mediante programación dinámica. Al representar la demanda como una variable aleatoria, nos encontramos con que este modelo es de programación dinámica aleatoria.
Programación dinámica
127
Ejemplo 4.6.1.a Planificación de inventarios (B): planteamiento general
El precio de venta de un determinado artículo es de 10 €/unidad, y la demanda diaria sigue la siguiente ley de probabilidad: Demanda Probabilidad
0 0,4
1 0,3
2 0,2
3 0,1
El coste de posesión de cada unidad en stock al final de día es de 1 €. Al final de día, tenemos la posibilidad de pedir una cantidad cualquiera a un proveedor que nos la sirve el día siguiente a primera hora de la mañana, con un coste de 2 €/unidad, más 3 € por costes de transporte. ¿Cuántas unidades debemos comprar cada día para maximizar el beneficio esperado?
En primer lugar, debemos definir los elementos del modelo de programación dinámica. Etapas del sistema:
Dadas las condiciones del problema, cada día en que se sirve la demanda constituye una etapa en la evolución del proceso. Estados del sistema:
La variable de estado del sistema debe contener la información necesaria para describir la situación del sistema en la etapa considerada. La única circunstancia relevante a la hora de tomar la decisión de compra es saber de cuántas unidades disponemos, una vez se ha servido la demanda de la etapa anterior. En definitiva, la variable de estado del sistema será el nivel de inventario en el almacén antes de comprar las unidades adicionales y servir la demanda. En principio, dicho nivel de inventario puede tomar cualquier valor entero no negativo. Sin embargo, más adelante veremos que en la práctica existirá una cota superior para dicho nivel de inventario. Variables de decisión:
Claramente, la decisión a tomar es la cantidad de unidades a comprar. Entre las unidades compradas y las unidades de que se dispone (inventario inicial), se intentará cubrir la demanda. En general, tendremos: inventario inicial + unidades compradas = demanda satisfecha + inventario final En este punto, cabe realizar varias observaciones:
•
En la ecuación, se habla de demanda satisfecha, y no de demanda total. Si entre el inventario inicial y las unidades compradas no pudiéramos cubrir la demanda, quedará demanda por satisfacer y se perderán ingresos que podrían haberse obtenido de comprar más cantidad.
•
La máxima demanda es de tres unidades, por lo que es razonable plantear para esta situación: inventario inicial + unidades compradas ≤ 3
De manera que el valor máximo de la variable de estado y de la variable de decisión será de 3. Los valores de las variables de decisión c posibles para cada estado e se muestran en la tabla adjunta: e =0 e = 1 e = 2 e = 3
c = 0 c = 0 c = 0 c = 0
c = 1 c = 1 c = 1
c = 2 c = 2
c = 3
Métodos cuantitativos de organización industrial II
128
Como la demanda sigue una ley de probabilidad, la evolución del sistema es aleatoria. El inventario final, que representará el estado hacia el que evolucionará el sistema, también seguirá una evolución aleatoria. Formalmente, como puede quedar demanda sin cubrir, el estado al que evolucionará el sistema vendrá dado por: inventario final = MAX { inventario inicial + unidades compradas – demanda; 0} Función de recurrencia:
La función de recurrencia deberá expresar el beneficio esperado. En este caso, la función es de tipo aditivo: Beneficio esperado en las N últimas etapas antes del final = beneficio esperado etapa N + Beneficio esperado en las N – 1 últimas etapas El beneficio esperado en la etapa n será un valor esperado. Para cada valor Di posible de la demanda deberemos calcular la demanda satisfecha DSi como: DSi = MIN {Di; inventario inicial + unidades compradas} Y ya antes hemos obtenido el inventario final EF i como: EFi = MAX { inventario inicial + unidades compradas – demanda; 0} Pues bien, ahora ya podemos expresar la función de recurrencia en función del inventario inicial e, las unidades compradas c y la probabilidad pi del nivel de demanda i. Nótese que obtenemos un beneficio unitario de 5 € por cada unidad de demanda satisfecha y hemos de asumir un coste de 1 € por cada unidad de inventario final. f N ( e, c ) =
3
∑ p ⋅ 5 ⋅ DS − 1⋅ EF + f i
i=0
i
i
* N −1
( EF i )
En este caso, hemos planteado un problema de programación dinámica homogénea. Por esta razón, podemos plantear el problema tanto para un determinado número de semanas (horizonte finito) como para el largo plazo (horizonte infinito). Primero plantearemos el caso de horizonte finito y seguidamente, en la sección 4.6.2, constataremos el carácter markoviano del problema y lo resolveremos para el caso de horizonte infinito. Ejemplo 4.6.1.b Planificación de inventarios (B): caso de horizonte finito
Determinar la política que optimiza el beneficio esperado del sistema en cuatro semanas de funcionamiento, con un nivel de inventario en la primera semana igual a cero.
Para esta situación, bastará con aplicar las expresiones obtenidas en el ejemplo 4.6.1.a hasta N = 4. En la última etapa (N=4), sólo deberemos considerar el caso de e = 0. Primera iteración (N = 1)
Para la primera semana de funcionamiento, tendremos que todas las f* serán iguales a cero. Así, cuando c + e = 3, tendremos:
Programación dinámica
129
f1 ( e, c ) = 0,4 ⋅ ( −3) + 0,3 ⋅ 3 + 0,2 ⋅ 9 + 0,1 ⋅15 = 3 (para c + e =3)
Para c + e = 2 tendremos que cuando la demanda sea 3, sólo venderemos dos unidades y el inventario final será igual a cero, por lo que el beneficio obtenido será el mismo. Así, la probabilidad de vender dos unidades será igual a la suma de probabilidades de tener una Di = 2 y una Di = 3. Así, podemos escribir: f1 ( e, c ) = 0,4 ⋅ ( −2 ) + 0,3 ⋅ 4 + 0,3 ⋅ 10 = 3,4
(para c + e =2)
Procedemos del mismo modo para c + e = 1. Ahora sólo podemos esperar vender 0 unidades o una unidad. f1 ( e, c ) = 0,4 ⋅ ( −1) + 0,6 ⋅ 5 = 2,6
(para c + e =1)
Finalmente, cuando c + e = 0, no venderemos nada y la función valdrá cero. Con estos datos, podemos pasar a la tabla, y obtener la política óptima para N =1: Tabla 6.1.a Tabla para la etapa N = 1 para la resolución del ejemplo 6.1.a *
en
f1 ( en ,0 )
f1 ( en ,1)
f1 ( en ,2 )
f1 ( en ,3)
x n*
f1 ( en )
0 1 2 3
0 2,6 3,4 3
2,6 3,4 3
3,4 3
3
2 1 0 0
3,4 3,4 3,4 3
Segunda iteración (N = 2)
Ahora sí que la f * es diferente de cero y deberemos tenerlo en cuenta para calcular la tabla para esta nueva etapa: Así, cuando c + e = 3, tendremos: f 2 ( e, c ) = 0,4 ⋅ ( −3 + 3 ) + 0,3 ⋅ (3 + 3,4) + 0,2 ⋅ (9 + 3,4) + 0,1 ⋅ (15 + 3,4) = 6,24
(para c + e =3)
Para c + e = 2, se obtiene el valor: f 2 ( e, c ) = 0,4 ⋅ ( −2 + 3,4 ) + 0,3 ⋅ (4 + 3,4) + 0,3 ⋅ (10 + 3,4) = 6,8 (para c + e =2)
Procedemos del mismo modo para c + e = 1. Ahora sólo podemos esperar vender 0 unidades o una unidad. f 2 ( e, c ) = 0,4 ⋅ ( −1 + 3,4 ) + 0,6 ⋅ (5 + 3,4) = 6
(para c + e =1)
Finalmente, cuando c + e = 0, no venderemos nada y evolucionaremos con certeza al estado e = 0. f 2 ( e, c ) = 0 + 3,4 = 3,4 (para c + e = 0)
Métodos cuantitativos de organización industrial II
130
Ahora ya podemos determinar la política óptima para N = 2: Tabla 4.6.1.b Tabla para la etapa N = 2 para la resolución del ejemplo 4.6.1.a
en
f 2 ( en ,0 )
f 2 ( en ,1)
f 2 ( en ,2 )
f 2 ( en ,3)
x n*
f 2* ( en )
0 1 2 3
3,4 6 6,8 6,24
6 6,8 6,24
6,8 6,24
6,24
2 1 0 0
6,8 6,8 6,8 6,24
Tercera iteración (N = 3)
Para N = 3, actuaremos de la misma manera que para N = 2 Seguidamente se muestran los valores posibles de la función de recurrencia: f 3 ( e, c ) = 0,4 ⋅ ( −3 + 6,24 ) + 0,3 ⋅ (3 + 6,8) + 0,2 ⋅ (9 + 6,8) + 0,1 ⋅ (15 + 6,8) = 9,576
(para c + e =3) f 3 ( e, c ) = 0,4 ⋅ ( −2 + 6,8 ) + 0,3 ⋅ (4 + 6,8) + 0,3 ⋅ (10 + 6,8) = 10,2 (para c + e =2) f 3 ( e, c ) = 0,4 ⋅ ( −1 + 6,8 ) + 0,6 ⋅ (5 + 6,8) = 9,4 (para c + e =1) f 3 ( e, c ) = 0 + 6,8 = 6,8 (para c + e = 0)
Una vez obtenidos estos valores, ya podemos obtener la política óptima para N = 3: Tabla.1.c Tabla para la etapa N = 3 para la resolución del ejemplo 4.6.1.a *
en
f 3 ( en ,0 )
f 3 ( en ,1)
f 3 ( en ,2 )
f 3 ( en ,3)
x n*
f 3 ( en )
0 1 2 3
6,8 9,4 10,2 9,576
9,4 10,2 9,576
10,2 9,576
9,576
2 1 0 0
10,2 10,2 10,2 9,576
Cuarta y última iteración (N = 4)
La cuarta iteración representa el inicio del funcionamiento del sistema. Por las condiciones del enunciado, sabemos que la empresa empieza sin inventarios, por lo que sólo deberemos evaluar la etapa e = 0. Ello no nos exime de calcular las funciones de recurrencia para los diferentes valores de c + e: f 4 ( e, c ) = 0,4 ⋅ ( −3 + 9,576 ) + 0,3 ⋅ (3 + 10,2) + 0,2 ⋅ (9 + 10,2) + 0,1 ⋅ (15 + 10,2) = 12,9504 (c+e=3) f 4 ( e, c ) = 0,4 ⋅ ( −2 + 10,2 ) + 0,3 ⋅ (4 + 10,2) + 0,3 ⋅ (10 + 10,2) = 13,6
(para c + e =2) (para c + e =1) f 4 ( e, c ) = 0,4 ⋅ ( −1 + 10,2 ) + 0,6 ⋅ (5 + 10,2) = 12,8 (para c + e = 0) f 4 ( e, c ) = 0 + 10,2 = 10,2
Ahora ya podemos elaborar la tabla para la última etapa: Tabla 4.6.1.d Tabla para la etapa N = 4 para la resolución del ejemplo 4.6.1.a
en
f 3 ( en ,0 )
f 3 ( en ,1)
f 3 ( en ,2 )
f 3 ( en ,3)
xn*
f 3 ( en )
0
10,2
12,8
13,6
12,9504
2
13,6
*
Programación dinámica
131
Solución del problema
Por ser un modelo de programación dinámica aleatoria, no podemos conocer los estados a los que irá evolucionando el sistema, y la solución consistirá en políticas para cada etapa que optimicen el valor esperado de la función de recurrencia. De la información suministrada por las diferentes tablas, podemos decir que: Debe iniciarse el funcionamiento del sistema adquiriendo dos unidades. A partir de entonces, adquirir las unidades suficientes para cubrir una demanda de dos unidades (deben por tanto adquirirse 2 unidades si no hay inventario, una unidad si hay una unidad de inventario y nada si tenemos dos unidades de inventario). Caso de tener un inventario de tres unidades, no deberá adquirirse ninguna unidad. Actuando de esta manera, el valor esperado del beneficio obtenido en cuatro semanas de funcionamiento será de 13,6. 4.6.2 Programación dinámica aleatoria y procesos de decisión markovianos
La situación planteada en el ejemplo 4.2.c, que se modelizó como un problema de programación dinámica en el ejemplo 4.6.1.a y se resolvió para un planteamiento de horizonte finito en el ejemplo 4.6.1.b, puede plantearse también como un problema de horizonte infinito. En este caso, se trataría de obtener la política que optimiza la ganancia por transición en el largo plazo. Ahora bien, el modelo que nos ocupa tiene algunas propiedades interesantes: la función de recurrencia es de tipo aditivo y las probabilidades de transición son las mismas para todas las etapas del sistema. Esta última condición hace que la evolución del sistema en el futuro sea independiente de lo ocurrido en el pasado: se trata de un proceso markoviano de decisión. La primera propiedad nos permite aplicar los resultados obtenidos para los procesos markovianos de decisión en el tema anterior, en lo relativo a la iteración en el espacio de los estados y la exploración en el espacio de las políticas. En particular, la iteración en el espacio de los estados puede entenderse como un caso particular de programación dinámica, al que se aplica el procedimiento de normalización para observar la tendencia a largo plazo. En el ejemplo 4.5.3.a se ilustró este procedimiento para un problema de programación dinámica determinista (que puede entenderse como un caso particular de programación dinámica aleatoria, en las que las probabilidades sean cero o uno). Seguidamente, mostraremos cómo puede representarse el problema que nos ocupa como un proceso de decisión markoviano y obtendremos el valor de la ganancia por transición a largo plazo para la política óptima, mediante la exploración de la política óptima. Ejemplo 4.6.2.a Planificación de inventarios (C): caso de horizonte infinito
Para el problema del ejemplo 2.c, determinar la política que permite obtener el mayor beneficio diario para este sistema después de muchos días de funcionamiento. Obtener el valor de ese beneficio diario.
El problema puede plantearse como un problema de proceso de decisión markoviano. Los estados y las variables de decisión se definirán de la misma manera que se definieron en el ejemplo 4.6.1.a. Ahora deberemos obtener las matrices P y R para todas las combinaciones de variables de decisión y estados. Dichas matrices se muestran en la tabla adjunta:
Métodos cuantitativos de organización industrial II
132
Tabla 4.6.2.a Planteamiento del ejemplo 4.2.c como proceso de decisión markoviano
EST
DEC
0
1
2
3
0
0
0 1 2 3 0 1 2 0 1 0
1 0,6 0,3 0,1 0,6 0,3 0,1 0,3 0,1 0,1
0 0,4 0,3 0,2 0,4 0,3 0,2 0,3 0,2 0,2
0 0 0,4 0,3 0 0,4 0,3 0,4 0,3 0,3
0 0 0 0,4 0 0 0,4 0 0,4 0,4
0 5 10 15 5 10 15 10 15 15
1 2 3
1
-1 4 9 -1 4 9 4 9 9
2
-2 3 -2 3 -2 3 3
3
-3 -3 -3 -3
q
0 2,6 3,4 3 2,6 3,4 3 3,4 3 3
La solución del problema de horizonte finito, desarrollada en el ejemplo 4.6.1.b ya nos indica que la política {2, 1, 0, 0} es la que asegura el beneficio esperado óptimo. Entonces, podemos obtener la ganancia media por transición aplicando la ecuación: g + w = q + P·w
Para el caso que nos ocupa, el conjunto de ecuaciones es: g + w1 = 3,4 + 0,3w1 + 0,3w2 + 0,4w3 g + w2 = 3,4 + 0,3w1 + 0,3w2 + 0,4w3 g + w3 = 3,4 + 0,3w1 + 0,3w2 + 0,4w3 g + w4 = 3 + 0,1w1 + 0,2w2 + 0,3w3 + 0,4w4 Para este conjunto de ecuaciones, tenemos que w1 = w2 = w3. Si hacemos w4 = 0 tenemos que: g = 3,4
w1 = w2 = w3 = 2/3
w4 = 0
De donde obtenemos una ganancia media por transición de 3,4 si seguimos esta política. 4.7 Problemas resueltos 4.7.1 Problema del producto máximo
Encuentre, mediante programación dinámica, el conjunto de tres números enteros que suman 8 y cuyo producto sea máximo. Solución problema del producto máximo
Etapas del sistema: n = 1: determinación del primer número n = 2: determinación del segundo número n = 3: determinación del tercer número Variables de decisión: x1 primer número n = 1 x2 segundo número n = 2 x3 tercer número n = 3
x1 = 1,..., 6 x2 = 1,..., 6 x3 = 1,..., 6
Programación dinámica
133
Estados del sistema: en : Suma de las variables asignadas en el apartado anterior e1 = x1 + x2 + x3 e2 = x2 + x3 e3 = x3
e1 = 8 e2 ≤ 7 e3 ≤ 6
Función de recurrencia: f n (en, xn) = xn · f *n+1 (en – xn)
f *4 (e)
n = 1, 2, 3
=1
Aplicando programación dinámica, obtenemos la solución: f 3 (e3, x3) = x3 · f *4 (e2 – x2)
Etapa n = 3
*
x
en
1 2 3 4 5 6
1 2 3 4 5 6 7
8
1 2 3 4 5 6
1
2
3
4
5
6
1·1 1·2 1·3 1·4 1·5 1·6
2·1 2·2 2·3 2·4 2·5
3·1 3·2 3·3 3·4
4·1 4·2 4·3
5·1 5·2
x
*
*
6·1
2
1 1, 2 2 2, 3 3 3, 4
f 2 (e2)
x *1
f *1 (e1)
1 2 4 6 9 12
f 1 (8, x3) = x3 · f *2 (8 – x3)
Etapa n = 1 e1
1 2 3 4 5 6
f 2 (e2, x2) = x2 · f *3 (e2 – x2)
Etapa n = 2 e2
*
f 3 (en)
n
1
2
3
4
5
6
1·12
2·9
3·6
4·4
5·2
6·1
2, 3
18
Dado que en la última etapa hay un empate en el óptimo entre 2 y 3, tenemos dos soluciones, que en realidad, son la misma dada en orden diferente: x*1 = 2 e1 = 8
x*2 = 3 e2 = 6
x*3 = 3 e3 = 3
x*n = 1 en = 0
El producto máximo con tres números enteros que sumen 8 vale 18, y es igual al producto de 2 por 3 y 3.
Métodos cuantitativos de organización industrial II
134
4.7.2 Problema de la mochila
Un turista está planificando una corta excursión por el campo y para ello cuenta con tres recursos: comida (recurso A), bebida (recurso B) y libros para leer a la sombra de un árbol (recurso C). La utilidad que le reporta llevar cada uno de estos recursos aumenta con las unidades que se lleva, según las tablas siguientes: Utilidad que aporta el recurso A: Cantidad recurso (en unidades)
Utilidad 1 total
0 1 2 3
0 10 15 18
Peso del recurso A: 3 Kg por unidad Utilidad que aporta el recurso B: Cantidad recurso (en unidades)
Utilidad total
0 1 2
0 14 21
Peso del recurso B: 4 Kg por unidad Utilidad de recurso C: Cantidad recurso (en unidades)
Utilidad total
0 1 2 3 4 5
0 6 9 11 12 13
Peso del recurso C: 2 Kg por unidad Sabiendo que el turista puede llevar en su mochila una cantidad máxima de 10 Kg., se trata de saber cuántas unidades de cada producto debe llevar en su mochila para maximizar su utilidad total. Se pregunta: a) Definir la naturaleza de las etapas, estados y variables de decisión para plantear este problema mediante programación dinámica. b) Resolver el problema usando programación dinámica. Solución problema de la mochila
Como puede verse, se trata de un problema de programación dinámica no homogénea. Los parámetros del problema pueden definirse de varias maneras, aunque han de ser equivalentes al siguiente planteamiento: 1
Se trata de la utilidad total: esto significa que, por ejemplo, tres unidades del recurso A proporcionan una utilidad de 18.
Programación dinámica
135
• Etapas: en cada etapa se asigna un recurso a la mochila. El orden es indiferente, aunque en esta resolución se ha adoptado: En n = 1, llenamos la mochila del recurso A En n = 2, llenamos la mochila del recurso B En n = 3, llenamos la mochila del recurso C
•
Variable de decisión: en esta resolución la variable es la cantidad de recurso (A, B y C) propio
de cada etapa a introducir en la mochila. También puede definirse como los kilos de recurso que se introducen.
• Estado del sistema: se han definido como los Kg de capacidad de la mochila que quedan libres para los recursos de las etapas siguientes. También puede definirse como los Kg que se han asignado en etapas anteriores. El problema al definir las funciones de recurrencia es que la mochila no tiene por qué estar llena en el óptimo (como de hecho sucede en este caso). Esto puede resolverse añadiendo una etapa adicional o definiendo la función de recurrencia para la primera etapa como: f3(e,xC) = E(e/2) (Recordemos que el peso de una unidad de C es de 2 Kg.). Así en n = 3, la cantidad óptima para el estado 5 es xC* = 2: 4 Kg de recurso y un Kg vacío. Para la etapa n =2 la función será (B pesa 4 Kg): f2(e,xB) = u(xB) + f3*(e – 4·xB) Finalmente, en la etapa n = 1 sólo deberemos considerar el estado 10: f2(10,xA) = u(xA) + f3*(e – 3·xA) Una vez definidas las funciones, podemos pasar a elaborar las tablas. Para n = 3:
Para n = 2:
e
xC*
f3*(e)
0 1 2 3 4 5 6 7 8 9 10
0 0 1 1 2 2 3 3 4 4 5
0 0 6 6 9 9 11 11 12 12 13
Métodos cuantitativos de organización industrial II
136
0
0 1 2 3 4 5 6 7 8 9 10
1
0+0 0+0 0+6 0+6 0+9 0+9 0 + 11 0 + 11 0 + 12 0 + 12 0 + 13
14 + 0 14 + 0 14 + 6 14 + 6 14 + 9 14 + 9 14 + 11
2
xB*
f2*(e)
21 + 0 21 + 0 21 + 6
0 0 0 0 1 1 1 1 1 1 2
0 0 6 6 14 14 20 20 23 23 27
Finalmente, para n = 1: e
0
1
2
3
xA*
f1*(10)
10
0 + 27
10 + 20
15 + 14
21 + 0
1
30
Ahora ya podemos obtener la solución, teniendo en cuenta los pesos de los diferentes recursos: • En la etapa n = 1, tenemos xA* = 1, por lo que el sistema evoluciona al estado 7 (el peso de A en la mochila es de 3 Kg). • En la etapa n = 2 y para el estado 7, tenemos que xB* = 1, por lo que el sistema evoluciona al estado 3 (el peso de B en la mochila es de 4 Kg). • Y en la etapa n = 3 y para el estado 3, tenemos que xC* = 1 (el peso de C en la mochila es de 2 Kg, por lo que queda 1 Kg por debajo de la capacidad máxima). En definitiva, introduciremos una unidad de cada recurso en la mochila, con una utilidad total de 30. El peso total de los recursos transportados es de 9 Kg. 4.7.3 Problema de la ruta
Un transportista cuenta con una serie de clientes en cuatro ciudades que llamaremos A, B, C y D. Las rutas posibles son tales que desde cada una de las ciudades, tiene dos rutas disponibles con carga, tal como aparece en el gráfico. La tabla 1 muestra las distancias entre las cuatro ciudades, y la tabla 2 muestra las remuneración obtenida por transportar mercancías de la ciudad i a la ciudad j.
A
B
D
C
Fig. 4.7.3.a Gráfico problema de la ruta
Programación dinámica
137
Tabla 4.7.3.a: distancias (Km)
A B C D
Tabla 4.7.3.b: ingresos (euros)
A
B
C
D
– 100 200 500
100 – 600 800
200 600 – 300
500 800 300 –
A B C D
A
B
C
D
– 2.500 2.500 5.500
4.000 – – –
8.000 8.000 – 5.000
– – 4.000 –
Los costes del transportista son proporcionales al kilometraje y en estos momentos son de 10 euros por kilómetro. Con estos datos, se pregunta: 1. Plantear un modelo de programación dinámica que permita obtener la política a seguir para maximizar el beneficio del transportista, en el caso que deba llevar carga en cada viaje (este hecho elimina, por ejemplo, la posibilidad de viajar de A a D). 2. Determinar qué ruta debe seguir el transportista en los tres próximos viajes, si ahora se encuentra en la ciudad A. Determinar también cuál será el beneficio obtenido para esta ruta óptima. 3. ¿Cómo debería modificarse el modelo si se contemplara la posibilidad de volver de vacío? (No es necesario determinar las expresiones de la función de recurrencia para este caso.) Solución problema de la ruta
1. Plantear un modelo de programación dinámica que permita obtener la política a seguir para maximizar el beneficio del transportista, en el caso que deba llevar carga en cada viaje (este hecho elimina, por ejemplo, la posibilidad de viajar de A a D).
Modelo de programación dinámica: Etapas:
Definiremos cada etapa como cada uno de los viajes que realice el camión. Estados:
Se identificará cada estado como la ciudad en donde se encuentre el camión. Por tanto, existirán cuatro estados (estado A, estado B, estado C, estado D). Variables de decisión:
En este caso, la variable de decisión podrá tomar el valor de las ciudades a las que el camión puede dirigirse. Según en que ciudad se encuentre podrá elegir entre unas ciudades u otras. Estado = A --> variables de decisión: B y C Estado = B --> variables de decisión: A y C Estado = C --> variables de decisión: A y D Estado = D --> variables de decisión: A y C Función de recurrencia:
Beneficio = Ingresos – Costes *
f N (en , xn ) = Beneficio(en , xn ) + f n +1 (e)
Métodos cuantitativos de organización industrial II
138
Para simplificar la función de recurrencia calculamos una matriz que nos proporcione los beneficios según el estado y la variable de decisión.
− 3000 6000 − 1500 − 2000 − Beneficio = 500 − − 1000 − 2000 − 500 2. Determinar qué ruta debe seguir el transportista en los tres próximos viajes, si ahora se encuentra en la ciudad A. Determinar también cuál será el beneficio obtenido para esta ruta óptima.
A partir del modelo anterior calculamos la política óptima del sistema. Para n = 3 tendremos e
x 3*
f 3* (e)
A
AC 6000
B
BC 2000
1000 D DC 2000 C
CD
Para n = 2 tendremos AB
AC
BA
BC
CA
CD
DA
DC
30 + 20 60 + 10 − − − − − − − − 15 + 60 20 + 20 − − − − B − − − − − − 5 + 60 20 + 20 C − − − − − − 5 + 60 20 + 10 D A
x2
*
f 2 (e)
AC
70 75 65 65
BA CA DA
*
Nota: Todos los valores de la tabla deben ser multiplicados por 100
Para n = 1 tendremos AB
AC
A 3000 + 7500 6000 + 6500
x1*
f1* (e)
C 12500
De aquí podemos extraer que la solución óptima será de A a C y de C a A 4.7.4 Problema de las máquinas en paralelo
Un sistema productivo consta de dos máquinas en paralelo que realizan la misma función. La empresa se ha planteado cuál debe ser la política de mantenimiento que maximice el valor esperado la producción horaria a largo plazo. Para ello, se dispone de la siguiente información acerca del funcionamiento del sistema y de los diferentes casos que pueden darse: Primer caso: Cuando funcionan las dos máquinas, en régimen normal, cada una de ellas tiene una
productividad de 30 piezas por hora. Sin embargo, cada una de ellas tiene una probabilidad de avería
Programación dinámica
139
igual a 0,2. En esta situación podría plantearse la realización de un programa de mantenimiento preventivo al principio de cada hora de funcionamiento que aseguraría el correcto funcionamiento del sistema al final de la hora. El precio a pagar sería que mientras se realiza el mantenimiento cada máquina tendría un rendimiento de 25 piezas por hora. Segundo caso: Si sólo funciona una máquina, puede optarse por seguir en esta situación o por reparar
la otra máquina. De seguir la primera opción, la máquina que funciona tendría que trabajar a 40 piezas por hora y su probabilidad de avería sería de 0,4. Si se opta por reparar la máquina, tendríamos todo el sistema parado durante una hora. Por cuestiones de planificación, la decisión de realizar la reparación debería tomarse al principio de cada hora de funcionamiento. Tercer caso: Si se estropean las dos máquinas a la vez (en el primer caso) o se estropea la única
máquina que funciona (en el segundo caso), la reparación exigiría dos horas para que el sistema estuviera a pleno rendimiento. Por razones semejantes a la situación anterior, esta reparación debería iniciarse al principio de la hora siguiente a la(s) avería(s). Cuando se produce una avería, el rendimiento es el promedio entre la situación antes y después de la avería. Por ejemplo, si se estropea una de las dos máquinas el rendimiento resultante sería de (60 + 40) / 2 = 50 piezas por hora. Se pide: 1. Definir los parámetros del sistema que permiten su modelización como un modelo de programación dinámica aleatoria y como un proceso markoviano de decisión. 2. Determinar la política óptima para tres horas de funcionamiento del sistema, si empezamos con las dos máquinas en funcionamiento. 3. Si, en el largo plazo, se opta por no realizar el mantenimiento preventivo y por reparar las máquinas inmediatamente después de que se averíen, determinar cuál sería el valor esperado de la producción horaria para esta política. Solución problema máquinas en paralelo
1. Definir los parámetros del sistema que permiten su modelización como un modelo de programación dinámica aleatoria o como un proceso markoviano de decisión. Etapas: cada hora de funcionamiento del sistema. Nótese que las decisiones se toman al principio de
cada hora de funcionamiento. Estados: como en algún caso debemos esperar dos horas a que el sistema vuelva a funcionar, deben
definirse cuatro estados: M2 Las dos máquinas funcionan. M1 Sólo funciona una máquina. R1 Nos encontramos en la última hora de reparación. R2 Nos encontramos en la penúltima hora de reparación. Variables de decisión: como puede deducirse de la lectura del ejercicio, son diferentes para cada
estado: Para M1 Para M2
Realizar el mantenimiento preventivo (MAN) No realizar el mantenimiento preventivo (NMA) Reparar la máquina averiada (REP) No reparar la máquina averiada (NRE)
Métodos cuantitativos de organización industrial II
140
No hay variables de decisión para R1 y R2 (a no ser que dejemos el sistema parado para siempre, cosa que no parece muy recomendable). Función de recurrencia: para un caso como este, podría ser interesante plantear las P y R del proceso markoviano. Esto nos permitirá obtener las funciones de recurrencia de manera más sencilla. Matrices de probabilidades de transición P para cada estado y decisión (los valores en blanco son iguales a cero): M2
MAN NMA REP NRE – –
M1 R1 R2
M2
M1
R1
R2
1 0,64 1
0,32
0,04
0,6
0,4
1 1
Teniendo en cuenta las consideraciones realizadas en el ejercicio, la matriz de remuneraciones R para cada estado y decisión valdrá (sólo se han definido para los valores de P diferentes de cero): M2
MAN NMA REP NRE – –
M1 R1 R2
M2
M1
R1
R2
50 60 0
50
30
40
20
0 0
Hechas estas consideraciones, el vector de ganancias esperadas por transición para cada estado y decisión vale: q
M2
MAN NMA REP NRE – –
M1 R1 R2
50 55,6 0 32 0 0
Ahora, fijándonos en la matriz P y el vector q, podemos obtener las funciones de recurrencia: Para el estado M2: *
f N ( M 2, MAN ) = 50 + f N −1 ( M 2 ) f N ( M 2, NMA) = 55,6 + 0,64 ⋅ f N −1 ( M 2 ) + 0,32 ⋅ f N* −1 ( M 1) + 0,04 ⋅ f N * −1 ( R2 )
Para el estado M1: f N ( M 1,Re p ) = 0 + f N * −1 ( M 2 ) f N ( M 1, NRE ) = 32 + 0,6 ⋅ f N* −1 ( M 1) + 0,4 ⋅ f N * −1 ( R2 ) *
*
f N ( R1) = f N −1 ( M 2 )
Programación dinámica
141
f N* ( R2 ) = f N * −1 ( R1) 2. Determinar la política óptima para tres horas de funcionamiento del sistema, si empezamos con las dos máquinas en funcionamiento.
A partir del modelo anterior calculamos la política óptima del sistema. Para n = 3 tendremos: f 3(M2, MAN) = 50 f 3(M2, NMA) = 55’6 f 3*(M2) = 55’6 x3*=NMA f 3(M1, REP) = 0 f 3(M1, NRE) = 32 f 3*(M1) = 32
x3*=NRE
f 3*(R1)=0 f 3*(R2)=0 Para n = 2 tendremos: f 2(M2, MAN) = 50 + 55’6 = 105’6 f 2(M2, NMA) = 55’6 + 0’64·55’6+0’32·32+0’04·0=101’424 f 2*(M2) = 105’6x2*=MAN f 2(M1, REP) = 0+55’6=55’6 f 2(M1, NRE) = 32+0’6·32+0’4·0=51’2 f 2*(M1) = 55’6 x3*=REP f 2*(R1)=55’6 f 2*(R2)=0 Para n = 1 tendremos: f 1(M2, MAN) = 50 + 105’6 = 155’6 f 1(M2, NMA) = 55’6 + 0’64·105’6+0’32·51’2=139’568 f 1*(M2) = 139’568 x1*=MAN Por tanto la política será: { NMA, REP, R1, R2 } 3. Si, en el largo plazo, se opta por no realizar el mantenimiento preventivo y por reparar las máquinas inmediatamente después de que se averíen, determinar cuál sería el valor esperado de la producción horaria para esta política.
A partir del enunciado obtendremos la siguiente matriz y vector q:
Métodos cuantitativos de organización industrial II
142
0'64 0'32 0 0'04 1 0 0 0 P= 1 0 0 0 0 1 0 0
55'6 0 q= 0 0
cuyo grafo será:
M2
M1
R1
R2
A partir de la matriz P y el vector q, planteamos el siguiente sistema de ecuaciones g + w1 = 55’6 + 0’64·w1 + 0’32 w2 + 0’004·w4 g + w2 =w1 g + w3 =w1 g + w4 =w3 Resolviendo el sistema de ecuaciones obtenemos que la ganancia g valdrá 39’71 unidades. 4.8 Glosario de términos Aleatoria, programación dinámica: Ver programación dinámica. Determinista, programación dinámica: Ver programación dinámica. Estado:
Variable descriptiva de la información necesaria para conocer la evolución del sistema a partir de ese momento. Dicha evolución dependerá de los valores del estado y de los valores de la variable de decisión. Función de recurrencia:
Función que buscamos optimizar al resolver un modelo de programación dinámica. Para que la programación dinámica sea operativa, dicha función debe ser recursiva. Homogénea, programación dinámica:
Modelo de programación dinámica para el que la definición de sus elementos (estados, variable de decisión y función de recurrencia) es la misma para todas las etapas del sistema. No homogénea, programación dinámica:
Cualquier modelo de programación dinámica que no cumpla la propiedad que caracteriza a la programación dinámica homogénea: la homogeneidad a lo largo de las etapas de los estados, variables de decisión y función de recurrencia. Política:
Programación dinámica
143
La política es una regla de decisión para una determinada etapa. Consiste en los valores de las variables de decisión que optimizan el comportamiento del sistema a partir de esa etapa, para cada uno de los estados del sistema. Proceso polietápico:
Se trata de un proceso que puede dividirse en etapas, representativas de la evolución temporal de dicho proceso. Dicho proceso va evolucionando (de manera determinista o aleatoria) entre un conjunto de estados posibles. Algunos procesos polietápicos contemplan la posibilidad de tomar una decisión al principio de cada etapa. Así, la evolución del sistema en el futuro dependerá de la decisión que se tome y del estado en que se encuentre el sistema en la etapa anterior. Programación dinámica:
Estrategia de resolución de problemas que pueden representarse como procesos polietápicos de decisión. Podemos distinguir dos tipos de programación dinámica: si podemos conocer la evolución del sistema una vez tomada la decisión, tendremos un modelo de programación dinámica determinista. Si la evolución del sistema no está determinada, sino que puede evolucionar a diferentes estados según una ley de probabilidad conocida, el modelo será de programación dinámica aleatoria. Recursividad:
Una función descriptiva del comportamiento de un proceso polietápico es recursiva cuando sus valores para una etapa determinada dependen de los valores que pueda tomar la función en las siguientes etapas. Variable de decisión:
Variable descriptiva de las decisiones que pueden tomarse en un determinado estado. Dependiendo del modelo, el rango de valores que puede tomar la variable de decisión puede depender del estado en que se encuentre el sistema.