Beruflich Dokumente
Kultur Dokumente
PONTIFICIA
DE SAN FRANCISCO XAVIER DE
CHUQUISACA
PROGRAMACION AVANZADA
SIS427
TEMA 04 – ESTRATEGIAS DE RESOLUCION DE
PROBLEMAS
AUTOR: CARLOS WALTER PACHECO LORA
GRUPO 1
• La búsqueda binaria en un vector ordenado.
• En este caso, la operación descomponer selecciona una de las dos mitades del
vector y la operación combinar es vacía. Obteníamos los siguientes
parámetros de coste:
• b =2 Tamaño mitad del subvector a investigar en cada llamada recursiva.
• a =1 Un subproblema a lo sumo.
• k =0 Coste constante de la parte no recursiva.
• dando un coste total O(log n).
GRUPO 2
• La ordenación mediante mezcla o mergesort
• responde al esquema:
• La operación descomponer divide el vector en dos mitades y la operación
combinar mezcla las dos mitades ordenadas en un vector final.
• Los parámetros del coste son:
• b =2 Tamaño mitad de cada subvector.
• a =2 Siempre se generan dos subproblemas.
• k =1 Coste lineal de la parte no recursiva (la mezcla).
• dando un coste total O(n log n).
GRUPO 3
• La ordenación rápida o quicksort, considerando solo el caso mejor.
• Responde al esquema. La operación descomponer elige el pivote, particiona
el vector con respecto a él y lo divide en dos mitades. La operación combinar
en este caso es vacía.
• Los parámetros del coste son:
• b =2 Tamaño mitad de cada subvector.
• a =2 Siempre se generan dos subproblemas.
• k =1 Coste lineal de la parte no recursiva (la partición).
• dando un coste total O(n log n).
GRUPO 4
• La comprobación en un vector v estrictamente ordenado de si existe
un índice i tal que v[i] =i sigue un esquema similar al de la búsqueda
binaria:
• b =2 Tamaño mitad del subvector a investigar en cada llamada recursiva.
• a =1 Un subproblema a lo sumo.
• k =0 Coste constante de la parte no recursiva.
• dando un coste total O(log n).
• Un problema históricamente famoso es el de la solución DV a la
transformada discreta de Fourier (DFT), dando lugar al algoritmo
conocido como transformada rápida de Fourier, o FFT (J.W. Cooley y
J.W. Tukey, 1965).
• La transformada discreta convierte un conjunto de muestras de
amplitud de una señal, en el conjunto de frecuencias que resultan del
análisis de Fourier de la misma. Esta transformación y su inversa (que
se realiza utilizando el mismo algoritmo DFT) tienen gran interés
práctico pues permiten filtrar frecuencias indeseadas (p.e. ruido) y
mejorar la calidad de las señales de audio o de vídeo.
PRATICO LABORATORIO
• Organización de un campeonato
• Se tienen n participantes para un torneo de ajedrez y hay que organizar un
calendario para que todos jueguen contra todos de forma que:
• Cada participante juegue exactamente una partida con cada uno de los n – 1 restantes.
• Cada participante juegue a lo sumo una partida diaria.
• El torneo se complete en el menor número posible de días.
• En este tema veremos una solución para el caso, más sencillo, en que n es
potencia de 2
• Es fácil ver que el número de parejas distintas posibles es ½n(n – 1). Como n
es par, cada día pueden jugar una partida los n participantes formando con
ellos n/2 parejas. Por tanto se necesita un mínimo de n - 1 días para que
jueguen todas las parejas.
• Una posible forma de representar la solución al problema es en forma
de matriz de n por n, donde se busca rellenar, en cada celda aij , el día
que se enfrentarán entre sí los contrincantes i y j, con j <i. Es decir,
tratamos de rellenar, con fechas de encuentros, el área bajo la
diagonal de esta matriz; sin que en ninguna fila o columna haya días
repetidos.
• Se ha de planificar las parejas de cada día, de tal modo que al final
todos jueguen contra todos sin repetir ninguna partida, ni descansar
innecesariamente.
• Podemos ensayar una solución DV según las siguientes ideas:
• Si n es suficientemente grande, dividimos a los participantes en dos grupos
disjuntos A y B, cada uno con la mitad de ellos.
• Se resuelven recursivamente dos torneos más pequeños: el del conjunto A
jugando sólo entre ellos, y el del conjunto B también jugando sólo entre ellos.
En estos sub-torneos las condiciones son idénticas a las del torneo inicial por
ser n una potencia de 2; con la salvedad de que se pueden jugar ambos en
paralelo.
• Después se planifican partidas en las que un participante pertenece a A y el
otro a B. En estas partidas, que no se pueden solapar con los sub-torneos, hay
que rellenar todas las celdas de la matriz correspondiente.
• Esta última parte se puede resolver fácilmente fila por fila, rotando,
en cada nueva fila, el orden de las fechas disponibles. Como hay que
rellenar n/2 · n/2 celdas, el coste de esta fase está en en .
• Los casos base, n =2 o n =1, se resuelven trivialmente en tiempo
constante.
• Esta solución nos da pues los parámetros de coste a =2, b=2y k =2,
que conducen a un coste esperado de . No puede ser menor
puesto que la propia planificación consiste en rellenar celdas.
Pasamos entonces a precisar los detalles.
IMPLEMENTACION
• Usaremos una matriz cuadrada declarada como int a[MAX][MAX] (donde MAX es
una constante entera) para almacenar la solución, inicializada con ceros. La
primera fecha disponible será el dia 1.
• De forma similar a ejemplos anteriores la función recursiva, llamada rellena,
recibe dos parámetros adicionales, c y f que delimitan el trozo de la matriz que
estamos rellenando, y que por tanto se inicializan respectivamente con 0 y num -
1, siendo num el número de participantes. Se asume que dim = f - c + 1 es
potencia de 2.
• En el caso base en que solo haya un equipo (dim = 1) no se hace nada. Si hay dos
equipos (dim = 2), juegan el dia 1.
• El cuadrante inferior izquierdo representa los partidos entre los equipos de los
dos grupos. El primer dia disponible es mitad = dim/2 y hacen falta mitad dias
para que todos jueguen contra todos. Las rotaciones se consiguen con la fórmula
mitad + (i + j)%mitad.
PROGRAMACION DINAMICA
• Problemas cuyas soluciones pueden ser expresadas recursivamente en términos matemáticos, y posiblemente la manera más
natural de resolverlos es con un algoritmo recursivo. El tiempo de ejecución de la solución recursiva, normalmente es de orden
exponencial y por tanto impracticable, puede mejorarse substancialmente mediante la Programación Dinámica.
• En el diseño Divide y Vencerás veíamos cómo para resolver un problema lo dividíamos en subproblemas independientes, los
cuales se resolvían de manera recursiva para combinar finalmente las soluciones y así resolver el problema original.
• El inconveniente se presenta cuando los subproblemas obtenidos no son independientes sino que existe solapamiento entre ellos;
entonces es cuando una solución recursiva no resulta eficiente por la repetición de cálculos que conlleva.
• En estos casos es cuando la Programación Dinámica nos puede ofrecer una solución aceptable. La eficiencia de esta técnica
consiste en resolver los subproblemas una sola vez, guardando sus soluciones en una tabla para su futura utilización.
• La Programación Dinámica no sólo tiene sentido aplicarla por razones de eficiencia, sino porque además presenta un método
capaz de resolver de manera eficiente problemas cuya solución ha sido abordada por otras técnicas y ha fracasado.
• Donde tiene mayor aplicación la Programación Dinámica es en la resolución de problemas de optimización. En este tipo de
problemas se pueden presentar distintas soluciones, cada una con un valor, y lo que se desea es encontrar la solución de valor
óptimo (máximo o mínimo).
• La solución de problemas mediante esta técnica se basa en el llamado principio de óptimo enunciado por Bellman en 1957 y que
dice:
• “En una secuencia de decisiones óptima toda subsecuencia ha de ser también óptima”.
• Hemos de observar que aunque este principio parece evidente no siempre es aplicable y por tanto es necesario verificar que se
cumple para el problema en cuestión. Un ejemplo claro para el que no se verifica este principio aparece al tratar de encontrar el
camino de coste máximo entre dos vértices de un grafo ponderado.
CONSIDERACIONES IMPORTANTES
• La programación dinámica es una técnica matemática que se utiliza
para la solución de problemas matemáticos seleccionados, en los
cuales se toma una serie de decisiones en forma secuencial.
• Proporciona un procedimiento sistemático para encontrar la combinación de
decisiones que maximice la efectividad total, al descomponer el problema en
etapas, las que pueden ser completadas por una o más formas (estados),
y enlazando cada etapa a través de cálculos recursivos.
DEFINICIONES
• Etapa: es la parte del problema que posee un conjunto de alternativas
mutuamente excluyentes, de las cuales se seleccionara la mejor alternativa.
• Estado: es el que refleja la condición o estado de las restricciones que
enlazan las etapas. Representa la “liga” entre etapas de tal manera que
cuando cada etapa se optimiza por separado la decisión resultante es
automáticamente factible para el problema completo.
ESQUEMA DE UNA ETAPA
qi
E
S X i1 qi Variable de estado en la etapa i
T ....
*
Xij Uno de los valores que puede
A ETAPA i X ij Xi
D .... adoptar la variable de decisión
O X iJ “Xi” en la etapa i
S
Xi* Decisión óptima de la etapa i
REST O
CONDICIONES Y PASOS:
Las condiciones requeridas son:
1. La solución al problema ha de ser alcanzada a través de una secuencia de
decisiones, una en cada etapa.
2. Dicha secuencia de decisiones ha de cumplir el principio de óptimo.
El diseño de un algoritmo de Programación Dinámica consta de los siguientes
pasos:
1. Planteamiento de la solución como una sucesión de decisiones y verificación de
que ésta cumple el principio de óptimo.
2. Definición recursiva de la solución.
3. Cálculo del valor de la solución óptima mediante una tabla en donde se almacenan
soluciones a problemas parciales para reutilizar los cálculos.
4. Construcción de la solución óptima haciendo uso de la información contenida en
la tabla anterior.
FORMULACION Y SOLUCION DE PROBLEMAS
• La programación dinámica no cuenta con una formulación
matemática estándar, sino se trata de un enfoque de tipo general
para la solución de problemas, y las ecuaciones espécificas que se
usan se deben desarrollar para que representen cada situación
individual.
• Comunmente resuelve el problema por etapas, en donde cada etapa
interviene exactamente una variable de optimización (u optimizadora)
• La teoría unificadora fundamental de la programación dinámica es el
Principio de Optimalidad, que nos indica básicamente como se puede
resolver un problema adecuadamente descompuesto en etapas
utilizando cálculos recursivos.
• “Una política óptima tiene la propiedad de que, independientemente de las
decisiones tomadas para llegar a un estado particular, en una etapa
particular, las decisiones restantes deben constituir una política óptima para
abandonar ese estado”
REQUISITOS PARA RESOLVER PROBLEMAS
CON PROGRAMACION DINAMICA
• Un grado de creatividad
• Un buen conocimiento de la estructura general de los problemas de
los problemas de programación dinámica para reconocer cuando un
problema se puede resolver por medio de estos procedimientos y
como esto se puede llevar a cabo.
CARACTERISTICAS DE LOS PROBLEMAS DE
PROGRAMACION DINAMICA
• El problema se puede dividir en etapas que requieren una política de decisión
en cada una.
• Cada etapa tiene cierto numero de estados asociados a ella.
• El efecto de la política de decisión en cada etapa es transformar el estado
actual en un estado asociado con la siguiente etapa.
• El procedimiento de solución esta diseñado para encontrar una política
óptima para el problema completo.
• Dado un estado actual, una política optima para las etapas restantes es
independiente de la política adoptada en las etapas anteriores (principio de
optimalidad).
• El procedimiento de solución se inicia al encontrar la política optima para la
ultima etapa.
• Se dispone de una relación recursiva que identifica la política optima para la
etapa n dada la política optima para la etapa (n+1)
CÁLCULO DE LOS
NÚMEROS DE FIBONACCI
La forma más natural de calcular los
términos de esa sucesión es mediante un
programa recursivo
• El inconveniente es que el algoritmo resultante es poco eficiente ya que su tiempo de ejecución es de orden
exponencial.
• La falta de eficiencia del algoritmo se debe a que se producen llamadas recursivas repetidas para calcular valores de la
sucesión, que habiéndose calculado previamente, no se conserva el resultado y por tanto es necesario volver a calcular
cada vez.
• Para este problema es posible diseñar un algoritmo que en tiempo lineal lo resuelva mediante la construcción de una
tabla que permita ir almacenando los cálculos realizados hasta el momento para poder reutilizarlos:
• El algoritmo iterativo que calcula la sucesión de Fibonacci utilizando
tal tabla es:
• Otra mejora a este algoritmo, que aparece al fijarnos que únicamente son necesarios los dos
últimos valores calculados para determinar cada término, lo que permite eliminar la tabla entera
y quedarnos solamente con dos variables para almacenar los dos últimos términos:
• Aunque esta función sea de la misma complejidad temporal que la
anterior(lineal), consigue una complejidad espacial menor, pues de ser de
orden O(n) pasa a ser O(1) ya que hemos eliminado la tabla.
• El uso de estructuras (vectores o tablas) para eliminar la repetición de los
cálculos, pieza clave de los algoritmos de Programación Dinámica, hace que
en este capítulo nos fijemos no sólo en la complejidad temporal de los
algoritmos estudiados, sino también en su complejidad espacial.
• En general, los algoritmos obtenidos mediante la aplicación de esta técnica
consiguen tener complejidades (espacio y tiempo) bastante razonables,
pero debemos evitar que el tratar de obtener una complejidad temporal de
orden polinómico conduzca a una complejidad espacial demasiado
elevada.
CALCULO DE LOS COHEFICIENTES
BINOMIALES
• En este segundo ejemplo, vamos a necesitar una tabla bidimensional
para el cálculo de los coeficientes binomiales, definidos como:
7 1
B E
2 4
6 4
H 3
3 6
4 2
A C F J
4 3
Missouri 4
I 4 California
3
3 1
D G
5 3
E F G H I
J
Costos de B 7 4 6 E 1 4
H 3
Transición: B C D C 3 2 4 F 6 3
I 4
A 2 4 3 D 4 1 5 G 3 3
SOLUCIÓN
f*4 (H) = 3
f*4 (I) = 4
PROCEDIMIENTO DE SOLUCIÓN
f*3 (E) = 4
f*3 (F) = 7
f*3 (G) = 6
PROCEDIMIENTO DE SOLUCIÓN
Si se pasa al problema de
cuatro etapas (n=1), los
cálculos son parecidos a
los que se acaban de
mostrar
para el problema de tres
etapas (n=2) , excepto que
ahora hay solo un inicio
posible, s=A , como se
muestra el diagrama.
PROCEDIMIENTO DE SOLUCIÓN
Como el mínimo costo es 11, por tanto los caminos pueden ser C ó D.
En este punto se puede identificar la solución óptima. Los resultados
indican los caminos óptimos a seguir:
A D E H J ó A D F I J, las dos tienen un costo total de 11
PROBLEMAS TÍPICOS DE P.D.
c1 r1 c2 r2 c3 r3
1 0 0 0 0 0 0
2 1 5 2 8 1 4
3 2 6 3 9 - -
4 - - 4 12 - -
INVERSIÓN DE CAPITAL
Una forma de resolver este problema es intentar todas las posibilidades y
elegir la mejor. En ese caso, hay solo 3 x 4 x 2 = 24 formas de invertir el
dinero. Muchas de estas son infactibles (por ejemplo, propuestas 3, 4 y 1
para las tres plantas cuesta $6 millones). Otras propuestas son factibles,
pero son muy pobres en retorno (como propuestas 1, 1 y 2, con un retorno
de sólo $4 millones.)
Desventajas de una enumeración completa:
Para problemas de gran tamaño la enumeración de todas las posibles
soluciones puede no ser factible computacionalmente.
Las combinaciones NO factibles no pueden ser detectadas a priori,
llevando a una ineficiencia.
Información sobre combinaciones previamente investigadas no se usan
para eliminar otras combinaciones menos buenas, o no factibles.
INVERSIÓN DE CAPITAL
Cabe hacer notar que este problema no puede ser formulado como un problema de
programación lineal, porque los retornos no son funciones lineales.
Un método para calcular la solución es:
Dividamos el problema en 3 etapas: cada etapa representa el dinero asignado a una
única planta. Así la etapa 1 representa el dinero asignado a la planta 1.
Artificialmente se dará un orden a las etapas, asumiendo que primero se asignará a
la planta 1, luego a la planta 2 y finalmente a la planta 3.
Cada etapa está dividida en estados. Un estado guarda la información requerida
para ir desde una etapa a la siguiente. En este caso los estados por etapa 1, 2 y 3
son:
{0,1,2,3,4,5}: cantidad de dinero gastado en la planta 1, representado como x1 ,
{0,1,2,3,4,5}: cantidad de dinero gastado en las plantas 1 y 2 (x2), y
{5}: cantidad de dinero gastado en las plantas 1, 2, y 3 (x3).
INVERSIÓN DE CAPITAL
Es necesario notar que diferentemente a lo que es
programación lineal, las xi no representan variables de
decisión: ellas son simplemente representaciones de un
estado genérico en la etapa.
Un retorno se asocia a cada estado. Se debe notar que para
tomar una decisión en el estado 3, es sólo necesario
conocer cuanto se gastó en las plantas 1 y 2, no cómo esto
fue gastado. También note que se desea que x3 sea 5
Determinando los retornos asociados a cada estado, lo más
fácil es en la etapa 1, los estados x1. La Tabla 2 muestra el
retorno asociado con x1.
TABLA 2