libreria de programacion dinamica - uniandes
TRANSCRIPT
LIBRERIA DE PROGRAMACION DINAMICA
Trabajo de Tesispresentado al
Departamento de Ingenierıa Sistemas y Computacion
por
Juan Francisco Redondo Fajardo
Asesor: Rafael Garcıa
Para optar al tıtulo deIngeniero de Sistemas y Computacion
Ingenierıa de Sistemas y ComputacionUniversidad de Los Andes
Agosto 2006
LIBRERIA DE PROGRAMACION DINAMICA
Aprobado por:
Rafael Garcıa, Asesor
Fecha de Aprobacion
A mi familia, quienes me han brindado todo su apoyo
y aquellas personas allegadas que siempre han estado,
en las buenas y en las malas.
iii
Prefacio
La programacion dinamica es una de las metodologıas implementadas para solu-
cionar una gran variedad de problemas. Esta tecnica, si se utiliza en su forma mas
pura, ofrece algoritmos de solucion que, dada su naturaleza recursiva, tiene comple-
jidad temporal exponencial en la mayorıa de los casos.
La metodologıa para encontrar soluciones a este tipo de problemas, propues-
ta por Bohorquez[4], muestra que definiendo estructuras de datos adicionales que
almacenen las soluciones, se evita volver a realizar caculos correspondientes a sub-
problemas, ya que las soluciones pueden ser llevados acumulativamente; tambien se
evita realizar calculos innecesarios, al tratar de calcular una solucion a un subproble-
ma, ya antes solucionado, literalmente se cambia espacio por tiempo. Cabe nombrar
que esta librerıa busca ser una herramienta que estandarice el proceso de modelaje de
problemas de programacion dinamica, ası que ingresando datos del problema en las
funciones de la librerıa, se podrıa encontrar una solucion en un tiempo polinomial.
Por esto se ve la necesidad y la viabilidad de la implementacion de un API, que
ubica al usuario en un mundo limitado a la insercion de datos que son requeridos y
con estos se encontrarıa la solucion al problema de programacion dinamica, esto se
hace instanciando a la clase DynamicSolver, para luego darle los datos correspondi-
entes al problema, de esta forma, la solucion es alcanzada sin que el usuario sepa la
implementacion de alto nivel que utiliza memorizacion y division en subproblemas.
La librerıa exige datos basados en un problema bien modelado, para satisfacer
todas las funciones del API, que logren una solucion optima, de no cumplirse se
llegarıa a soluciones incorrectas o infactibilidades de realizacion.
iv
Este proyecto contribuye con un proceso de aprendizaje y especializacion, mez-
clando areas de investigacion de operaciones de ingenierıa industrial y de diseno de
algoritmos de ingenierıa de sistemas y computacion.
El proyecto cuenta con el lanzamiento de un API de JAVA, que cambia la
forma de hallar la solucion a cualquier problema de programacion dinamica, ya que
apoyados a este, simplemente se plantea, modela e ingresa los datos del problema
que esta limitados por los parametros de los metodos de la librerıa.
Para tener una lectura amena de esta tesis, a continuacion se explicara los temas
que contiene cada capıtulo de este documento.
Inicialmente en el prefacio, se encuentra una introduccion sobre este desarrollo,
un breve ¿que?, ¿para que?, ¿por que?, y ¿como leer la tesis?; luego en el capıtulo
uno, esta una introduccion teorica acerca de la programacion dinamica, que prob-
lemas soluciona, la existencia de metodologıas para atacar estos problemas, ademas
de varias generalidades sobre conceptos basicos, es decir, un diccionario simple, que
para lectores con pocos conocimientos del tema, clarifica ideas basicas; un capıtulo
importante es el numero dos, donde el modelo y metodologıa implementados se ven
explıcitos, ademas muestra la estructura base para la realizacion del proyecto, es
decir, todo el ciclo de diseno del API; en el capıtulo tres se hace un paralelo entre la
metodologıa mencionada en 1.5 y el ¿como se implemento el proyecto?, explicando
las estructuras de datos y la funciones que este posee, acorde con la metodologıa
utilizada; y por ultimo, en el cuarto capıtulo se encuentran las conclusiones y de-
sarrollos futuros de la tesis, para que esta librerıa abarque aun mas problemas de
programacion dinamica. Para finalizar la induccion a la lectura de este documento,
se anexa un manual que explica como el problema del morral es solucionado in-
gresando los datos que la librerıa exige, este problema es uno de los ejemplos mas
famosos de la programacion dinamica. En los anexos existe una investigacion y con-
clusiones sobre que variables se necesita tener para poder desarrollar un problema
de programacion dinamica, donde la conclusion fue una validacion al modelo usado
en la tesis. Adicional al documento, se encuentra un disco compacto que contiene la
librerıa y los javadoc que muestran la documentacion interna del proyecto.
v
Reconocimientos
A Rafael Garcia, por su colaboracion, paciencia y animo, en el desarrollo de este
API.
A German Riano, por motivar el interes en esta area del conocimiento.
vi
Tabla de Contenido
Dedicatoria III
Prefacio IV
Reconocimientos VI
I. Introduccion a la programacion dinamica 1
1.1. Definicion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Enfoques de la programacion dinamica . . . . . . . . . . . . . . . . 2
1.3. ¿Que se puede solucionar con esta metodologıa? . . . . . . . . . . . 3
1.4. Marco teorico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5. Metodologıa aplicada de programacion dinamica . . . . . . . . . . . 5
II. Modelaje y diseno del problema 7
2.1. Elementos basicos de los problemas de programacion dinamica . . . 7
2.2. Planteamiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.3. El problema del morral . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4. Planteamiento del morral bajo la metodologıa . . . . . . . . . . . . . 11
2.5. Diseno de la implementacion . . . . . . . . . . . . . . . . . . . . . . 17
2.6. Requerimientos funcionales . . . . . . . . . . . . . . . . . . . . . . . 17
2.7. Requerimientos no funcionales . . . . . . . . . . . . . . . . . . . . . 19
2.8. Casos de uso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.8.1. Usuario con pocos conocimientos en modelar un problemade programacion dinamica . . . . . . . . . . . . . . . . . . . 20
2.8.2. Usuario con altos conocimientos en modelar un problema deprogramacion dinamica . . . . . . . . . . . . . . . . . . . . . 20
vii
2.9. Diagrama de Clases . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
III. Desarrollo de la librerıa 22
3.1. Generalidades del Desarrollo . . . . . . . . . . . . . . . . . . . . . . 22
3.2. Componentes del Problema . . . . . . . . . . . . . . . . . . . . . . . 23
3.3. Estructura de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.1. Los estados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3.2. Pregunta y etapas . . . . . . . . . . . . . . . . . . . . . . . . 23
3.4. API para problemas de programacion dinamica . . . . . . . . . . . . 24
3.4.1. Conjunto de estados . . . . . . . . . . . . . . . . . . . . . . . 24
3.4.2. Pregunta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.4.3. Condiciones inductivas . . . . . . . . . . . . . . . . . . . . . 24
3.4.4. Operador de la funcion Objetivo . . . . . . . . . . . . . . . . 25
3.4.5. Funcion aplicada a estados sucesores . . . . . . . . . . . . . . 25
3.4.6. Funcion de valor en el caso base . . . . . . . . . . . . . . . . 26
3.4.7. Funcion de valor en el caso inductivo . . . . . . . . . . . . . 26
3.4.8. Memorizacion . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.4.9. Librerıa JEP . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
IV. Conclusiones y futuros desarrollos 28
4.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.2. Futuros avances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Apendice A. — Manual Operativo sobre el problema del morral 30
Apendice B. — Investigacion previa 34
Referencias 37
viii
Capıtulo I
Introduccion a la programacion dinamica
1.1. Definicion
Programacion dinamica es un metodo utilizado para reducir la complejidad o
tiempo de ejecucion de los algoritmos, esto mediante la utilizacion de problemas
superpuestos y subestructuras adicionales. el matematico Richard Bellman fue la
primera persona en plantear la ecuacion base para la programacion dinamica, ver
Bellman[2].
Aunque el termino contiene la palabra programacion, dista mucho de lo que en
realidad implica1 y esto es resolver problemas donde se calcula la mejor solucion
consecutivamente.
Pero, ¿que es una subestructura adicional? El termino indica que soluciones
optimas de subproblemas, pueden ser usadas para encontrar soluciones optimas del
problema total. Por definicion se puede resolver problemas con subestructuras adi-
cionales mediante los siguientes pasos:
1. Dividiendo el problema en subproblemas mas pequenos
2. Encontrando la solucion optima de estos subproblemas usando este mismo
proceso de tres pasos2 , de forma recursiva.
3. Construir la solucion optima del problema con las soluciones de los subprob-
lemas.
1Esta palabra no hace referencia a programacion como tal, pero si a programacion matematica.2Al proceso de tres pasos se conoce como dividir y vencer o dividir y conquistar.
1
Los subproblemas se resuelven a su vez, con subproblemas que surgen de estos
mismos, ası se van haciendo mas sencillos de solucionar hasta llegar al caso base,
donde la solucion es trivial Cormen[6].
Se debe notar que una mala implementacion de programacion dinamica puede
incurrir en desperdicios de tiempo. Pues podrıa volver a calcular soluciones a sub-
problemas que ya se saben de antemano. Para solucionar este detalle, y bajar la
complejidad de un algoritmo de programacion dinamica, guardando las soluciones
que ya se han calculado. Esta metodologıa se conoce como memorizacion.
A lo largo del documento se hablara del problema del morral, con el fin de
hallar similitudes entre la teorıa y la practica, haciendo mas facil la lectura y el
entendimiento de este documento. En breve, este problema, sugiere un morral que
cuenta con cierta capacidad, ademas se cuentan con objetos que se pueden meter
dentro del morral, cada uno con un costo de capacidad y un valor o beneficio al
cargarlo en el morral. Se pretende encontrar la combinacion de objetos que max-
imicen la utilidad generada en conjunto entre los objetos incluidos en el morral,
simplemente teniendo bajo restriccion que estos objetos quepan.
1.2. Enfoques de la programacion dinamica
De arriba a abajo
El problema se empieza a dividir en subproblemas, se solucionan los que no han
sido resueltos, a medida que se divide en subproblemas y se recuerdan los que han
sido resueltos, combinando induccion y memorizacion3 .
De abajo a arriba
Primero se solucionan absolutamente todos los problemas que se requieran para
la implementacion de antemano y luego, ya teniendo sus soluciones, estas son uti-
lizadas para resolver a los problemas mayores. Es poco intuitivo, pero ahorra espacio
y llamados a funciones.
3Nota: Este fue el metodo utilizado para la implementacion de la librerıa, ya que es el masintuitivo.
2
1.3. ¿Que se puede solucionar con esta metodologıa?
Algunos de los problemas que se pueden resolver son los siguientes:
1. Problema de caculo de sucesion Fibonacci: La forma para ser calculado es
netamente inductiva, el valor de este calculo, es la suma de los dos ultimos
resultados teniendo como caso base, la funcion evaluada en cero o en uno, que
genera como resultado uno.
2. Problema de inventario: Es considerado un problema de ordenar una canti-
dad de cierto tipo de items para cada N periodos, hasta encontrar los montos
necesarios para suplir la demanda, ya obtenida de manera estocastica o de-
terminista, ver Bertsekas[3]. Este problema contiene, ci, que es el inventario
disponible en el periodo i-esimo, cpi un inventario pedido en el comienzo de
cada i-esimo periodo y un di que es la demanda durante el i-esimo periodo,
dada por la distribucion de probabilidad. Entonces ci+1 = ci + cpi + di, de
aquı surgen: Un costo de oportunidad o(ci), que es una penalidad por tener
exceso, el costo de hacer el pedido por unidad C(cpi) y M(cN) el costo de
mantener un inventario al final de los N periodos entonces el costo total, esta
descrito.
E{M(cN) +∑N−1
i=0 C(cpi) + o(ci)}
La solucion encontrar el conjunto de objetos que en la etapa N , minimice mi
costo.
3. Ruta mas corta: Se conoce como al problema de encontrar la mejor ruta entre
un vertice y los demas vertices de un grafo conecto ver Ahuja[1]. La forma de
resolver este ejemplo es segmentado, si se encuentran las rutas mas cortas entre
los puntos, y se va analizando que ocurre si se ingresa mas puntos, luego de
desarrollar todos los posibles caminos a los puntos, con ayuda de las soluciones
parciales se puede generar una solucion definitiva.
3
Los anteriores son algunos de los problemas que puede solucionar esta metodologıa.
Algunos cuentan con caraterısticas similares y pueden estar contenidos dentro de
otros, ya mencionados. Este documento se apoya, en el problema del morral que
es uno de estos problemas de programacion dinamica. Un problema en donde la
tecnica de programacion dividir y vencer, funciona. En general, cualquier problema
que su solucion pueda ser hallada partiendo el problema en subproblemas y que las
soluciones de los subproblemas sirvan para hallar la solucion del problema global,si
el problema no llega a desbordar la capacidad de la memoria, esta metodologıa en
teorıa lograrıa resolverlo.
1.4. Marco teorico
Estado Componente de una red o grafo, es un punto, nodo o vertice, el cual
diferencia una posible situacion, y esta definido por un nombre y una funcion de
valor. El conjunto de estados de G se denota como V(G), y donde el orden de un
grafo es el numero de estas | V (G) |. En el caso del morral, los estados constituyen
a los objetos que pueden estar dentro del morral.
Accion Es una decision posible que se puede tomar en cada estado. Asocian a
un estado con otro estado, tambien conocidos como arcos o transiciones. El conjunto
de arcos de G se denota E(G) y donde el tamano de un grafo es el numero de arcos.
| E(G) |. El grado de un nodo es la cantidad de arcos que salen de este. En el ejemplo
del morral los estados se conectan con los otros estados, de acuerdo a la funcion de
sucesores que el usuario implemente.
Red Es un conjunto de estados, relacionados entre si por acciones y se denota
como G := (V,E), esto en el caso de no ser dirigido. En el caso de ser dirigido, E, es
cambiado por un conjunto de parejas ordenadas, que indican el estado inicial y cual
estado destino.
Arbol
Es un grafo simple conectado y acıclico. Se le conoce como hojas a los nodos con
grado 1. En este caso cada nodo, corresponde a un estado, los estados que provienen
del mismo nodo hermanos, se encuentran en la misma etapa, es decir, que cada piso
que tenga el arbol corresponde a otra etapa, en el caso del morral, los estados que
4
se encuentran en la misma etapa, son objetos que caben dentro del morral sabiendo
que ya hay o no, otros dentro.
Programacion dinamica
La programacion dinamica es una tecnica de solucion de problemas, pero cuya
implementacion directa es ineficiente, por eso, se plantea la definicion de estructuras
de datos que almacenen calculos, para evitar calculos repetidos e innecesarios. Lit-
eralmente cambiando espacio por tiempo. Si el algoritmo que se mejora es iterativo,
se acelerarıa manejando una invariante, minimizando el uso de mucho mas calculos
en la implementacion del programa.
1.5. Metodologıa aplicada de programacion dinamica
Como funciona esto:
1. Se define un lenguaje para establecer formalmente el problema. Se incluye
notacion para la funcion f, cuyo caculo es un valor especifico x0, corresponda
a la solucion del problema
2. Se establece una recurrencia que defina la funcion f en un dominio que incluya
a x0.
3. Se estudia la recurrencia, determinando un diagrama de necesidades, para cada
elemento x del dominio de f, establecer para que elementos se debera conocer
el valor de f para poder calcular f(x)
4. El diagrama de necesidades sugiere un invariante para un ciclo que calcule
todos los valores previos necesarios para evaluar f(x0). Ademas de un orden
de evaluacion para los elementos del dominio de f.
De esta forma se puede disminuir la complejidad temporal considerablemente,
apoyando el tan conocido, dividir y conquistar. Por otra parte, ya que hay calculos
almacenados en la estructura de datos, y existe un orden de evaluacion, se puede
apoyar en los calculos ya realizados y obtener los nuevos valores, de igual forma
tambien guardar los datos ya obtenidos para que no sean vueltos a calcular.
5
Al crear una librerıa para resolver problemas de programacion dinamica, se debe
recurrir a la generalizacion de los problemas dinamicos, separando por niveles, los
datos y librerıa; con esta separacion se trataron varios problemas para analizar,
cuales son los datos necesarios para desarrollar problemas de esta ındole.
Para entender un poco mas esta tecnica de solucion se debe ver el planteamiento
del problema del morral bajo la misma metodologıa, ver 2.4.
6
Capıtulo II
Modelaje y diseno del problema
2.1. Elementos basicos de los problemas de programaciondinamica
1. El problema puede dividirse en etapas, con una decision de la polıtica requerida
en cada etapa. En el caso del morral se divide en varias etapas que estan
asociadas a la capacidad restante. Es decir, si tengo una capacidad N y un costo
por objeto i ci, la siguiente etapa esta definida, (N−ci) y la decision es, en este
caso, la elegir que objeto maximiza el beneficio para esa etapa. Ademas existe
problemas de programacion dinamica que requieren analogamente de tomar
sucesion de decisiones interrelacionadas y en otros, la toma de decisiones no
se encuentra relacionada.
2. Cada etapa tiene un numero de estados asociados a esta. Los estados asociados
con cada etapa en el problema del morral, son los objetos que se quieren meter
al morral, los cuales tienen ademas un valor vi, si ese costo ci cabe dentro del
costo libre para esa etapa, el objeto o estado esta asociado a esa etapa t. En
general, los estados son las diversas condiciones posibles en las que el sistema
podrıa estar en esa etapa del problema, estos pueden ser finitos o infinitos.
3. El efecto de la decision de una polıtica en cada etapa es; transformar el estado
actual en un estado asociado con la etapa siguiente. En el ejemplo del morral,
se tiene una capacidad y esta es disminuida con el costo de ingresar un objeto
en el morral, se soluciona ese subproblema y queda una capacidad restante,
que es el nuevo espacio disponible en el morral para ingresar objetos i, y sobre
7
esta se vuelve a realizar el mismo proceso, hasta llegar al caso trivial, que para
este seria que no quepa mas objetos i, en el morral. Con los valores obtenidos
por cada etapa se empieza a armar una contribucion a la funcion objetivo en
este caso, metiendo en el morral la combinacion de objetos que maximicen el
valor del conjunto de objetos.
4. Dado el estado actual, una polıtica optima para las etapas restantes. En el
ejemplo del morral, Dado un objeto i que se desea evaluar para ingresar dentro
del morral, desde ese punto en adelante es independiente de como llego allı.
Para los problemas de programacion dinamica en general, el conocimiento del
estado actual del sistema comunica toda la informacion de su comportamiento
previo, necesaria para determinar la polıtica optima de allı en adelante. Esta
propiedad se conoce como el principio de optimalidad.
5. El procedimiento de solucion empieza por hallar la polıtca optima para cada
estado de la ultima etapa. Comunmente, la solucion de este problema para la
ultima etapa es trivial. En el caso del morral, se llega al caso trivial cuando
de esa etapa no se pueden generar mas etapas, y eso ocurre cuando no existe
capacidad restante para insertar cualquier otro objeto.
6. Se dispone de una relacion recursiva que identifica la polıtica optima para
cada estado en la etapa n, dada la polıtica optima para cada estado en la
etapa (n+1)
f ∗n(s) = maxxn(vs|xn + f ∗n−1(xn))
Por lo tanto, hallar la polıtica optima cuando se parte del estado s, quiere
que se encuentre el valor que maximice xn. Esta polıtica consiste en usar este
valor de xn, seguir la polıtica optima cuando se parte del estado xn en la etapa
(n-1). La forma precisa de la relacion recursiva difiere algo entre los problemas
de programacion dinmica. Ası sea, variable o vector xn, la variable de decision
en la etapa n. Sea fn(s, xn), el valor que maximiza la funcion objetivo. dado
que el sistema parte del estado s en la etapa n y se selecciona xn. Ası que
8
para el problema del morral, fn(s, xn) = vs|xn + f ∗n−1(xn), siendo f ∗n(s) el valor
maximo de fn(s, xn) sobre todos los valores posibles de xn; entonces la relacion
recursiva siempre sera de la forma: f ∗n(s) = max fn(s, xn), en donde se escribirıa
fn(s, xn), en terminos de s, xn, f ∗n y de alguna medida de la primera etapa de
la efectividad o no efectividad de xn
7. Usando esta relacion recursiva, el procedimiento de solucion se mueve hacia
atras, etapa por etapa, hallando la polıtica optima, para cada estado de esa
etapa, hasta que se encuentra la polıtica optima cuando se parte de la etapa
inicial,
Eso se demostro en el problema del morral, en el que se encontro la polıtica
optima, para todos los estados y para todas las etapas. Para hacer analisis,
todos los problemas de programacion dinamica, se puede tener una tabla que
contiene s, f ∗n(s) y xn, cuando se obtiene esta tabla para la etapa inicial, se
resuelve el problema. Ya que se conocerıa el estado inicial, la decision inicial
especificada por x∗1. Entonces, a su vez se especifica el valor optimo de las
otras variables de decision mediante otras tablas, de acuerdo con el estado del
sistema que resulta de la decisiones precedentes. ver Hillier[5].
2.2. Planteamiento
Para la metodologıa usada en este proyecto, un problema de programacion
dinamica requiere de:
1. Una funcion objetivo f que tiene un operador, el cual busca encontrar la solu-
cion optima para ese problema, el resultado de esa funcion es generado induc-
tivamente, y a ese se nombra valor inductivo. En el caso del morral se busca
maximizar el beneficio llenando el morral con la mayor cantidad de objetos
que generen mas valor conjunto, ver 2.3.
2. Una pregunta P, que en realidad es la evaluacion de una funcion asociada a
la funcion objetivo, a la polıtica alcanzada, en algun estado o valor entero.
Sobre el cual se desea concluir. En el caso del morral la pregunta es cual es el
9
conjunto de objetos que maximizan la funcion objetivo dado que se dispone
de una capacidad C.
3. Los datos del problema:
Estados Estos son los estados se pueden describir como el conjunto de op-
ciones con los cuales cuenta el problema en cada etapa, a los estados que
no tienen predecesores se les conoce como estados iniciales, y de estos sur-
gen todos los estados de la siguientes etapas, y los estados que no tienen
sucesores se conocen como estados finales.
Caso Base Cuando el problema se descompone en subproblemas, ası sucesi-
vamente has que se intenta resolver el caso trivial, luego de este, no hay
mas etapas posibles, por eso, este arroja una solucion.
Caso Inductivo El problema se divide en subproblemas ayudado por la condi-
cion que genera los estados sucesores, para que luego el caso base o nue-
vamente los casos inductivos retornen valores ya acumulados, que hacen
parte de la polıtica optima. y el beneficio va a ser parte de la funcion
objetivo.
Funcion suc:, encontrar sucesores Esta funcion notada como h, se en-
cuentra asociada a cada caso inductivo, ya que los estados sucesores son
manipulados para generar nuevos sucesores’, cada sucesores se encuen-
tran en otra etapa diferente a la etapa de sus predecesores. Y entre estos
compiten para maximizar la funcion objetivo.
Funcion h, para el caso base Esta funcion en el caso base, genera el com-
portamiento de la funcion de valor en el caso base o caso trivial.
Funcion h, para el caso inductivo Esta funcion indica el comportamiento
de la funcion de valor mientras se va desarrollando la induccion.
2.3. El problema del morral
El problema del morral es uno de estos problemas de programacion dinamica,
donde unos objetos i ∀1≤i≤n, que se desean ingresar dentro del morral con capacidad
10
P , estos objetos i tienen un costo de capacidad pi, una cantidad de objetos oi y
un valor o beneficio ui, se busca llenar el morral con la cantidad objetos optima, es
decir,n∑
i=0
pioi ≤ C
cuantos objetos caben en el morral y
max f(oi, ui)
, la funcion objetivo f, depende de conjunto de elementos que se encuentran en
el morral y el valor que estos en conjunto generan; en otras palabras, encontrar la
combinacion de objetos que maximicen el beneficio dado por la funcion objetivo.
Donde la pregunta para este caso seria maximizar la funcion objetivo, para una
capacidad P ya dada.
2.4. Planteamiento del morral bajo la metodologıa
En esta seccion, se muestra el problema del morral, utilizando la tecnica de solu-
cion de problemas de programacion dinamica dividir y vencer, tomado de Bohorquez[4].
El problema del morral es un problema clasico de la investigacion de operaciones.
Una solucion recurrente ingenua puede resultar demasiado onerosa. La solucion que
se presenta, utilizando programacion dinamica, es eficiente y practica1 .
El problema:
Dados
n objetos, o1, ..., on
Para i = 1, ..., n, pi es el peso de oi. Naturalmente, pi > 0
Un morral, que soporta un peso maximo P .
1A pesar de ser un problema NP-completo, la solucion que se presenta es eficiente en la praxis,si se concede que los numeros involucrados no sean arbitrariamente grandes
11
Para i = 1, ..., n, si se carga en el morral el objeto oi , se obtiene un beneficio
o utilidad ui.
Se quiere maximizar la utilidad de cargar en el morral algunos objetos.
El lenguaje
ut(j,x) : Utilidad maxima que se consigue, si los objetos que se pueden cargar
se eligen entre o1,...,oj, si el peso maximo que se puede soportar es x.
ut(n,P) : Respuesta deseada.
La recurrencia
ut(j,x)= 0 , si j=0
= ut(j-1,x), si 1 ≤ j ≤ n, 0 ≤ x< pj
= max{ut(j-1,x), ut(j-1,x-pj ) + uj}, si 1 ≤ j ≤ n, 0 < x≤ pj
El diagrama de necesidades
Figura 1: Diagrama de necesidades
El algoritmo
12
Ası:
T (n, P ) = O(nP )
S(n, P ) = nP
Mejoras: El algoritmo puede mejorarse, si se observa con mas cuidado el diagrama
de necesidades: basta guardar unicamente las dos ultimas columnas calculadas:
Ası:
13
T (n, P ) = O(nP )
S(n, P ) = 2P
El ahorro en espacio es significativo. La situacion puede, incluso, mejorar hasta
lograr que se deba almacenar solo una columna, si se piensa que se puede mantener
un invariante que afirme:
14
El nuevo algoritmo puede escribirse de la siguiente forma:
Hasta aquı, se ha solucionado el problema de conocer cual serıa la utilidad maxi-
ma posible. En la practica se quiere averiguar, ademas, en que forma se puede
alcanzar este optimo.
Ahora, ¿como saber que objetos se llevan?
La tecnica se extiende para considerar una funcion adicional que permita recordar
las decisiones que se tomaron en el calculo del optimo. Los valores de esta funcion
deben almacenarse para construir la respuesta a la nueva pregunta.
Para este caso:
15
sel(j,x) : 1 si oj se lleva, cuando el peso maximo permitido es x,
: 0 si oj no se lleva, cuando el peso maximo permitido es x.
Notese que:
sel(j,x) = 1 ⇔ 0 < j ≤ P ∧ x ≥ pj cand ut(j-1,x-pj)+uj
Con esta definicion, el algoritmo puede modificarse para calcular sel :
Se debe observar que la estructura del algoritmo que calcula el optimo se respeta
y se utiliza como plataforma sobre la que se puede, adicionalmente, escribir codigo
que permita recordar las decisiones tomadas.
16
Finalmente, para determinar que objetos se pueden llevar para conseguir la util-
idad maxima, defınase, para 1 ≤ i ≤ n :
x[i]= 1 ⇔ oi se lleva, para alcanzar el optimo.
El siguiente algoritmo, que calcula en el arreglo X[1..n] el vector x[1..n]:
2.5. Diseno de la implementacion
A continuacion se encuentra el ciclo de diseno de la aplicacion y se encuentra
dividido en: Levantamiento de requerimientos, el cual consta de las cosas que esta
aplicacion debe hacer y se encuentra segmentado en requerimientos funcionales,
propios de la aplicacion para que esta cumpla con su objetivo y requerimientos no
funcionales, que son parte de la calidad del programa; luego los posibles casos de
uso, explicado para cada usuario que pueda usar la librerıa; por ultimo un diagrama
de clases, el cual contiene el conjunto de estructuras de datos, separadas por objetos,
con sus respectivos atributos o variables y sus metodos, que son aquellas funciones
que sirven para interactuar entre objetos.
2.6. Requerimientos funcionales
1. Hallar el escenario optimo, o conjunto de escenarios optimos por etapa, de un
problema bien modelado.
17
2. Tendra la capacidad de amoldarse ante cualquier tipo de problema de progra-
macion dinamica con que el usuario se encuentre. Y encontrar una solucion
optima, factible, etc., todo esto, dependiendo de la forma como se plantee el
problema.
3. Desarrolla un esquema de estados alcanzables a partir de las condiciones in-
ductivas presentadas.
4. Con javadoc y un manual de soporte para el API, se facilitara el entendimiento
de este.
5. Los resultados seran explıcitos con el valor final de la f.o, tambien llamado
f(x0) decision asociada a cada mejor estado en cada etapa.
6. El API tendra metodos para resolver tanto problemas determınisticos, esto
esta sujeto a la metodologıa del desarrollo.
7. El usuario, debe indicar claramente la funcion objetivo de la cual deriva su caso
base y su caso inductivo, como avance al desarrollo y facilitar, el recorrido entre
estados y etapas, el usuario en el planteamiento del problema podra agregar
un caso transitivo, que evite recorrer mas estados y acelere el encontrar el caso
base.
8. El usuario podra agregar condiciones
9. El usuario de acuerdo a su metodologıa podra encontrarse con un resultado
optimo hallado de forma eficiente, un resultado optimo encontrado de una
forma no eficiente, o no alcanzar el caso base, por mal planteamiento del
problema. Casos de ciclaje o infactibilidad.
10. La separacion de tres niveles: datos, problema y programa; existe por lo sigu-
iente
a) Usuario es responsable de ingresar los datos como el API los exige.
18
b) De acuerdo a la mezcla entre parametros requeridos y opcionales, se puede
atacar de diferentes formas un problema dinamico, ya que en el fondo,
todos los problemas dinamicos concuerdan en varios detalles.
c) De acuerdo a investigaciones soportadas por Bellman, el principio de pro-
gramacion dinamica es el mismo, y se encuentra basado en una ecuacion
sencilla, que fue la base de este desarrollo.
11. El problema no requiere definicion de etapas, ya que genericamente es atem-
poral, pero manejando responsablemente y con un buen modelaje los estados
pueden aparecer modificando las condiciones. El control de recorrido y de eta-
pas queda a cargo del API.
12. El usuario se hace responsable del buen modelaje del problema para una buena
insercion de los datos del problema dinamico al API.
2.7. Requerimientos no funcionales
1. La librerıa implementa la tecnica de programacion antes mencionada como
dividir y vencer, ademas de estructuras de datos que memoricen calculos, para
que esta sea eficiente, aumentando la respuesta en tiempo.
2. La librerıa tiene muy bien definida en sus estructuras, el problema y los ele-
mentos de este.
3. La librerıa debe estar bien documentada.
4. Se debe tener un manual que sirva para ilustrar como insertar datos de un
ejemplo para encontrar una solucion a un problema de programacion dinamica.
5. Como fue mencionado este desarrollo va ser implementado en JAVA.
19
2.8. Casos de uso
2.8.1. Usuario con pocos conocimientos en modelar un problema deprogramacion dinamica
1. Insertar datos requeridos, el usuario puede insertar estos datos basandose en
un ejemplo ya realizado y apoyandose en un manual.
2. Este usuario encontrara soluciones al problema, al cual sencillamente modif-
ico los datos que recibıa el API.
2.8.2. Usuario con altos conocimientos en modelar un problema deprogramacion dinamica
1. El usuario experto puede utilizar la librerıa como una librerıa para cualquier
aplicacion, no solo botando resultados sino, siendo parte de un desarrollo para
toma de decisiones.
2. De acuerdo a los datos requeridos y opcionales, el usuario podra modificar la
insercion y mezclar entre estos, definiendo bien un problema
3. Agregar nuevos ejemplos con el lenguaje. Para usuarios inexpertos.
4. Insertar datos requeridos, el usuario puede insertar estos datos basandose en
un ejemplo ya realizado y apoyandose en un manual.
5. Mediante un comando el usuario puede genere una solucion optima factible,
de acuerdo a la metodologıa utilizada en el programa.
6. Los resultados deben ser presentados en la consola de JAVA
2.9. Diagrama de Clases
20
Fig
ura
2:
Diagram
ade
clases
21
Capıtulo III
Desarrollo de la librerıa
3.1. Generalidades del Desarrollo
Con los concepto tomados en el modelaje del problema, se puede hacer un parale-
lo con este capitulo, aquı se convierte el modelo de la solucion en estructuras de datos
y funciones que van acordes a la metodologıa.
Este proyecto de grado consta del desarrollo de un API (Application Program-
ming Interface - Interfaz de Programacion de Aplicaciones; un conjunto de especifica-
ciones de comunicacion entre componentes software) de programacion dinamica para
JAVA , basados en la metodologıa vista en el capıtulo dos. El API tendra funciones
que permitan crear y recorrer el conjunto posible de estados, para ser evaluados y en-
contrar soluciones optimas a los problemas planteados. Los metodos son facilmente
entendibles, concisos para que el usuario ingrese los datos, paso a paso, sin mayores
traumas.
El punto crıtico de este trabajo por parte del usuario, es en un buen modelaje
de los problemas de programacion dinamica, para que al usuario final tenga una
transparencia al llamar los metodos del API. Un mal modelaje del problema incur-
rira en una mala insercion de datos o resultados incoherentes, llegado a una solucion
erronea o simplemente inexistente. Un problema bien planteado podrıa tener solu-
cion, dependiendo de los estados y etapas que debe inspeccionar, ya que cada estado
en cierta etapa puede generar mas subproblemas y si el problema esta bien mode-
lado pero no esta acotado igualmente no tiene solucion por este metodo, al final, el
ahorro es en tiempo.
22
3.2. Componentes del Problema
Se analiza que los estados, deben guardar la informacion que es acumulada, para
luego que sea comparada entre estos y ver cual es el estado optimo y avanzar a la
siguiente etapa. Ademas el usuario puede hacer referencia a lo que le interese.
Un estado contara, con un apuntador a lo que el usuario desee. Contara con un
valor interno si es necesario, que sera asociado por el algoritmo, de acuerdo a como
se ingrese la deficion del problema.
Las restricciones estan asociadas entre variables que se encuentran en la funcion
objetivo y otras variables que se encuentran en el lenguaje definido por el usuario.
3.3. Estructura de datos
3.3.1. Los estados
Los estados contienen valores fijos y variables calculados que al estar almacenados
y permanecer en una estructura de arbol, simplifican drasticamente la complejidad
del algoritmo.
Costo: Cada estado tiene definido su costo asociado, este costo es de tipo entero,
ya que es un problema de programacion dinamica y no un algoritmo greedy.
Valor: Cada estado posee, un valor tipo real el cual es tenido en cuenta para
calcular la polıtica optima y la funcion objetivo.
Valor Inductivo: Este valor es un control y esta limitado, por la condicion
inductiva del problema, el calculo es generado, si el estado donde se encuentra es un
posible sucesor.
Formula de la funcion de valor: Este valor es acumulativo y corresponde al
valor inmediato que genera el incurrir en ese estado, mas todos los valores de los
estados que se obtuvieron para llegar a esa etapa.
3.3.2. Pregunta y etapas
Para evitar volver a procesar calculos ya realizados, se utiliza una estructura de
tablas de hash anidadas, con etapas y la pregunta que evaluada para los subproble-
ma genera un conjunto de preguntas mas sencillas de responder, si en la induccion
23
se encuentra con la misma etapa y con la pregunta que ya ha sido evaluada para el
subproblema, no es necesario desarrollar los calculos para obtener el resultado cor-
respondiente ya que fue calculado y memorizado,en la estructura antes mencionada.
3.4. API para problemas de programacion dinamica
Esta librerıa debe ser invocada, con todos los estados posibles, indicando la
condicion inductiva y haciendo explıcito que hacer con la funcion objetivo. En el
apendice, se encuentra un manual operativo basado en el ejemplo del morral, allı se
hace un paralelo entre esta seccion y el ejemplo se ha venido trabajando en este
documento.
3.4.1. Conjunto de estados
Es el primer parametro de la librerıa cuando se invoca el metodo
solve(),
en este caso es un Vector de objetos State, donde se indica la totalidad de estados
que la librerıa puede alcanzar o en su defecto los estados iniciales, pero indicando
en la condicion inductiva cuales son los posibles sucesores y en la funcion aplicada
a los estados sucesores decir que hacer con estos.
3.4.2. Pregunta
Es el segundo parametro del metodo
solve()
, en este caso es un Vector de objetos Integer, donde se indica la pregunta del
problema, para problemas de programacion dinamica, esta pregunta es inductiva, y
es divisible en subconjuntos, por eso, lo considere como un conjunto de enteros.
3.4.3. Condiciones inductivas
Es el tercer parametro del metodo
solve(),
24
en este caso es un Vector de objetos Condition, donde se indica que condicion se
debe cumplir, manipulando los nombre de las variables que se encuentran dentro de
los estados, para encontrar los sucesores a cada estado analizado, esta condiccion
por ende, al ser evaluada por el algoritmo que implementa esta metodologıa debe
retornar falso o verdadero.
3.4.4. Operador de la funcion Objetivo
Es el cuarto parametro del metodo
solve(),
en este caso es un String, donde se indica que tipo de operacion se va a realizar
con los valores resultantes en cada etapa. Es decir, si la funcion objetivo esta max-
imizando, entonces por etapas se debe encontrar el valor que maximice la funcion,
los mismo con la minimizacion, sumatoria, etc.
Para este caso se implementa las cadenas de caracteres MAX y MIN.
3.4.5. Funcion aplicada a estados sucesores
Este parametro es ingresado por una funcion que recibe un vector, por eso,
primero creo el vector, luego le agrego la funcion en una cadena de caracteres medi-
ante el metodo
next.add(s:String);
y luego agrego el vector a la librerıa
s.setNext(next);,
antes de ser llamado el metodo
solve(),
en este caso es un Vector, de objetos String, que contiene las mismas variables de
estado que manejan las condiciones inductivas, indicando el resultado a seguir de
los sucesores. Esta esta directamente asociada a cada caso inductivo, de esta forma
25
cada vez que se crea una condicion inductiva, se debe crear una funcion de este
tipo para que sea aplicada a los sucesores. La forma de asociarlos es simplemente
agregandolos en los vectores en el mismo orden, al final quedaran dos vectores el
primero con la condicion en la posicion i y su funcion correspondiente tambien en
la posicion i.
3.4.6. Funcion de valor en el caso base
Este parametro es ingresado por una funcion que pertenece al API
setBcVal(s:String),
antes de ser llamado el metodo
solve(),
en este caso es un objeto String que contiene las mismas variables de estado que
maneja la funcion aplicada a sucesores indicando con el resultado, que valor retorna
la induccıon al encontrarse con el caso base.
3.4.7. Funcion de valor en el caso inductivo
Este parametro es ingresado por una funcion que pertenece al API
setValueFormula(s:String), antes de ser llamado el metodo
solve(),
en este caso es un objeto String que contiene las mismas variables de estado que
maneja la funcion aplicada a sucesores, indicando con el resultado, que valor retorna
la induccıon al encontrarse con el caso inductivo.
3.4.8. Memorizacion
Se implemento en el metodo inductiveCalculated() en la clase
InductionClass, el cual guarda la pregunta evaluada bajo cierto valor correspon-
diente al subproblema, en cierta etapa. Esto se hace implementado dos niveles de
tablas de Hash. Uno para la etapa y otro para la pregunta evaluada bajo las condi-
ciones del subproblema.
26
3.4.9. Librerıa JEP
Para la manipulacion de condiciones, expresiones y para que el usuario desde un
nivel superior las programe literalmente, sin echar codificar en JAVA las funciones,
condiciones o datos, se utilizo una librerıa libre de JAVA, que convierte cadenas
de caracteres en expresiones evaluables, existen dos clases que implementan esta
librerıa JEP1 : Una llamada Condition que simplemente retorna falso o verdadero.
Otra llamada Expression que retorna un valor real. Esta librerıa es muy util, ya que
permite manejar variables, por eso, se le permite al usuario nombrarlas al invocar
el API, para que esos nombres queden asociados a las variables de estado, de las
cuales se hablo en la seccion componentes del problema en el punto correspondiente
a estado. Luego de asociarlas el usuario puede en las condiciones evaluarla, y en
las funciones que se aplican a los sucesores ocurrido algun caso, puede modificarlas.
Sin esta librerıa, el usuario no estarıa separado totalmente del API que encuentra
la solucion a los problemas de programacion dinamica.
1JEP es una librerıa, que recibe una cadena de caracteres que contenga ecuaciones, expresiones,condiciones; entre otras cosas que pueden devolver un valor, permitiendo que estas sean evaluadasy arrojando un resultado, para encontrar mas informacion sobre esta librerıa, se debe visitarhttp://www.singularsys.com/jep/doc/javadoc/org/nfunk/jep/JEP.html
27
Capıtulo IV
Conclusiones y futuros desarrollos
4.1. Conclusiones
Este implementacion es una primera version de un API para encontrar soluciones
a ciertos problemas de programacion dinamica en tiempo polinomial, es un software
libre para la comunidad JAVA, bastante completo en su expresion mas sencilla. Es
generico y depende en una gran parte, de la forma como el usuario lo modele. Es-
pecıficamente en que es problema del usuario respetar que las condiciones inductivas
sean excluyentes. Entre otros detalles de especificacion.
Se logro desarrollar una librerıa adaptativa, con induccion enfocada de arriba
hacia abajo, cumpliendo con todos los parametros que un problema de programacion
dinamica requiere.
Se creo un manual corto, para que el usuario con un ejemplo de problema de
programacion dinamica, llamado el problema del morral, pueda montar cualquier
otro tipo de problema de esta ındole, y encontrarle solucion de igual forma.
Es una implementacion, basada en una metodologıa existente, brindando otro
enfoque para encontrar soluciones a problemas de programacion dinamica a la co-
munidad de programadores en JAVA.
Este desarrollo, puede ser el inicio de un grupo de investigacion que trabaje sobre
un buen modelaje de problemas de programacion dinamica y como volver este API
mas intuitivo para el usuario.
28
4.2. Futuros avances
Para este proyecto hay surgido un interes en desarrollar un complemento, mucho
mas amigable, con una buena interfaz grafica y con un modulo de analisis estadıstico
de los datos. Para el sector asegurador.
Extender este algoritmo a no determinista, asociando probabilidades para incor-
porar mas ejemplos a este como procesos de decision markoviana, ruta mas corta
estocastica, etc.
Realizar mezclas entre este algoritmo con otros tipos de programacion para que
surjan nuevas metodologıas de desarrollo de problemas con incertidumbre, con com-
plejidad computacional alta, etc.
Desarrollando mas ejemplos, haciendo mezclas con otras metodologıas, se puede
afianzar el manual del usuario de esta librerıa, ademas de investigar para que en
futuras versiones sea mas intuitivo el proceso de ingresar datos.
29
Apendice A
Manual Operativo sobre el problema del morral
1. Crear una instancia del programa, de esta forma
DynamicSolver s= new DynamicSolver();
2. Crear la pregunta inicializando un objeto Vector, con las capacidades, montos,
etc. Sobre los cuales se quiere saber el valor acumulativo del problema. Aquı se
hace explıcito un morral con capacidad de 8.
Collection capacities = new Vector();
capacities.add(new Integer(8));
3. Luego se definen los estados, dandoles un nombre, un costo entero y un valor
real. para que luego sean ingresados a un conjunto de objetos llamado States
State s1= new State("Helado Vainilla", 64, 100000);
State s2= new State("Helado Chocolate", 32, 45000);
State s3= new State("Helado Fresa" , 16, 22000);
State s4= new State("Helado Ron con pasas", 8, 10000);
State s5= new State("Helado Arequipe" , 4, 4500);
State s6= new State("Helado Capuccino", 2, 2200 );
States sts = new States();
30
sts.addState(s1);
sts.addState(s2);
sts.addState(s3);
sts.addState(s4);
sts.addState(s5);
sts.addState(s6);
4. Se indica que operacion se va a realizar sobre la funcion objetivo, este caso es
Maximizacion Max.
String objop = "Max";
5. Ahora se le da nombres a las variables que tiene el sistema para que el usuario
las opere como quiera, en la funcion de valor tanto del caso base como de los ca-
sos inductivos, tambien son indispensables para la induccion, con la condicion
de sucesores y las operaciones que se hacen sobre estos.
String cost= "cost";
//Corresponde al nombre de la variable del costo,
capacidad, etc. Fijo por estado.
String indcost = "rescap";
// Corresponde al nombre de la variable asociada
con el costo, capacidad de la pregunta
String polval = "policyval";
// Corresponde al nombre de la variable que acumula
el valor por escoger ese
estado y todos los que se tomaron para llegar all
String valname = "val";
// Corresponde al valor inmediato de incurrir en un
estado, para cierta etapa.
31
String stateval = "sval";
// Corresponde al valor generado por el estado
indicado por el usuario.
s.setInductiveCostName(indcost);
s.setCostName(cost);
s.setPolicyValueName(polval);
s.setValueName(valname);
s.setStateVariableName(stateval);
6. Se crea las condiciones inductivas, que indican como encontrar los sucesores.
Apoyada en los nombres antes mencionados. En este caso se indica que los
sucesores son para este caso inductivo, los que quepan dentro de la capacidad
restante.
Collection icond = new Vector();
icond.add("rescap - cost >= 0");
7. Se asocia a cada condicion inductiva, una funcion que indica que hacer con los
sucesores. Apoyada en los nombres antes mencionados. En este caso, con lo
sucesores, se saca la nueva capacidad restante, y la pregunta, se soluciona para
un subproblema. Nota: Se debe respetar que las condiciones inductivas sean
excluyentes, es decir, ya que los sucesores son generados por esta condicion,
estas condiciones no deben genera grupos de sucesores, cuya interseccion sea
diferente de vacıo.
Collection next = new Vector();
next.add("rescap - cost");
s.setNext(next);
32
8. Se le hace explıcito a la librerıa la funcion que genera un valor a devolver
cuando el algoritmo encuentre el caso base, para este caso debe devolver el
valor de incurrir en ese estado.
s.setBcVal(val);
9. Se le hace explıcito a la a librerıa la funcion que genera un valor a devolver
cuando el algoritmo encuentre un caso inductivo dado, aquı se ve que el usuario
le indica al algoritmo que sume al acumulado de la funcion de valor, el valor
de incurrir en ese estado.
s.setValueFormula("policyval + val");\\
10. Por ultimo se llama al metodo solve(), y se le ingresan estos parametros
s.solve(sts, capacities, icond, objop);
Luego de haber realizado estos pasos se corre el metodo solve() de la libr-
erıa y en consola apareceran, el valor correspondiente a la funcion objetivo
evaluada segun los parametros de la pregunta y el conjunto de decisiones que
corresponde a la polıtica que mejor se ajusta al problema de programacion
dinamica.
33
Apendice B
Investigacion previa
Analice cuatro de los multiples problemas de programacion dinamica, los cuales
fueron inspeccionados para encontrar similitudes y diferencias. Ya que lo que se
buscaba, era crear un API que pueda solucionar cualquier problema de programacion
dinamica, aunque se ve una convergencia entre los datos que se requieren segun esta
investigacion, con los datos que se propone en la metodologıa, ver seccion1.5. Los
problemas analizados son algunos de los problemas dinamicos mas mencionados, y
de conocimiento publico fueron:
1. El del Morral1
2. El de los signos
3. Ruta mas corta
a) Correccion de etiquetas
b) Rama mas pesada en un arbol
c) Ruta mas larga o max. beneficio
4. Subcadena comn entre Cadenas, tiene ligero parecido al de los signos
Entre los anteriores problemas mencionados, se recorre entre posibles soluciones,
encontrando por etapas cual es la mejor condicion, y ası, llegar al mejor beneficio.
1Este es el problema por excelencia mas nombrado en cuanto a programacion dinamica, sepuede ver mas a fondo ver Bertsekas[1]
34
La diferencia entre estos, es que calcular estados alcanzables desde un estado y
una etapa, es mas explıcita unos que otros, es decir, unos calculan a donde pueden
llegar y otros simplemente por asignacion alcanzan sus estados alcanzables.
Luego de tener estados alcanzables, se encuentra la mejor decision entre estos.
Este paso es mucho mas facil que el anterior, porque se vuelve a tomar la famosa
ecuacion de Bellman.
B.1. Datos genericos
B.1.1. Calculos y datos por el usuario
1. Contador de objetos i y cual es su maximo valor
2. Peso, costo o distancia p(i) esto esta asociado a un estado y una etapa.
3. Utilidad o beneficio u(i).
4. Restricciones de costo asocia p(i) con un maximo Costo, si hay Costos
5. Restricciones de utilidad asocia u(i) con un mınimo de Utilidad si hay Utili-
dades
6. Caso base relacionada con la funcion objetivo. Requerido
7. Caso Inductivo en funcion de la F.O. Requerido con condicion y estos con
datos asociados a las variables de decision
8. Caso transitivo o mejoras al algoritmo, que se puede desarrollar luego de aplicar
el inductivo. Para acelerar la respuesta. Opcional
9. Operador funcion objetivo min., max. Requerido
10. Pregunta, es el estado para el cual se quiere evaluar funcion objetivo. En el
caso del morral como maximizo el morral si el tamano es 0.3 metros cubicos.
11. Variables de decisin, que se deben guardar por estado, como quien es mi pre-
decesor. Si quiero saber la ruta.
35
B.1.2. Calculos y datos del programa
1. Rangos, dados por la inicializacion
2. Estados marcados o estados parcialmente optimos, dados por la inicializacion
y modificados por la induccion, es decir, avance y control de etapas
3. Estados posibles , dados por la inicializacion y modificados por la induccion
4. Inicializacion de variables, en funcion de otras o transformadas. Explıcitamente
estados alcanzables a partir de restricciones e induccion.
5. transformar restricciones en estados alcanzables o aceptar matriz de estados
alcanzables.
36
Referencias
[1] Ravindra K. Ahuja. Network Flows, Theory, Algorithms and Applications. Num-ber 013617549X. Prentice Hall, Englewood Cliffs, New Jersey, 1993.
[2] Richard Bellman. Dynamic Programming. Princeton University Press, Princeton,N.J., 1956.
[3] Dimitri P. Bertsekas. Dynamic Programming and Optimal Control, volume II.Athena Scientific, Belmont, Massachusetts, 1995.
[4] Jaime Bohorquez. Diseno efectivo de programas correctos. Editorial EscuelaColombiana de Ingenierıa, 2006.
[5] Gerald J. Lieberman Frederick Hillier. Introduccion a la investigacion de opera-ciones. McGraw - Hill, 3 edition, enero 1982. traduccion de la tercera edicion.
[6] Ronald L. Rivest Thomas Cormen, Charles E. Leiserson. Introduction to Algo-rithms. The MIT Press, 2001.
37