Documente Academic
Documente Profesional
Documente Cultură
ESQUEMAS
ALGORÍTMICOS
I.S.B.N.: 84-7908-757-9
Depósito Legal: MU-1778-2003
Reservados todos los derechos. No se permite reproducir, almacenar en sistemas de recuperación de la información ni
transmitir alguna parte de esta publicación, cualquiera que sea el medio empleado —electrónico, mecánico, fotocopia,
grabación, etc.—, sin el permiso previo de los titulares de la propiedad intelectual.
Contenido
1. Preliminares 11
/. / Introducción 13
1.2 ;Oué es un algoritmo? 14
1.3 ¿Oué es la algoritmia? 14
1.4 Notación para los programas 16
1.3 Notación matemática. 16
2. Programación dinámica 21
2. / Introducción 21
2.2 Esquema recursivo 33
2.2A Principio de inducción general 41
2.2.2 Principio de optimalidad 44
2.3 Esquema iterativo AA
44
2.3.1 Estructura indexada de datos 47
2.3.2 Esquema Iterativo 49
2.4 Problemas resueltos 49
2.4.1 Hallar e! camino mínimo en un grafo multietapa 53
2.4.2 Mínima distancia de edición entre dos cadenas 54
2.4.3 Secuencia mínima para calcular el producto entre matrices 61
2.5 Ejercicios 66
2.5.1 Inversiones 70
2.5.2 Transporte de mármoi 70
2.5.3 Conexiones en Internet 71
2.5.4 Evacuación de una isla 71
2.5.5 Dónde llenar el depósito de gasolina 72
2.5.6 Salir del laberinto 72
2.6 Soluciones 73
3 Ramificación y poda 93
3. l Introducción 93
3.2 Esquema básico de resolución de problemas 99
3.3 Refinamientos sobre el esquema básico 105
3.3.1 Primer refinamiento 106
3.3.2 Segundo refinamiento 109
3.3.3 Solución subóptima 112
3.4 Teoría de juegos 113
3.5 Problemas resueltos 117
3.5.1 El problema de la mochila discreto 0/1 118
3.5.2 El Viajante de Comercio 123
3.6 Ejercicios 729
3.6.1 Dónde llenar el depósito de gasolina 130
3.6.2 Reservas de laboratorio 131
3.6.3 Puzzle 131
3.6.4 Construcción de edificios 132
3.6.5 Cena de empresa 132
3.6.6 Viaie en autobuses 133
3.7 Soluciones 735
Referencias 149
índice analítico 151
7
This page intentionally left blank
Prefacio
Para finalizar, únicamente decir que esta obra no pretende ser una versión definitiva de
la asignatura si no que es una primera versión desarrollada a partir de los apuntes de esta
asignatura y que pretende completarlos.
Por último, agradecer a los alumnos que han cursado la asignatura en años anteriores
sus preguntas y comentarios que han contribuido a la realización de esta obra. Gracias a todos
por vuestra contribución y vuestro interés.
Planteamiento:
Objetivos:
11
This page intentionally left blank
Preliminares
1.1 Introducción
Los esquemas son características comunes a un tipo de problema dado, por lo que si
examinamos dicho esquema seremos capaces de resolver cualquier problema que cumpla con
las mencionadas características comunes.
13
Preliminares
Si necesitamos una respuesta exacta habrá que estudiar la complejidad temporal del
algoritmo actual y encontrar otro algoritmo más eficiente que la mejore. Si queremos una
respuesta aproximada, podemos aplicar algoritmos heurísticos (no es el objetivo de este libro).
14
Preliminares
Se suele estudiar varias técnicas que puedan dar buenos resultados y elegir la más
conveniente. Nos basaremos en los esquemas estudiados en la asignatura de Programación
Metódica (divide y vencerás; vuelta atrás), y desarrollaremos otros como los de programación
dinámica y ramificación y poda.
15
Preliminares
Hay algunos aspectos de nuestra notación para los programas que merecen especial
atención. Utilizaremos frases en español en nuestros programas siempre que esto produzca
sencillez y claridad. De manera similar, utilizaremos el lenguaje matemático, tal como el del
álgebra y de la teoría de conjuntos, siempre que sea necesario.
Cálculo booleano
Existen dos valores Verdadero y Falso. Una variable booleana solamente puede tomar
uno de estos dos valores. Si p es una variable booleana, escribimos p es Verdadero, o bien
simplemente p. En la Tabla 1 se puede ver un resumen de las principales operaciones entre los
valores booleanos.
1
Perfilador está traducido de la palabra inglesa proíiling.
16
Preliminares
Teoría de conjuntos
Aun cuando revisemos aquí los principales símbolos que se utilizan en la teoría de
conjuntos, suponemos que el lector ya está familiarizado con la noción de conjunto. Por lo tanto
en lo que sigue no se proporciona una definición formal. A todos los efectos prácticos, resulta
suficiente pensar que un conjunto es una colección no ordenada de elementos distintos. Un
conjunto se dice finito si contiene un número determinado de elementos; en caso contrario el
conjunto es infinito. Si X es un conjunto finito, X , es la cardinalidad (n- de elementos).El
conjunto vacío,0, tiene cardinalidad 0.
La forma más sencilla de representar un conjunto es entre llaves. Por ejemplo, {2,3,5,7}
que es el conjunto de números primos de una sola cifra.
Las partes de un conjunto se define como todos los subconjuntos que se pueden
forman con los elementos de ese conjunto sin repetirse y de tamaño O hasta el mismo tamaño
del conjunto. Por ejemplo 7:'({a,b,c})-(0,{a},{b},{c}1{a,b},{a,c},{b,c},{a,b,c})
Normalmente se utilizan letras minúsculas para elementos {.\,y,;} y mayúsculas para los
conjuntos {X,Y,7}. También destacar que las letras iniciales del abecedario suelen representar
elementos constantes {a=1,b=3,c=7} y las letras finales representan variables (Vxe Y,B\e /F).
También podemos utilizar cuantificadores, los símbolos V y 3 se leen "para todo" y
"existe" respectivamente.
Un resumen de las operaciones que podemos realizar entre conjuntos y sus elementos
lo tenemos reflejado en la Tabla 2.
17
Preliminares
Funciones y relaciones
Sean X e Y dos conjuntos. Todo subconjunto A de su producto cartesiano XxX es una
relación. Cuando xeX e ye Y, decimos que x está relacionado con y según A, lo cual se denota
xAy, si y sólo si ix,y)eA. Por ejemplo, uno puede pensar en la relación "<" con respecto a los
números enteros como el conjunto de los pares de enteros tales que el primer componente del
par es menor o igual que el segundo.
Función Expresión
Inyectiva
Suprayectiva
Biyectiva ¡ Inyectiva y Suprayectiva
Tabla 4. Tipos de (unciones y su expresión asociada.
Sumas y productos
Considérese una función /• T-> 9? y un entero n>0. La suma de los valores tomados
por/sobre los n primeros números positivos, se denota mediante
18
Preliminares
Bibliografía:
[HS.78] Capítulo 1.
19
This page intentionally left blank
2. Programación dinámica
2.1 Introducción
Planteamiento:
Objetivos:
2
Cuando hablamos de paso, de un algoritmo de recursivo a iterativo, nos referimos a una transformación
de forma que aprovechamos resultados anteriores y nos supone una mejora en la complejidad temporal.
21
Programación dinámica 2.1 Introducción
Frecuentemente sucede que la división más natural dictada por la estructura del
problema conduce a un gran número de subproblemas idénticos. Si se resuelve cada
subproblema independientemente sin tener en cuenta las posibles repeticiones, el resultado es
un algoritmo tremendamente ineficiente. Por otro lado, si se resuelve cada subproblema distinto
una sola vez y se conserva el resultado, el algoritmo obtenido es mucho más eficiente. La idea
principal de la programación dinámica (PD) es simple: no calcular dos veces lo mismo y utilizar
un almacén que se irá rellenando a medida que se resuelven subproblemas.
EJEMPLO 2.1.1
Queremos calcular números combinatorios, para ello vamos a utilizar la siguiente
fórmula recursiva:
función
entonces
devuelve 1
sino
devuelve
fin si
fin función
Lo que sucede que muchos valores de C(iJ) con /<« y j<k se calculan y recalculan
varias veces. Dado que el resultado final se obtiene sumando un cierto número de 1, la
22
2.1 Introducción Programación dinámica
Se puede resolver de otro modo. Se almacena en una matriz C(i,j) según filas y
columnas hasta llegar a C(n,k) que es el problema original (en realidad es el triángulo de
Pascal). Un ejemplo lo tenemos en la Tabla 5.
En realidad no es necesario guardar memoria para una matriz nxk, bastaría con
mantener 2 vectores de tamaño k.
n
N K Recursivo (operaciones) Iterativo n.k (operaciones)
k
50 25 l'3-IO'4(4años) 1.250(1 mseg)
60 30 T 2 - l O ' 7 (3.750 años) 1.800 (2 mseg)
70 50 I ' 6 - 1 0 ' 7 (5.133 años) 3.5QQ (3 mseg)
Tabla 6. Comparativa ¡Je tiempos entre el algoritmo recursivo e iterativo para números combinatorios.
23
Programación dinámica 2.1 Introducción
24
2.1 Introducción Programación dinámica
EJEMPLO 2.1.2.
Vamos a resolver el problema de la Mochila (discreto 0/1):
El problema que tenemos que resolver es ¿qué piezas debería introducir el explorador
en la mochila para obtener el mayor beneficio posible?
Este problema se podría resolver probando con todos los posibles subconjuntos de A y,
viendo cual sería el que maximiza el valor del subconjunto que cumple la restricción.
El conjunto .4 tiene 2 i A ' subconjuntos distintos. Con lo que la complejidad del algoritmo
será exponencial, O(2* A ').
sujeto a
25
Programación dinámica 2,1 Introducción
sujeto a
Lo más sencillo es establecer un algoritmo de fuerza bruta que recorra todas las
posibilidades y nos responda con la mejor solución.
El valor de -<*> sólo se emite cuando el problema está fuera de ámbito, es decir, se
produce un error porque se ha sobrepasado el peso que se puede transportar en la mochila.
Como nuestro objetivo es maximizar el valor global, la solución con -°° nunca la escogerá, a no
ser que el problema no tenga solución.
26
2.1 Introducción Programación dinámica
Sea m el número de elementos del tesoro que tenemos que examinar. Y sea c,, c2
constantes correspondientes al número de operaciones.
EJEMPLO 2.1.3.
Vamos a identificar unas condiciones bajo las cuales los subproblemas derivados de
otros superiores se van a repetir.
3
Este sumatorio se puede sustituir 2'"-1 por...
27
Programación dinámica 2.1 Introducción
Si tenemos dos elementos consecutivos a,,,a,,.,eA y sus pesos son iguales, es decir,
peso(«,,) = peso(cí,,./), entonces....
28
2.1 Introducción Programación dinámica
Se ha partido de la igualdad entre pe,w(a,j y peso(a,,.i) con lo que las llamadas serán
exactamente iguales y los cálculos se repetirán a partir de esta llamada y para todos sus
descendientes.
Veamos un traza:
Aquí tenemos que pesóla,) - pex<>{a2) entonces las repeticiones que tendremos serán:
¿Qué se puede hacer?. La solución es guardar los resultados de los problemas intermedios
para evitar resolverlos más de una vez.
Planteamos el esquema iterativo (Solución Iterativa) como una matriz Mochila(/¡, Af] donde n es
el número de elementos a examinar y M es el peso máximo de la Mochila.
Si nos fijamos en la Figura 7, el problema queda definido por una tupia P=(elementos,peso). Los
elementos pueden tener un valor de O a n, mientras que el peso puede tener un valor de ü a M,
por lo que con una matriz de dimensiones nxM se pueden almacenar todos los posibles
problemas generados.
29
Programación dinámica 2.1 Introducción
para /= / hasta n
para j-0 hasta M
fin para
fin para
La solución viene determinada en la casilla Moc/ulaln, M]
EJEMPLO 2.1.4.
n=3 M=6
a¡ a2 «t
valor 3 1 2
peso 4 2 2
(j)M
0 1 2 3 4 5 6
(i) 0 0 0 0 0 0 0 0
n 1 0 0 0 0 3 3 3
2 0 0 I 1 3 3 4
3 0 0 2 7 3 3 (5)
Sí NO
i j peso(di) valor(a¡) + Mochilaf i-1, j - peso(a¡) ] Mochila[ i-l,j] Max
0 3 + Machila[0, -4] = -oo 0 0
1 3 + MochilalO. -3¡ = -« 0 0
2 -? + MochilalO, -2J = -<« 0 0
¡ 3 4 3 + Mochila 10. -// = -«> 0 0
4 3 + MochilalO, 0} = 3 0 3
5 3 + MochilalO, IJ = 3 0 _•?
6 3 + MochilalO, 2] = 3 0 3
0 / +Mochilal/, -2] = -oo 0 0
1 1 + Mochila! 1, -// = -«, 0 0
2 / + Mochilall, O/ = 1 0 1
2 3 2 1 + Mochilall, ¡¡-I 0 1
4 1 + Mochilall. 2] = 1 3 3
5 1 + Mochilall, 3] = / 3 3
6 / + Mochilall, 4] = 4 3 4
0 2 + Mochilaf2, -21 = -°° 0 0
1 2 + Mochila[2. -I] - -°° 0 0
2 2 + Machi la ¡2, 0¡ = -« 0 2
3 3 2 2 + Machi la,' 2. ¡¡ = -00 0 2
4 2 + Mochila! 2, 2] - 2 3 3
5 2 + Machila¡2. .?/ = 2 3 3
6 2 + Mochilal2, 4] = J 4 (5)
30
2.1 Introducción Programación dinámica
Observamos que las funciones que se utilizan en el esquema iterativo son exactamente
iguales al del esquema recursivo, ya que la Figura 6 puede reescribirse por la Figura 8.
CONCLUSIONES:
Bibliografía:
[Sn,92l Capítulo 1.
[BB,90] Capítulo 5.
[BB.97] Capítulo 8.
31
This page intentionally left blank
2.2 Esquema rectirsivo
Planteamiento:
Objetivos:
.: 33
Programación dinámica 2.2 Esquema recursivo
EJEMPLO 2.1.1.
En el caso del problema de la mochila podríamos comenzar definiendo formalmente
sus parámetros de entrada y de salida.
Definición de problema
Cjto. de elementos x Peso máximo
Definición de decisión
Si se coge o no, un elemento de A
Definición de solución
Beneficio máximo
34
2.2 Esquema recursivo Programación dinámica
donde:
1.- Función Contono: Esta función indica si un determinado problema es básico o no.
Entrada: A un problema.
Salida: ,2J un booleano {verdadero, falso] según estemos en un problema básico o no.
Contorno:
Descomposición:
4.- Función Cálculo: Esta función se encarga de calular una solución a partir de un
subproblema y una decisión.
Entrada: p+ al menos una solución de un subproblema y 8 decisión que generó el
subproblema.
Salida: Nueva solución p.
Cálculo:
Combinar
35
Programación dinámica 2.2 Esquema recursivo
EJEMPLO 1.1.2.
Aplicando el esquema al caso de la mochila donde un problema queda definido como
P-(A,M) con 4=conjunto de elementos y /Vfepeso máximo:
Contorno(P)=
¡nicio(P) s
Descomposición( P) =
Cálculo(r,d) =
Combinar = Máximo
El árbol anterior (Figura 9) contiene cada una de las funciones definidas en el esquema
y se puede observar exactamente en el lugar en el que actúa. Las flechas ¿T significa si la
función se ha aplicado en orden descendente o ascendentemente, respectivamente.
36
2.2 Esquema recursivo Programación dinámica
Corrección de un algoritmo
Principio de Inducción
Sea P(x) el predicado que deseamos demostrar y sea bel) una cte.
Cuando hagamos una demostración por inducción aparecerán siempre tres apartados:
Paso de inducción (P.I.): A partir de casos menores tenemos que llegar al caso
actual y la expresión quedará demostrada por el método de inducción.
37
Programación dinámica 2.2 Esquema recursivo
EJEMPLO 1.1.3.
Queremos demostrar que la siguiente fórmula es cierta para cualquier
número entero.
1) Base inducción:
2) Hipótesis de Inducción: Sea entonces es cierto que:
EJEMPLO 1.1. 3.
Queremos demostrar que la siguiente expresión es cierta para cualquier
número entero.
El error radica en aplicar la Hipótesis de Inducción cuando loi. No podemos asegurar que
siempre n será mayor que I, entonces la deducción de que (a1 = I) es incorrecta.
EJEMPLO 1.1.4.
Vamos a demostrar que "todos los qatos son del mismo color"
38
2.2 Esquema recursivo Programación dinámica
Con estos dos últimos ejemplos se pretende demostrar que existen casos en los que
no es fácil aplicar e! principio de inducción.
En general el principio de inducción no se puede aplicar para demostrar algoritmos, porque no
se puede establecer una correspondencia con 'Y de forma fácil, en el espacio del problema.
Para solucionar este problema vamos a generalizar el principio de inducción. Lo primero que
haremos es definir una relación de orden estricto sobre el conjunto en el que trabajemos.
DEFINICIÓN 1.1.1.
Una relación de orden estricto sobre un conjunto es aquella que cumple las
propiedades: Irreflexiva, antisimétrica y transitiva.
Sea una relación de orden R sobre un conjunto D. Esta relación de orden puede ser de dos
ticos:
Total o lineal: Cuando todos los elementos del conjunto están relacionados entre sí.
39
Programación dinámica 2.2 Esouema recursivo
EJEMPLO 1.1.5.
En orden total o lineal
En orden parcial, ya que,
En orden total o lineal
DEFINICIÓN 1.1.2.
Un minimal, en un conjunto ordenado (D,<), es el elemento
EJEMPLO 1.1.6.
En es el cero.
En
En no existe minimal
Expresado de una forma gráfica el principio de inducción general necesita cuando se dibuja el
esquema de relación, que toda rama tenqa principio. Veamos...
DEFINICIÓN 1.1.3.
Una relación de orden es Noetheriana en un conjunto ordenado (£>,<), si todo
subconjunto no vacío de D, tiene por lo menos un minimal.
EJEMPLO 1.1.7.
En es Noetheriano porque tenemos un elemento base que es el 0.
En no es Noetheriano porque no tenemos elemento base.
40
2.2 Esquema recursivo Programación dinámica
Teorema:
Toda relación de orden estricta sobre un conjunto finito es Noetheriana.
Demostración:
Sea A un conjunto finito A={a,,, «,. a, a,J, con una relación de orden estricta (irreflexiva,
antisimétrica, transitiva).
Suponemos por R.A. que la relación no es noetheriana, por lo tanto, iBcA B no tiene minimal,
es decir, Va/eB, Ba¡eB I «,<«„ como se cumple la propiedad irreflexiva (i¿j), y con la propiedad
antisimétrica y transitiva se evita formar bucles, por lo tanto, estamos en una serie infinita de
elementos. Si ¡B ¡= <x =$ ¡A /= « y, hemos partido de la hipótesis de que A es finito. Hemos
llegado a una contradicción, (c.q.d.)
4
La demostración por Reducción al Absurdo (R.A.) pretende llegar a una contradicción
neqando a-^b (que es lo que queremos demostrar). El razonamiento lógico es el siguiente:
Si tenemos demostrar (a-»b) por R.A. entonces tenemos que encontrar un absurdo en
41
Programación dinámica 2.2 Esquema recursivo
EJEMPLO 2.2.1.1.
En el caso del problema de la mochila se demostraría teniendo en cuenta el tamaño de
elementos del problema que nos pasan:
1.b) Noetheriano
Supongamos por R.A. que no lo es, entonces, 3/4eA un subconjunto que no tiene
minimal, podemos construir una serie del problema en la que haya un elemento
«e A que irá reduciendo el tamaño del conjunto hasta que llegue a un elemento, tal que,
el tamaño del problema sea O (cero) y, este es minimal. Hemos llegado a una
contradicción lueao c.a.d.
(También podemos hacer referencia al teorema anterior que nos dice que toda relación
de orden estricta sobre un conjunto finito es Noetheriana).
EJEMPLO 2.2.1.2.
Vamos a ver primero como quedará el esquema PDR (Programación Dinámica
Recursiva) para el caso de la mochila y, luego demostraremos que es correcto.
función PDR
si Contorno(P) entonces
devuelve Inicio(P)
si no
devuelve Combinar! Cálculo
fin si
fin función
42
2.2 Esquema recursivo Programación dinámica
Inicio(P) s
Descomposición(P) =
Cálculo(r,d) =
Combinar = Máximo
Teorema 2.2.1.
Sea VPe A donde P=(A,M) con Ascjto. de elementos y Mspeso máximo.
Demostración:
B.I.:
H.I.:
P.I.:
(c.q.d.)
4?
Programación dinámica 2.2 Esquema recursivo
Existe una propiedad importante que cumplen la mayoría de problemas que pueden
resolverse por programación dinámica.
si X¡:(Xi,...,X(n,dm) eDescomposición(P)
d¡,...,d,,,.i resuelve X¡
EJEMPLO 2.2.2.1.
Aplicado al caso de la mochila
descomposición({ai,...,a,»}, M) =
Hay que demostrar que (d¡,a,)... (dm,am) es solución de ({a, a,,,.,}, M-dm peso(aj).
: 44
2.2 Esquema recursivo Programación dinámica
EJEMPLO 2.2.2.2.
Todo problema que cumple el principio de optimalidad se puede resolver por
programación dinámica, pero ¿qué ocurre en sentido inverso?.
Queremos hallar el camino mínimo en un grato. Para hallar el peso total un camino
multiplicaremos el peso de las aristas que son reales positivos.
Bibliografía:
[BB.901 Capítulo 5.
[BB.97] Capítulo 8.
45
This page intentionally left blank
2.3 Esquema iterativo
Plateamiento:
Objectivos:
Que el alumno conozca las condiciones bajo las cuales podemos aplicar el
esquema iterativo.
Que el alumno conozca el funcionamiento del esquema iterativo del
programación dinámica.
Que el alumno conozca la relación entre las funciones del esquema
recursivo y el iterativo.
Que el alumno comprenda la necesidad de establecer, en un problema, una
relación de orden lineal y un almacenamiento indexado para la solución de
subproblemas.
Que el alumno comprenda la correspondencia entre la resolución de un
problema por el esquema recursivo y el iterativo.
47
Programacl6n dlnamlca 2.3 Esquema iterativo
Se tendra que observar las llamadas a subproblemas del esquema recursivo para
establecer una relacion de orden lineal con estas. Posteriormente estableceremos un sistema
de almacenamiento para evitar la repetici6n de la misma llamada y, por ultimo resolveremos los
subproblemas de menor a mayor, hasta obtener el resultado final.
EJEMPLO 2.2.1.
Repeticibn de subproblemas que surgen de la descomposicion del problema original.
Como consecuencia directa de los puntos anteriores, el programa iterativo necesitara rticis
espacio de memoria para guardar los resultados que en el esquema recursivo.
Definicion 1.1.1:
edescomposicl6n(
Este orden que se induce directamente no tiene porque ser lineal (total). Por ello vamos
a extenderlo de forma que sea lineal y, preserve el orden inducido por descomposicidn5:
(siendo s: minimal)
5
El sfmbolo <• significa orden lineal
48
2.3 Esquema iterativo Programación dinámica
Vamos a definir las funciones genéricas que proporcionarán el recorrido por el conjunto (DA,<-):
i) Primer subproblema px
Contorno(B)
almacén[B] = Inicio(B)
,Contomo(B)
almacénlB] = CombinarfCálculo(PDR(Xi) PDR(X,,),x)f
V(X/ X,,,x)eDexcHinposición(B)
Supongamos que almacén se rellena siguiendo el orden dado por <•, entonces \/X<-B,
PDR(X) se hallará resuelto, antes que para B, y por tanto, estará en almacén.
almacénlB] = Coinbinar{Cálculo(alniacén[X¡],...,cümacéii[X,,],.K)l
V(X¡ X,,,x)€ Descomposición B)
función PDI
var
almacén : Vp[DA]
X,S:
.v .•
fin var
S = ps()
repetir
si Contorno(S) entonces
almacén! S] = Inicio(S)
sino
almacén[S] = Combinar {Cálculo( almacén[X/] ulinacén[X,,],x)}
V(X¡ X,,,x) e Descomposición(S)
fin si
S = ss(S)
hasta
devuelve almacén[A]
jin junción
49
Proclamación dinámica 2.3 Esquema iterativo
TEOREMA 2.3.1.1:
Sea VAeA tenemos que los dos esquemas son capaces de resolver el
mismo problema.
PDR(A) = PDJ(A)
Demostración:
= cilmacén[B) por inducción utilizando <•.
B.I.: pseDA
PDR(ps) - Inicio(ps) - almacénfps]
PDR(X) = almacénfX]
P.I.: PDR(B) =
EJEMPLO 2.3.2.1.
Vamos a ver por último como quedará el esquema PDI (Programación Dinámica
Iterativa) para el caso de la mochila donde el problema es P=(S,M) donde 5 es el conjunto de
piezas y M es el peso máximo de la mochila.
función
va
almacén [PJ: p
fin var
S = px()
repetir
si Contorno(S) entonces
(ilmacénfSI = Inicio(S)
si no
almacén[S¡ = Combinar/Calculof almacénfX ¡) almacénfX,,),*)}
Descomposición(S)
fin si
S = ss(S)
hasta
devuelve almacen¡ PJ
fin función
50
2.3 Esquema iterativo Programación dinámica
función ps()
devuelve (0,0)
fin función
función ss((s,m)
si m < M entonces
devuelve (s, m)
sino
si s < S entonces
devuelve (s, 0)
si no
devuelve
fin si
fin si
fin función
Las funciones se conservan del esquema PDR al PDI. En casos prácticos si queremos
evitar almacenar todos los casos de contorno (que puede-ser un número elevado) hay que
matizar el acceso al almacén para que no se salga de rango.
función almacén(P:A): p
si Contorno(P) entonces
devuelve ínicio(P)
si no
devuelve tilmacén[P]
fin si
fin función
Bibliografía:
[HS.78] Capítulo 5.
[BB,90l Capítulo 5.
[BB.971 Capítulo 8.
:¡ 51
This page intentionally left blank
2.4 Problemas resueltos
Planteamiento:
Objetivos:
53
Programación dinámica 2.4 Problemas resueltos
Sea un grafo mulíietapa G=(N,A) donde N son los nodos y -4 las aristas, siendo un grafo
dirigido y, ponderado por una función d(A)...
donde AcNxN y, los nodos N estarán divididos en K>2 conjuntos disjuntos N,, ¡<¡<K, tales que:
el coste del camino c será D(c), que será la suma del peso de las aristas que lo forman:
54
2.4 Problemas resueltos Programación dinámica
si no fuera así por reducción al absurdo, existiría otro camino que mejoraría el coste íf,-*/„.,
entonces
hemos llegado a una expresión absurda, porque D(c/.J es el mínimo y hemos encontrado otro
menor. c.q.d.
Este problema se puede resolver desde dos visiones diferentes. Una, recorriendo las
aristas en sentido contrario desde delante hacia atrás. Y la otra visión es resolverlo de atrás
hacia delante.
(1
Recordaremos que C(í,a) son todos los posibles caminos entre el nodo inicial y en nodo a.
55
Programación dinámica 2.4 Problemas resueltos
Teorema:
Demostración:
La demostración la hemos realizado para una nodo cualquiera del grafo, ahora tenemos que
particularizarlo para en caso en que el no de partida sea F (nodo Final)
Corolario:
Si además, quisiéramos conocer el camino bastaría cambiar la función cálculo y combinar que
son las actúan sobre las soluciones.
(Nodos)
(Aristas)
(Distancia x Cadena de Nodos)
!56
2.4 Problemas resueltos Programación dinámica
Ahora tenemos ios nodos con un orden lineal (en este caso el mismo que tienen los naturales).
función ps()
devuelve 1 N¡=I
fin función
función xx(i)
si (i < n) entonces
devuelve i+1
si no
devuelve f
fin si
fin función
función PDI(P) =
i = px()
repetir
si Contomo(i) entonces
almacén/i I = Inicio(i)
si no
almacén[ i ¡ = Cvmbmar{Cálculo(it¡macéiila],(b,c))}
Descontposición(i)
fin si
i = sx(i)
hasta i -
devuelve almacén! P¡
fin función
57
Programación dinámica 2.4 Problemas resueltos
Podemos observar que estas funciones son prácticamente idénticas a las expuestas en el
esquema recursivo.
Sea:
N= Número de nodos del grafo.
K = Número de etapas del grafo.
m = Máximo número de nodos en un nivel.
Cada nodo del árbol puede expandirse tanto con conexiones tenga este nodo, es decir
m, y este proceso se repetirá hasta llegar al último nivel K. Y sean c/, c? dos constantes
correspondientes al número de operaciones.
58
2.4 Problemas resucites Programación dinámica
Tenemos que recorrer las K etapas del grato elemento a elemento y, a su vez estos elementos
se calculan con sus adyacentes m. Y sea c, una constante correspondiente al número de
operaciones.
Para ver la ganancia se puede confeccionar una tabla (Tabla 8) con las dos complejidades y
ver el número de operaciones que efectúan los algoritmos.
Complejidad
PDR PDI
m K mK m2K
5 5 3125 125
5 10 9765625 250
!ü 10 10'° 1000
lf
10 15 10 1500
Tabla 8, Número de operaciones reaii/.ailus con el algoritmo recursivo y el iterativo
Obviamente es 0(N) para guardar los resultados en cada nodo, pero en la práctica es
O(m), porque necesitamos guardar sólo 2 niveles a la vez para calcular los resultados.
A continuación enunciaremos brevemente como queda la solución al problema del cálculo del
camino mínimo en un graío multietapa con la segunda visión comentada, de atrás hacia
delante.
entonces:
(Nodos)
(Aristas)
(Distancia)
59
Programación dinámica 2.4 Problemas resueltos
Ejercicios:
60
2.4 Problemas resueltos Programación dinámica
Tenemos la Figura 12 que es la primera imagen con la codificación 3345. Por otro lado
tenemos la Figura 13 con la codificación 233566.
61
Programación dinámica 2.4 Problemas resueltos
Sea t el camino....
¿Se cumple el principio de optimalidad? Sí cumple este principio, pero dejamos ai lector como
ejercicio que lo demuestre.
Contorno( (x,y)) =
Inicio( (A, A.) j =
Cálculo( r, d ) =
1
Las letras del final del alfabeto (x.y,z) representan cadenas de símbolos. Y las letras iniciales del alfabeto
como a,b,c representan un único símbolo.
62
2.4 Problemas resueltos Programación dinámica
Combinar = Mí/?
Teorema:
Transformación de mínimo peso resueito con el esquema recursivo.
Demostración:
8
La función P¿x) devuelve el conjunto de los prefijos de una cadena dada.
P,( abcde ) = /A, a, ab, abe, abccl, abcdej
P¿ abba ) = /A, a, ab, abb, abbaj
M
Programación dinámica 2.4 Problemas resueltos
A.,..v; = / (x',y')/x'<=P¿x)Ay'ePA\) /
una relación de orden estricta en D ( v v ) que preserva ia relación < podría ser con la función de
prefijos estrictos9:
se puede comprobar que si f.v'y'j < f.v.vj => (.\',\') <• f.v.v)
La forma de recorrer el problema vendrá dada por las funciones básicas /«O y .s.vfj, que
se pueden definir como:
entonces
devuelve
si no
entonces
devuelve r(x)
si no
devuelve
fin si
fin c/
Este recorrido se transforma en realidad en el recorrido de una matriz con las longitudes de
ambas cadenas desde el inicio (A,,X) hasta llegar (x,y) como representa la Figura 15.
Sea:
.v = longitud de la primera cadena.
y = longitud de la segunda cadena.
Cada nodo del árbol de búsqueda de soluciones puede expandirse con las 3
operaciones básicas de inserción, borrado y sustitución. En el peor caso se expandirá el árbol
la longitud de la cadena más larga de las dos de que disponemos.
q
Los prefijos estrictos los representaremos como Prs(x). Ejemplos:
64
2.4 Problemas resueltos Programación dinámica
Habrá que revisar cada uno de los elementos de D(A.,.,. Tenemos que recorrer la matriz
de dimensiones x por v, calculando cada casilla, que se compone de 3 accesos directos
(inserción, borrado, sustitución - ver la Figura 15 y Figura 16).
Para ver la ganancia se puede confeccionar una tabla (Tabla 9) con las dos
complejidades y ver el número de operaciones que efectúan los algoritmos.
Complejidad
PDR PDII
x y 3Máx{x'y} x-y
3 3 27 9
4 5 243 20
10 11 ¡77147 ¡10
11 15 14-!rf 165
Tabla 9. Operaciones realizadas por el algoritmo recursivo y el iterativo.
65
Programación dinámica 2.4 Problemas resueltos
Si tenemos en cuenta que para el producto de dos matrices A,IXt, y Bí/xr se necesitan
p-q-r multiplicaciones escalares.
Nuestro problema es calcular el modo en el que se tienen que multiplicar las matrices
para obtener el mínimo número de productos escalares.
EJEMPLO 2.4.3.1:
Se pretende calcular el producto ABCD de las matrices A(l3x5), B(5x89), C(89x3) y D(3x34).
Una forma de calcular es producto es:
AB 5785 multiplicaciones
(AB)C 3471 multiplicaciones
((AB)C)D 1326 multiplicaciones
«AB)C)D 10582
<AB)(CD) 54201
(A(BC))D 2856
A((BC)D) 4055
A(B(CD)¡ 26418
Para hallar directamente el mejor modo de calcular el producto, basta insertar los
paréntesis de todas las formas posibles y calcular, para cada una, el número de
multiplicaciones requeridas. Sea T(n) el número de formas significativamente diferentes de
insertar paréntesis en un producto de « matrices. Supongamos que inicialmente se decide
dividir entre la i-ésima matriz y la (i+1)-ésima:
M=(M,M2-Mi)(Mn.lMn.2-Mll)
Tenemos entonces T(i) formas de introducir paréntesis en la parte izquierda y T(n-i) formas de
hacerlo en la parte derecha. Dado que / puede tomar cualquier valor entre / y »-/, obtenemos
la siguiente recurrencia para T{n).
Complejidad temporal
¡66
2.4 Problemas resueltos Programación dinámica
Contorno(
¡nicio
Sea d-( filasxcomúnxcolumnas)
Cálcído( r¡, r2, d) = r¡ + r2+filas-común-columnas
Combinar(...) = Máx(...)
subproblema 1
suhproblema 2
Descomposición( P ) =
ecisión
PDR PDI
filasxcolumnas que indica el número inicial y final de la
multiplicación de matrices.
67
Programación dinámica 2.4 Problemas resueltos
Por ejemplo
Funciones de recorrido
Sea P=(i,j) y A/=número inicial de matrices
entonces
recorrido en zig-zag.
fin
devuelve (i,j)
Complejidad temporal PDI:
Sea n el número de matrices que compone el producto matricial. Habrá que revisar la
parte triangular superior de una matriz //x/¡.
Para ver la ganancia se puede confeccionar una muestra (Tabla 10) con las dos
complejidades y ver el número de operaciones que efectúan los algoritmos.
Complejidad
PDR PDI
n n2
5 14 25
10 4862 100
50 5- 10-" 2500
100 2-10-'' 10000
Tabla 10. Número de operaciones realizadas por el algoritmo recursivo y el iterativo.
Bibliografía:
[BB.90J Capítulo 5.
[BB,97J Capítulo 8.
68
2.5 Ejercicios
Plateamiento:
Objetivos:
69
Programación dinámica 2.5 Ejercicios
2.5.1 Inversiones
Estamos es una consultaría financiera y tenemos que tomar decisiones sobre varias
inversiones que tenemos que realizar.
!: 1
2
il
f'i
r1
/•i
i» n Ín '"/i
Disponemos de C(número entero positivo) millones de capital para invertir, y nos piden
qué inversiones tenemos que realizar para obtener el mayor número de intereses acumulados.
Y si hubiera varias soluciones entonces deberemos elegir la de menor riesgo acumulado
posible, para ello podemos invertir varias veces en la misma inversión, según aparece en la
tabla arriba indicada.
Se pide:
Tenemos dos camiones en una cantera, cada uno puede transportar como máximo M!
y M2 toneladas respectivamente. Tenemos que recoger la máxima cantidad de mármol posible,
para ahorrar viajes a estos camiones, sabiendo que existen N bloques de mármol que se
pueden escoger para transportar en este viaje.
n T,,
Se pide:
70
2.5 Ejercicios Programación dinámica
Se pide:
a) Que se plantee el problema y que se dafinan las funciones PDR.
b) Que se demuestre que la solución propuesta es correcta (Inducción).
c) Que se plantee el problema en PDI (reduciendo el coste del PDR).
d) Que se definan las complejidades temporales de los algoritmos PDR y PDI propuestos.
El avión está en una base en el continente y tiene que realizar viajes a la isla para
poner a salvo a los pasajeros. Teniendo en cuenta que /„< i/< t,< ...< t,, y cualquier número
superior a n que no figura en la tabla anterior, el avión no podría despegar por exceso de peso,
y por lo tanto, Vi e. V. r />/i =* /,•=«>. Queremos calcular el tiempo mínimo que tardará el avión en
evacuar la totalidad de pasajeros.
Se pide:
a) Que se plantee el problema y que se definan las funciones PDR.
b) Que se demuestre que la solución propuesta es correcta (Inducción).
c) Que se plantee el problema en PDI (reduciendo el coste del PDR).
d) Que se definan las complejidades temporales de los algoritmos PDR y PDI propuestos.
71
Programación dinámica 2.5 Ejercicios
Hay que diseñar un algoritmo de programación dinámica que permita saber por qué
gasolineras hay que pasar y en cuales parar para repostar, así como el número de paradas
necesarias.
Suponiendo que disponemos de un grafo G=(N,A) con las distancias entre las
gasolineras. Se pide:
Solución:
(I,I),(1.2),(2,2),(3,2)2)...,
Se puede pasar (5,6),(6,6)
NO se puede pasar
Pasos:14
Se pide:
72
2.6 Soluciones
Planteamiento:
Objetivos:
73
Programación dinámica 2.6 Soluciones
2.5.1 Inversiones.
a) Que se plantee el problema y que se definan las funciones PDR.
Contornof C ) =
Inicio(C) =
Cálculo((i,r.L),d) =
Descomposición( C) =
Función objetivo:
Demostración:
74
2.6 Soluciones Programación dinámica
= Combinar
- Combinar F(t)
V/e/(<i)
Demostración:
75
Programación dinámica 2.6 Soluciones
2) Tenemos igual inversión pero con menor riesgo con la inversión f',.<:
0 1 2 C
sino
devuelve
Jmsi
devuelve (a)
76
2.6 Soluciones Programación dinámica
PDI:
Hay que recorrer el vector lineal y para cada casilla hay que consultar sus anteriores
casillas correspondientes a descomposición.
77
Programación dinámica 2.6 Soluciones
Contorno? (AMiMi))
¡mcio((A,MhM2))
Cálculo( r, (i,d))
Descomposición((A,Mi,M2)
Combinar
PDR((A,M^M2}}
Demostración:
se cumple que:
PDR
78
2.6 Soluciones Programación dinámica
P.I.: PDR«A,M
hM2))
sino
si nii<M¡ entonces
si no
entonces
sino
devuelve
75
Programación dinámica 2.6 Soluciones
fin si
fin si
fin si
devuelve (a,g,L)
PDI:
Hay que recorrer la matriz cúbica de AxM,xM2 dimensiones y para cada casilla hay que
consultar 3 casillas correspondientes a descomposición.
80
2.6 Soluciones Programación dinámica
Vamos a plantear el algoritmo recursivo hacia atrás. Partiremos del nodo Servidor y
llenaremos al nodo Usuario.
Descomposición( (n,L))
Combinar((r¡,Li).., (r,,¡,L,,,))
Sea C(n,L) ei conjunto de todos los caminos desde el nodo n hasta el nodo Usuario sin repetir
los nodos de L.
Demostración:
81
Programación dinámica 2.6 Soluciones
si no
entonces
si no
devuelve
fin si
fin si
devuelve (a,L)
PDI:
Hay que recorrer la matriz cuadrada de NxN dimensiones y para cada casilla hay que
consultar N casillas correspondientes a descomposición.
82
2.6 Soluciones Programación dinámica
Contorno( P )
Inicio(P)
Cálculo suma el tiempo de transporte de los pasajeros más el de ida vacío.
Cálculo( r, d )
En descomposición transportaremos los viajeros de todas las formas posibles..
Descomposición( P ) =
Combinar^
Función objetivo:
Demostración:
83
Programación dinámica 2.6 Soluciones
sino
devuelve
fin si
devuelve (a)
PDR:
Sea N=r\- de personas para transportar
84
2.6 Soluciones Programación dinámica
PDI:
Hay que recorrer el vector lineal y para cada casilla hay que consultar sus anteriores
casillas corresoondientes a rifismmnosirión
85
Programación dinámica 2.6 Soluciones
Llegaremos a la base cuando la gasolinera actual sea el origen o cuando tengamos una autonomía de kms
negativa.
Contorn
Inicio(
Cálculo(
Descornposición((a,g,L))
Combinar(
86
2.6 Soluciones Programación dinámica
sino
si g<N entonces
si no
si L<N entonces
si no
devuelve
fin si
fin si
fin si
devuelve (a,g,L)
PDR:
PDI:
Hay que recorrer la matriz cúbica de NxNxK,IIM dimensiones y para cada casilla hay que
consultar 2N casillas correspondientes a descomposición.
87
Programación dinámica 2.6 Soluciones
Procederemos a resolver este problema por otro método más eficiente. Sea el mismo grafo
anterior G=(N,A)
Cólculo((r,p,k),(a,b))
Descomposición((b, L))
Combinar((r/,p/,ki)...(rm,pm,km))
sino
si L<N entonces
sino
devuelve
fin si
fin si
devuelve (a,L)
88
2.6 Soluciones Programación dinámica
PDI:
Hay que recorrer la matriz cuadrada de NxN dimensiones y para cada casilla hay que
consultar N casillas correspondientes a descomposición.
89
Programación dinámica 2.6 Soluciones
En este ejercicio tenemos que fijarnos en recorrer los puntos posibles pero sin repetirlos, si no
se formarían bucles infinitos en el recorrido.
Comenzaremos de la casilla (N,N) y llegaremos a la base cuando estemos en el punto inicial (1,1) o si
repetimos puntos.
Contorno
¡nicio
Cálculo
En descomposición iremos a casi/las adyacentes sin salimos de la matriz
Descomposición(
Combinar
Sea C(x,y,L) el conjunto de todos los caminos desde (1,1) a la casilla (x,\) sin repetir las casillas
en L.
Demostración:
90
2.6 Soluciones Programación dinámica
Necesitamos un triple bucle para recorrer todas las casillas tantas veces como el
camino más largo posible dentro de! laberinto (N~).
si no
entonces
si no
entonces
sino
devuelve
fin si
fin si
fin si
devuelve (x,\,L)
91
Programación dinámica 2.6 Soluciones
PDR:
Sea Nsne máximo de casillas. Sabiendo que no se pueden repetir casillas los caminos
hipotéticos más largos serían aquellos que tuvieran por longitud N2.
PDI:
Hay que recorrer la matriz cúbica de NxNxN2 dimensiones y para cada casilla hay que
consultar las 4 casillas adyacentes correspondientes a descomposición.
92
3. Ramificación y poda
3.1 Introducción
Planteamiento:
Objetivos:
93
Ramificación y poda 3.1 Introducción
En su versión más simple, el cálculo de una cota inferior se combina con un recorrido
en anchura o profundidad que sirve para podar ciertas ramas del árbol. Muy amenudo, la cota
inferior sirve para escoger la rama más prometedora con el fin de realizar una exploración con
prioridad.
Los problemas que se resuelven por ramificación y poda son problemas de explosión
combinatoria. Existen dos tipos:
b) Problemas de optimización.
Se intenta encontrar una solución que satisfaga un conjunto de restricciones y minimice una
función objetivo.
EJEMPLO 3.1.2
• ¿Cuál es la combinación en el problema de la mochila que maximiza el beneficio?
• ¿Cuál es la combinación en el problema del viajante de comercio que minimiza el
recorrido entre las ciudades?.
Los problemas del apartado b) son los que estudiaremos en este tema, ya que son una
generalización de los del apartado a).
(Restricciones)
10
En inglés la palabra original es 'backtracking
94
3.1 Introducción Ramificación y poda
EJEMPLO 3.1.3.
Representación del problema de ia mochila.
Hasta aquí, la técnica utilizada es vuelta atrás (backtracking). Generamos todas las
posibilidades y, nos quedamos con la mejor. Vemos en la Figura 17 un ejemplo de la aplicación
de esta técnica. Si nos fijamos observamos unas fechas It que indican si el cálculo efectuado
en ese nodo se ha hecho de forma descendente o ascendente, respectivamente.
95
ramification Y poda 3.1 Introdcction
Una vez definido el árbol donde se van a hallar las soluciones del problema original,
hay que definir una función que nos permita medir el beneficio de un nodo en particular. Como
se trata de un problema de optimización definimos una función
que actúa sobre una problema X dado, por lo que, vamos a extenderla para el conjunto de
nodos del árbol queda de la siguiente forma
EJEMPLO 3.1.4.
Vamos a observar un ejemplo donde se define un árbol T(N,A) junto a las funciones Ff-j
Como la descomposición se realiza desde la raíz, conocer f(Z) para ZeN, es tanto
como resolver el problema (Figura 18). Además si consideramos que |ZI=7 entonces
donde Z={X}.
96
3.1 Introducción Ramificación y poda
y verifica:
1. g(-) es no decreciente en T
si VZehijos(Y) entonces
EJEMPLO 3.5.
Podríamos definir dos funciones F(-) y g(-) para el problema de la mochila11.
la expresión "i:x¡=l" significa que se consideran todos los elementos que tienen en el vector x
un /, es decir, que se han escogido.
Exploración
Nodo vivo: Es un nodo del árbol del cual no se han generado todos sus hijos.
Nodo muerto: Es un nodo del cual no se van a generar sus hijos, porque...
I I Las fórmulas tienen un signo negativo porque el algoritmo RyP lo hemos definido para problemas de
minimización y el problema de la mochila es de maximización, por lo que, Mín(x) = - Máx(x).
97
Ramificación y poda 3.1 Introducción
Estrategias ciegas:
Estrategias inteligentes:
Estrategias mixtas:
Bibliografía:
<[BB,97] Capítulo 9.
98
3.2 Esquema básico de resolución de problemas
Planteamieto:
Objetivos:
99
Ramificación y poda 3.2 Esquema básico de resolución de problemas
Para comenzar esta sección vamos a definir el siguiente esquema para la resolución de
problemas de RyP. Ésta será la primera versión, explicaremos su funcionamiento y se le
aplicarán posteriores refinamientos con en fin de aumentar su eficiencia.
Función RyP(x:N) :p
var
Cn\\C'nh:CN-
solución: p
Cn v={x} // iniciación
mientras —final(Cnv) //regla de terminación
sel=seleccionar(Cnv) //regla deselección
Cnh-hij()s(sc¡) //regla de ramificación
Cnv=podar(horrur(Cnv,sel) u Cnh) //regla de poda
fin mientras
solución = obtenerSoiución(Cnv)
fin función
Se definirá a continuación cada función que compone el esquema, así como, los
parámetros y resultados que devuelve:
1.- Función final: Esta función indica si se ha llegado al final de nuestro algoritmo.
Entrada: C/v un conjunto de nodos del árbol de estados.
Salida: 73 un booleano ¡verdadero, falsoj según se haya llegado o no a! final de nuestro
recorrido.
2.- Función seleccionar: Esta función es la encargada de escoger el próximo nodo para
examinar, como ya comentamos en la sección anterior en el puntos de exploración, existen
diversas formas de selección.
Entrada: CN un conjunto de nodos del árbol de estados.
Salida: N un nodo del árbol de estados.
seleccionar \selecciona
(No se pueden seleccionar hojas del árbol ya que no podrían generar hijos)
3.- Función hijos: Se encarga de devolver todos los problemas del árbol de estados derivados
directamente del actual que se le pasa como parámetro.
Entrada: /V un nodo del árbol de estados.
Salida: C,v un conjunto de nodos del árbol de estados.
i oo
3.2 Esquema básico de resolución de problemas Ramificación y poda
4.- Función podar: Esta función se encarga de eliminar nodos que no van a conducir a la
solución óptima.
Entrada: C,v un conjunto de nodos del árbol de estados.
Salida: C/v un conjunto de nodos del árbol de estados.
5.- Función otenerSolución: Esta función simplemente devuelve la solución a partir do un nodo
hoja.
Entrada: C/v un conjunto de nodos del árbol de estados.
Salida: p solución asociada a un nodo hoja del problema.
obtenerSolución
Después de haber enunciado las funciones básicas del esquema RyP debemos demostrar que
el algoritmo termina en un número finito de pasos bajo problemas reales.
Teorema 3.1.1.
Demostración:
Por otra parte un nodo seleccionado se elimina y sus hijos son añadidos a "Cnv". En el
peor de los casos el "Cnv" solo contendrá conjuntos de un solo elemento (como hemos
comentado en el párrafo anterior) que no podemos seleccionar por ser hojas. Pero como la
función podar elimina todas las hojas menos una (ya que no puede eliminar la solución óptima),
llegará un momento en que se cumplirá la función "final" y, el algoritmo finalizará.
Queda por demostrar que la solución óptima se conserva de iteración a iteración. Para
ello definimos los siguiente términos. Sea X el problema original y Cm>, el contenido de la
variable Cnv al finalizar la iteración /, siendo evidente que en nuestro esquema RyP Cnv(¡={X}.
luí
Ramificación y poda 3.2 Esquema básico de resolución de problemas
Teorema 1.1.2.
Demostración:
Corolario 1.1.1.
Demostración:
Sea X es problema original claramente Cnv,, = /Xj y por el Teorema 1.1.2. cada iteración
conserva la solución óptima de la anterior.
Lo único que nos queda para finalizar es demostrar que nuestro algoritmo devuelve la
solución correcta requerida.
102
3.2 Esquema básico de resolución de problemas Ramificación y poda
Corolario 1.1.2.
Demostración:
Supongamos que nuestro esquema RyP termina en la iteración "t" y sea su respuesta
esto quiere decir que la variable
Ahora podemos afirmar que nuestro esquema RyP devuelve la solución correcta si
resuelve un problema finito y con al menos una solución (factible o no factible).
Bibliografía:
• [HS.78] Capítulo 8.
• [Mi,86] Capítulo 7.
• [BB.97] Capítulo 9.
103
This page intentionally left blank
3.3 Refinamientos sobre ei esquema básico
Planteamiento:
Objetivos:
12
Nombre reducido del primer refinamiento, que consiste en mantener el mejor resultado actual fuera de
la lista de nodos vivos.
11
Nombre reducido del segundo refinamiento, que establece una función cota pesimista que permite
definir nuevas reglas de poda.
105
Ramificación y poda 3.3 Refinamientos sobre e! esquema básico
Estamos buscando una solución óptima, ésta la contendrá una hoja, por lo que
demostraremos que podemos desechar el resto de hojas por no aportar información adiciona!.
Supongamos que en la variable Cnv existen dos nodos distintos que son hojas:
Entonces se deberá utilizar una variable que la llamaremos mejor para almacenar la
mejor solución en curso. De forma que el nuevo algoritmo mantendrá en memoria e! conjunto
de nodos vivos que no contendrá hojas.
106
3.3 Refinamientos sobre el esquema básico Ramificación y poda
función RyPl(X:N): p
var
sel, mejor,aux : N
Cnv : CN
fin var
Cnv -
mejor //tal que
devuelve Cnv
fin función
107
Ramificación y poda 3.3 Refinamientos sobre el esquema básico
Recordamos que g(-) es una función cota inferior como estamos minimizando se le
denomina también cota optimista y verifica:
1 g(t) es no decreciente en T.
Si ehijos(Y) entonces
2.
3.
EJEMPLO 3.3.1.1.
i 08
3.3 Refinamientos sobre el esquema básico Ramificación y poda
109
Ramificación v ooda 3.3 Refinamientos sobre el esauema básico
función RyP2(X:N): p
var
sel, mejor, aux : N //Nodos del árbol de estados
solucionReal: .7?
Cnv : CN //Conjunto de nodos del árboh de estados
cotajnejor : .'A1 //Solución del problema
fin var
Cnv = fXÍ
mejor = ü //tal que f( £2)=°° , Ul * /
cotajnejor = u(X)
solucionReal - Falso
mientras Cnv ¿ 0 //Regla de terminación
sel = seleccionar(Cnv) //Regla de selección
Cnv = borrar(Cnv, sel)
para todo aux e hijos(sel)
si \aux\ = 1 entonces //aux es hoja
si f(aux)<cotajnejor o (f(aux)=cota_mejory —¡solucionReal)
entonces
//Actualizar mejor solución hasta el momento (real)
solucionReal = Verdad
cotajnejor =f(aux)
mejor-aux
Cn v-podar(Cnv, cotajnejor, solucionReal)
fin si
si no
si g(aux) < cotajnejor o (g(aux)=cotajnejory —isolucionReal)
entonces
si cotajnejor > u(aux) entonces
//Actualizar mejor solución hasta el momento (ficticia)
solucionReal - Falso
cotajnejor = u(aux)
Cn v - podar(Cn v, cotajnejor, solucionReal)
fin si
Cnv - insertar(Cnv,aux)
fin si
fin si
fin para todo
fin mientras
devuelve obtenerElemento(mejor) //x : mejor = {x}
fin función
no
3.3 Refinamientos sobre el esquema básico Ramificación y poda
devuelve Cnv
fin función
b) Se puede hacer un refinamiento para evitar el cálculo de ios valores de las funciones f(x),
gfx) y u(x), guardando sus valores en variables, y ampliando la Cnv para guardar también la
g(-) del nodo que estamos considerando, para no tener que calcularlo al podar.
Se puede establecer una tabla resumen comparativa entre los algoritmos RyP1 y RyP2:
111
Ramificación v ooda 3.3 Refinamientos sobre el esquema básico
Como indica su nombre esta solución es aproximada y nos puede orientar sobre
solución correcta. Lo más importante que se puede señalar es que el error de la solución
subóptima se puede acotar. Por muchas iteraciones que realice nuestro algoritmo ia solución
no se nos desviará más que una porcentaje de la solución real.
Si nos fijamos en el algoritmo RyP se eliminan todos aquellos nodos A tales que,
g(A) >/(mejor) con lo que obtendríamos la solución óptima.
EJEMPLO 3.3.3.1.
Supongamos que permitimos una desviación del 70% sobre la solución óptima. Si en un
momento determinado f(mejor)=150 entonces podremos eliminar todos los nodos "A " para los
que g(A) > (150-0.1*150) = 135, ya que, "g(->" es creciente la solución que se podrá derivar
de él no dista en más de un 70% de la que proporcionaría la mejor.
Podemos decir que las funciones más utilizadas son las del tipo £(v) - 8-v donde 8>0
que marcan la proporción sobre el parámetro.
Bibliografía:
• [HS,78j Capítulo 8.
• [M¡,86] Capítulo 7.
112
3.4 Teoría de juegos
Planteamiento:
Vamos a realizar una introducción a un algoritmo básico de inteligencia
artificial como es el mini-rnax y un método de poda en la búsqueda de la mejor
solución como es la estrategia alfa-beta.
Objetivos:
Que el alumno tenga una idea intuitiva del algoritmo mini-max. y del método
de poda alfa-beta.
113
Ramificación y poda 3.4 Teoría de juegos
Este punto pretende dar una visión general sobre esta técnica, por lo que se abordará
un ejemplo y se comentará. Este ejemplo será sobre dos jugadores de ajedrez.
El primer paso consiste en definir una función de evaluación estática evcl(-) que asocia
un valor a cada configuración. Idealmente, nos gustaría que eval(u) fuese tanto mayor cuanto
más favorable sea una configuración del juego u. Es costumbre asignar un valor a las
configuraciones en igualdad de fuerzas y un valor tanto más negativo cuanto más desfavorable
sea la situación. Esta evaluación debe tener en cuenta distintos factores, tales como el número
y la calidad de las piezas de una y otra parte, el control del centro, la libertad de movimientos,
etc. Es necesario un compromiso entre lo buena que sea la función y el tiempo que tome
calcularla.
EJEMPLO 3.3.1.
Disponemos de dos jugadores A y B. La Figura 22 representa una parte del grafo
correspondiente a un cierto juego. Los valores asociados a las hojas se obtienen aplicando la
función eval(-) a las configuraciones correspondientes; los valores de los otros nodos pueden
calcularse según la regla del minimax. Se ha supuesto en este ejemplo que el jugador A busca
maximizar la función de evaluación y el B minimizarla. La técnica del minimax tiene una
profundidad determinada para no expandir indefinidamente, en este caso es de 3 niveles
Si A juega para maximizar su ventaja, escogerá la segunda jugada de entre las tres
posibles. Esto le asegura un valor 10 como mínimo.
114
3.4 Teoría de juegos Ramificación y poda
Método Alfa-beta
Esta técnica de base puede ser mejorada de distintas formas. Por ejemplo, puede ser
provechoso explorar más profundamente las jugadas prometedoras. Algunas ramas pueden
también ser abandonadas antes de terminar su exploración si la información obtenida es
suficiente para garantizar que no pueden, en ningún caso, influenciar el valor de sus
ascendientes. Esta segunda mejora es generalmente conocida como el nombre de método
alfa-beta. Se conoce también con el nombre de poda alfa-beta. Nos limitaremos con dar un
ejemplo simple de este método.
EJEMPLO 1.1.2,
Volvamos a la Figura 22. Sea (i,j) el j-ésimo nodo de la i-ésima línea del árbol.
Queremos calcular el valor de la raíz (U) a partir de los valores calculados por la función eval(-)
para las hojas (4,j), ¡<j<!8. Haremos un recorrido en profundidad del árbol tratando los
sucesores de una nodo de izquierda a derecha.
Para establecer que la raíz (1,1) vale 10, basta visitar sólo 19 de los 31 nodos que tiene
el árbol.
115
Ramificación y poda 3.4 Teoría de juegos
PROBLEMA 1.1.1.
¿Qué modificaciones se tiene que hacer en los principios expuestos en esta sección
para tener en cuenta los juegos de estrategia en los que interviene el azar? ¿Y si tuviéremos
un juego en el que participan más de dos personas?
PROBLEMA 1.1.2.
Escribir un programa capaz de ganar al campeón del mundo de backgammon. (¡Esto
ya ha sido hecho!).
Bibliografía:
116
3.5 Problemas resueltos
Planteamiento:
Objetivos:
117
Ramificación y poda 3.5 Problemas resueltos
La función objetivo pretende sumar todos los objetos de una solución dada.
La restricción nos dice que una solución factible es aquella cuya suma de los pesos de
sus elementos caben en la mochila.
donde
Restricciones:
14
'X' (en mayúscula) representa a todas las posibles soluciones, mientras que Y (en minúscula) representa
a una solución.
118
3.5 Problemas resueltos Ramificación y poda
119
Ramificación y poda 3.5 Problemas resueltos
Esta g(-) supone que se pueden incluir todos los objetos que llevamos hasta el
momento, más el resto que queda por explorar.
Pero esta cota no está muy ajustada. Ya que no tiene en cuenta el espacio que queda
libre en la mochila ni el beneficio del resto de elementos.
Otra solución mejor es rellenar con la solución del problema de la mochila continua, en
el que se pueden coger trozos del objeto. Podemos escoger la solución del problema de la
mochila continuo como una cota optimista del problema de la mochila discreta.
función
var
resto, provecho:
fin var
resto = M
provecho =
mientras
si resto > p¡ entonces
provecho - provecho + v¡ //Elemento entero
si no
provecho - provecho+(resto / p¡) * v¡ //Parte del elemento
fin si
resto - resto - p¡
i++
fin mientras
devuelve -provecho
fin si
fin función
120
3.5 Problemas resueltos Ramificación yjjoda
Ahora tenemos que comprobar que esta función g(-) cumple las tres propiedades de la
cota optimista (Las siglas PMC y PMD corresponden al cálculo del resto según el Problema de
la Mochila Continuo y Discreto respectivamente).
EJEMPLO 3.5.1.4.1
Veamos las ventajas que conlleva definir una u otra función g(-). Vamos a realizar dos
trazas del mismo problema para apreciar las diferencias entre ambas g(-) anteriormente
expuestas.
Figura 25. Algoritmo de la mochila con g(-l trivial (9 nodos expandidos hustn encontrar la solución).
15
La solución del problema de la mochila continúa siempre es menor o igual al discreto.
121
Ramificación y poda 3.5 Problemas resueltos
EJEMPLO 3.5.1.4.2
Aplicamos ahora la g(-) mejorada. La solución de! problema de la mochila continua.
Teniendo en cuenta que los elementos hay que ordenar según su ratio de provecho v/p¡.
Figura 26. Algoritmo de lu mochila con $(•) trivial (7 nodos expandidos hasta encontrar la solución)
Podemos comprobar en los dos ejemplos anteriores como la función g(-) se dirige hacia
la solución correcta en niveles iniciales del árbol de búsqueda de soluciones, si esta función
está ajustada. En el caso de la $(•) trivial (Figura 25) el algoritmo necesitaría expandir 9 nodos,
dado que explora ramas que no le conducen a la solución. Mientras que la función g(-) definida
como la solución de la mochila continua (Figura 26) consigue encontrar la solución con 7 nodos
expandidos, examinando sólo dos nodos hoia.
Dejamos para el lector que compruebe que cumple las tres propiedades de una cota
pesimista.
1) entonces u(z) ^u(y). Función no creciente.
2)
3)
para no tener que calcularlos cada vez que se llama a la función g(-) o la función u(-).
122
3.5 Problemas resueltos Ramificación y poda
Un nodo intermedio del árbol de estados quedará definido por un conjunto de nodos
recorridos que no llegará a ser « (todos los nodos) y por supuesto no será solución. Las
soluciones únicamente las tendremos en los nodos hojas.
123
Ramificación y poda 3.5 Problemas resueltos
Función hijos(-):
1)
Se tiene que cumplir por tener mismo nodo raíz, y cumplir la desigualdad triangular.
16
17
Sea un grafo G=(N,A)
124
3.5 Problemas resueltos Ramificación v ooda
2)
Por R.A. supongamos que no es cierto ademas
que esta en desacuerdo con la desigualdad triangular, por lo que hemos llegado a una
contradicción, luego c.q.d.
3) S¡|;y| = l =>#(y) = / ( y )
Inmediato.
No obstante, esta cota no está muy ajustada. Existe una forma de obtener una función
g(-) que se ajuste más, basándose en el uso de la matriz reducida.
1) Cambiar todos los valores en la fila "í" y en la columna "/' por «>, para impedir utilizar
más arcos que salgan de Y o lleguen a "/"'•
2) Poner /I//, /y = «.
3) Reducir filas y columnas excepto aquellas cuyos valores son todo
125
Ramificación y poda 3.5 Problemas resueltos
EJEMPLO 3.5.2.4.1.
Reducir
Matriz
Inicial
Vamos ahora a mostrar las como quedarán las matrices para cada nodo necesario para
la traza.
126
3.5 Problemas resueltos Ramificación y poda
Figura 28. Árbol de estados correspondiente al problema del viajante de comercio (matriz de coste reducida)
Bibliografía:
[HS.781 Capítulo 8.
[Mi,86] Capítulo 7.
127
This page intentionally left blank
3.6 Ejercicios
Planteamiento:
Objetivos:
129
Ramificación y poda 3.6 Ejercicios
Queremos realizar un viaje con nuestro coche desde una ciudad origen a otra destino.
Tenemos un mapa de carreteras donde están señaladas todas las gasolineras y, por lo tanto,
sabemos las distancias entre ellas. Llenamos el depósito de gasolina que nos permite recorrer
K kilómetros (a la velocidad habitual de nuestra marcha). Para ganar tiempo queremos realizar
el número mínimo de paradas para repostar combustible.
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina una función cota inferior, lo más ajustada posible al problema.
c) Que se realice una traza del problema con K=300 kims:
• Árbol de nodos intermedios con la cota inferior correspondiente.
• Etiquetar el orden de recorrido del árbol.
• Identificar las podas en el árbol.
• Lista de nodos vivos en cada iteración.
130
3.6 Ejercicios Ramificación y poda
Se quiere encontrar una solución para satisfacer al número máximo de alumnos, según su
orden de preferencia.
Se pide:
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina una función cota inferior y otra superior lo más ajustadas posible al
problema.
c) Que se realice una traza para el problema del enunciado:
• Árbol de nodos intermedios con la cota inferior correspondiente.
• Etiquetar el orden de recorrido del árbol.
• Identificar las podas en el árbol.
• Lista de nodos vivos en cada iteración.
3.6.3 Puzzle
Queremos resolver un puzzle de tamaño /Vx/V en el menor número de movimientos
posibles. Nos dan una matriz que está desordenada y tenemos que realizar los movimientos
correspondientes para que esta matriz tenga la solución correcta del puzzle.
En la matriz siempre tenemos una casilla en blanco para desplazar un movimiento las
celdas adyacentes (movimientos permitidos).
El puzzle siempre tiene solución.
Ejemplo
Del
1 2 3 1 2 3 1 2 3 1 2 3
Problema 4 6- —»• 4 6 4 5 6 4 5 6
Matrices t
7 5 8 7 5 8 7 •4 -8 7 8
3x3
Movimiento 1 Movimiento 2 Movimiento 3 ¡ Solución !
Se pide:
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina una función cota inferior, lo más ajustada posible al problema.
c) Que se realice una traza del problema con:
1 2 3
4 5
7 3 6
131
Ramificación y poda 3.6 Ejercicios
Se pide:
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina una función cota inferior y oirá cota superior, lo más ajustada posible al
problema.
c) Que se realice una traza del problema con el ejemplo del enunciado:
• Árbol de nodos intermedios con la cota inferior correspondiente.
• Etiquetar el orden de recorrido del árbol.
• Identificar las podas en el árbol.
• Lista de nodos vivos en cada iteración.
Se pide:
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina dos funciones, una cota inferior y otra cota superior, lo más ajustadas
posible al problema.
c) Que se realice una traza del problema con:
• Árbol de nodos intermedios.
• Etiquetar el orden de recorrido del árbol.
• Identificar las podas en el árbol.
• Lista de nodos vivos en cada iteración.
132
3.6 Ejercicios Ramificación y poda
Ejemplo:
Tipo de autobús \ l'lazas máximas Disponibles Coste
0 !(> j 10.000 ¡ítem.
1 15 2 U.SOOpttix.
2 50 / 40.000 ptas.
•' - 60 2 54.000 imis.
Se pide:
a) Que se plantee la solución para un problema genérico mediante RyP (solución, función
objetivo y restricciones, nodos intermedios y función hijos).
b) Que se defina la función cota inferior, lo más ajustada posible al problema.
c) Que se realice una traza del problema con P=65 (Personas):
• Árbol de nodos intermedios con la cota inferior correspondiente.
• Etiquetar el orden de recorrido del árbol.
• Identificar las podas en el árbol.
• Lista de nodos vivos en cada iteración.
133
This page intentionally left blank
3.7 Soluciones
Planteamiento:
Objetivos:
135
Ramificación y poda 3.7 Soluciones
Sea G=(N,A) el grafo del conexiones que describe la red con AfeNodos y /^Aristas.
Estructura de datos:
;j=Autonomía en Kms.
gasolineras recorridas
paradas en gasolineras
Función objetivo:
Función hijos:
b) Que se defína una función cota inferior, lo más ajustada posible al problema.
Supongamos que tenemos una matriz de distancias mínimas entre los nodos
(Algoritmo de Kruscal) que se calcula en tiempo de preproceso con un coste O(n3)
entonces podemos definir nuestra cota inferior como:
136
3.7 Soluciones Ramificación y poda
Cnv0=(U
Cn\'!=¡2.3l
Cnv-,=¡i,4,5¡
Cnv,=¡4.5,6,7 ¡
Solución F(8)=2, y poda el resto de nodos pendientes.
137
Ramificación y poda 3.7 Soluciones
Estructura de datos:
Función objetivo:
Función hijos:
b) Que se defina una función cota inferior y otra superior lo más ajustadas posible
al problema.
138
3.7 Soluciones Ramificación y poda
IK
La elección de pesos se ha realizado arbitrariamente. Podría elegirse otros distintos para deshacer
empates.
139
Ramificación y poda 3.7 Soluciones
3.6.3 Puzzle
a) Que se plantee la solución para un problema genérico mediante RyP (solución,
función objetivo y restricciones, nodos intermedios y función hijos).
Estructura de datos:
Función objetivo:
Función hijos:
b) Que se defina una función cota inferior lo más ajustada posible al problema.
Los movimientos necesarios serán, al menos, todas las casillas que no estén
en su lugar (el cuadro blanco actúa como comodín) más el ns de movimientos
realizados.
140
3.7 Soluciones Ramificación y poda
1 2 3
4 5
7 8 6
141
Ramificación v poda 3.7 Soluciones
Antes de comenzar podríamos calcular una nueva tabla Beneficio como la diferencia entre
Bonificaciones-Gastos.
Bencficio(i,j)=Bonificacione.\(i,j)-Gasto.i(iJ)
Beneficio
Sep Oct M,v Dic
Edi. 4 7 7 .?
Ed2. 5 -3 9 5
Ed3. -/ 3 10 /
Ninguno 0 0 0 0
Estructura de datos:
MsMeses.
jVsNúmero de edificios
[No}=No se asigna edificio
Función objetivo:
Función hijos:
b) Que se deñna una función cota inferior, lo más ajustada posible al problema.
Función g(-) cota inferior:
La g(-) calculará las decisiones que hemos tomado hasta el momento y el máximo de
los próximos meses.
i 142
3.7 Soluciones Ramificación y poda
como hay siempre una fila con valor O de beneficio (es la posibilidad de no construir es
edificio), la fórmula anterior se transforma en:
143
Ramificación y poda 3.7 Soluciones
Estructura de datos:
Función objetivo:
Utilizaremos la función moil como módulo (resto de la división entera)
Podemos plantear es problema
como la minimización de la
simpatía entre los invitados.
Función hijos:
/ = Invitados por
colocar
Y= Invitados
sentados
b) Que se defina una función cota inferior y otra superior lo más ajustadas posible
al problema.
144
3.7 Soluciones Ramificación y poda
La función «(•; será equivalente a la anterior pero, sumará todas las afinidades
de los invitados sentados y agregará el mínimo del resto de los invitados que quedan
por sentar.
145
Ramificación y poda 3.7 Soiuciones
Función hijos:
b) Que se defina una función cota inferior, lo más ajustada posible al problema.
Supongamos que tenemos los tipos de autobuses ordenados por e! cociente
Coste/(Plazas máximas):
146
3.7 Soluciones Ramificación y poda
147
This page intentionally left blank
Referencias
Bibliografía básica
Bibliografía complementaria
[Mi,86] M. Minoux.
"Mathematical Programming Theory and Algorithms"
John Wiley and Sons
149
This page intentionally left blank
índice analítico
inicio, 26, 27. 33, 34, 40, 41, 42, 46, 47, 48. 50,
53,58,69.73.76,78,81,83,85
A
algoritmia, 4. 5 I
algoritmo, 1,4.5.6, 1 1 , 13, 14, 16, 17, 18,21,22,
23, 28, 30, 33, 43, 49. 50, 56, 59, 63, 64. 65, 71, iterativo, 14. 20, 22. 37. 39, 41, 43. 48, 49, 50, 55, 56.
75, 76, 77, 79, 82, 84, 87, 89, 94, 97, 99, 100, 101. 58, 59, 77, 79
103, 105. 106. 109. 110, 1 1 1 , 113, 123, 125, 126,
135
divide y vencerás, 3 M
heurístico. 4 minimal, 31,32, 33.39. 47, 54
iterativo, 11
optimización, 1 1
recursivo, 1 1 N
voraz, 3 noetheriano, 31, 32, 33. 39, 46. 47. 54, 55
vuelta atrás. 3 notación. 6, 9
C
O
complejidad. 3, 95 optimi/.ación. I 1, 89, 91, 93
espacial, 5, 22
temporal, 3, 4, I I , 13, 14, 16, 18,21,37.39,43.
49, 50, 55, 56, 1 1 1 P
temporales. 59
conclusión, 22 paradigma, 5
conjunto, 4. 6, 7, 8, 16. 17, 18, 25. 26, 27, 28. 29, 30, funcional. 5
31, 32, 33, 39, 40, 41. 45. 53. 54, 55, 70, 76, 85, imperativo. 5
91,92,93,94,95.99. 100, 105. 108, 110, 1 2 1 , 126 lógico. 5
PDI, 40, 41, 42, 48. 49, 50, 55, 56, 58, 59. 63. 64, 65,
71. 72. 74. 75. 77, 79. 80. 81. 82. 83, 84. 86. 87
D PDR, 26. 27. 33, 34. 40. 41. 42. 46, 47, 49. 50. 54.
55, 56, 58, 59, 63. 64, 65, 69, 70. 71. 73. 74, 75,
divide y vencerás. 5, 13. 16, 17 76, 77, 78, 79. 81, 82. 83. 84, 85, 86, 87
programación dinámica, 5. I I , 13. 18, 22. 23, 25, 26,
E 27, 32, 35, 36, 37, 39, 43, 61. 65, 67
Programación Metódica, 1, 3, 5
espacio. 123 Programación Orientada a Objetos, 5
decisión. 25, 33
memoria, 4, 39
problema, 25. 30, 33, 35 R
solución. 25, 92. 128 ramificación y poda, 5, 89, 91. 92. 97. 103, 119, 130,
Esquemas Algorítmicos. 3 131, 135, 137
recursivo, 13. 14, 17, 18, 21, 22, 23, 25, 26. 27, 32.
F 33. 37. 39, 41. 43. 46, 49, 50, 53, 54, 55, 56. 58.
59, 76
fórmula, 13.29,49.56. 146 relación de orden estricto, 30, 33
funciones programación dinámica iterativa RyP, 91,92. 94, 99. 100, 101. 102, 1 1 1 , 133, 134.
ps, 40, 41, 42, 48, 55, 59, 71. 74. 77, 79, 82, 83, 86 135, 136, 139, 141. 143. 145. 147. 149
ss, 40, 41, 42. 48, 55, 59, 71, 74, 77, 79, 82, 83, 86
funciones programación dinámica recursiva
cálculo, 6, 26. 27, 33, 34, 40, 41, 46, 47, 48, 49. S
50. 53, 58, 69, 73, 76, 78, 81, 83. 85 subproblema, 13, 18, 20, 25. 26. 37, 39, 40, 92, 94
combinar, 26. 27, 33, 34, 40, 41. 46. 47, 48, 50,
54,58,69,73,76.78,81.83,85
contorno, 26. 27, 33, 34, 40, 41, 42, 46, 47, 48. 50,
V
53,58,69,73.76.78.81,83,85
vuelta atrás, 5, 91. 92
descomposición, 25. 26, 27, 33, 34, 35, 40. 41, 46,
47, 48, 50, 54. 58. 69, 73, 76. 78. 81, 83, 85
151