You are on page 1of 29

ESTRATEGIAS DE DISEO

A travs de los aos los cientficos de la computacin de la computacin diversas tcnicas que producen algoritmos eficientes para la resolucin de problemas. Las diversas estrategias son:
RECURSION DIVIDIR PARA CONQUISTAR TECNICAS AVIDAS METODO DE RETROCESO PROGRAMACION DINAMICA

RECURSION
Tcnica para algoritmos eficientes basada en la solucin de versiones ms pequeas del problema para obtener la solucin general del mismo. Una instancia del problema se soluciona segn la solucin de una o ms instancias diferentes y ms pequeas. Sirve para resolver cierto tiempo de problemas reduciendo la complejidad y ocultando los detalles del problema.

Esta herramienta consiste en que una funcin o procedimiento se llama a si mismo. Algunos algoritmos pueden ser descritos con mayor claridad en trminos de recursividad, el resultado ser que sus programas sern ms pequeos. La RECURSIVIDAD, es una alternativa a la iteracin o repeticin, aunque en tiempo de computador y en ocupacin en memoria es la solucin recursiva menos eficiente que la solucin iterativa, existen numerosas situaciones en las que la Recursividad es una solucin simple y natural a un problema y difcil de resolver

DEFINICION: RECURSIVIDAD Un objeto es recursivo si figura en su propia definicin Como caracterstica principal de la recursividad es que siempre existe un medio de salir de la definicin mediante la cual se termina el proceso recursivo

VENTAJAS:
Puede resolver problemas complejos Solucin natural

DESVENTAJAS:
Se puede llegar a un ciclo infinito Versin no recursiva ms difcil de desarrollar Para la gente sin experiencia es difcil de programar

RECURSION
Tipo de Recursin:
Directa o simple: Un subprograma se llama a si mismo una o ms veces directamente.
SUBPROGRAMA

Indirecta o Mutua: Un subprograma A llama a otro subprograma B y ste a su vez llama al subprograma A.
SUBPROGRAMA A SUBPROGRAMA B

PROPIEDADES PARA PROCEDIMIENTO RECURSIVO


Debe de existir cierto criterio (criterio base) en donde el procedimiento no se llama a s mismo. Debe existir al menos una solucin no recursiva. En cada llamada se debe de acercar al criterio base (reducir rango). El problema debe reducirse en tamao, expresando el nuevo problema en trminos del propio problema, pero ms pequeo. Los algoritmos de divide y vencers pueden ser procedimientos recursivos.

PROPIEDADES PARA UNA FUNCION RECURSIVA Debe de haber ciertos argumentos, llamados valores base para los que la funcin no se refiera a s misma. Cada vez que la funcin se refiera as misma el argumento de la funcin debe de acercarse ms al valor base.

EJEMPLOS
n!=1*2*3*4**(n-2)*(n-1)*n 0!=1 1!=1 2!=1*2 3!=1*2*3 n!=n!=1*2*3*4**(n-2)*(n-1)*n n!=n*(n-1)!

Si n=0 entonces n!=1 Si n>0 entonces n!=n*(n-1)! Function factorial(n: integer): longint: begin if(n=0) then factorial:=1 else factorial:= n*factorial(n-1); end;
Si n=4 Factorial(4)=4*factorial(3)=24 Factorial(3)=3*factorial(2)=6 Factorial(2)=2*factorial(1)=2 Factorial(1)=1*factorial(0)=1 Factorial(0)=1

La profundidad de un procedimiento recursivo es el nmero de veces que se llama a s mismo

SERIE DE FIBONACCI 0,1,1,2,3,5,8,.. F0=0 F1=1 F2=F1+F0=1 F3=F2+F1=2 F4=F3+F2=3 . FN=FN-1+FN-2 SI N=0,1 FN=N SI N>1 FN=FN-1+FN-2 Procedure fibo(var fib:logint; n:integer); Var fibA, fibB: integer; Begin if(n=0) or(n=1) then fib:=n else begin fibo(fibA,n-1); fibo(fibB,n-2); fib:=fibA+fibB; end; End; Function fibo(n:integer):integer Begin if(n=0) or (n=1) then fibo:=n else fibo:=fibo(n-1)+fibo(n-2); end; End;

DIVIDIR PARA CONQUISTAR


Consiste en descomponer el caso que hay que resolver en subcasos ms pequeos, resolver independientemente los subcasos Para aplicar la estrategia Divide y Venceras es necesario que se cumplan tres condiciones:
La decisin de utilizar el subalgoritmo bsico en lugar de hacer llamadas recursivas debe tomarse cuidadosamente. Tiene que ser posible descomponerse el caso en subcasos y recomponer las soluciones parciales de forma eficiente. Los subcasos deben ser en lo posible aproximadamente del mismo tamao

En la mayora de los algoritmos de Divide y Vencers el tamao de los l subcasos es aproximadamente m/b, para alguna constante b, en donde m es el tamao del caso (o subcaso) original (cada subproblema es aproximadamente del tamao 1/b del problema original).

PROGRAMACION DINAMICA
Para resolver un problema se tiende a dividir este en subproblemas ms pequeos y combinar las soluciones obtenidas para calcular la solucin del problema inicial. Puede ocurrir que la divisin natural del problema conduzca a un gran nmero de subejemplares identicos. Si se resuelve cada uno de ellos sin tener en cuenta las posibles repeticiones , resulta un algoritmo eficiente, en cambio si se resuelve cada ejemplar distinto una sola vez y se conversa el resultado, el algoritmo obtenido es mucho mejor. Esta es la idea de la programacin dinmica: no calcular dos veces lo mismo y utilizar normalmente una tabla de resultados que se va rellenando a medida que se resuelven los subejemplares.

Esta es la idea de la programacin dinmica: no calcular dos veces lo mismo y utilizar normalmente una tabla de resultados que se va rellenando a medida que se resuelven los subejemplares.
Considere el clculo de nmeros combinatorios. El algoritmo es: Funcin C(n,k) si k=0 k=n entonces devolver 1 si no devolver C(n-1,k-1) + C(n-1,k) Ocurre que muchos valores C(i,j) con i<n y j<K se calculan y recalculan varias veces Similar con el algoritmo de Fibonacci La programacin dinmica se emplea a menudo para resolver problemas de optimizacin que satisfacen el principio de optimalidad: en una secuencia ptima de decisiones toda subsecuencia ha de ser tambin ptima.

EJEMPLO
Si el camino ms corto de Santiago a Copiap pasa por La Serena, la parte del camino de Santiago a La Serena ha de ser necesariamente el camino mnimo entre estas dos ciudades. Se puede aplicar est tcnica en:
Camino mnimo en un grafo orientado Arboles de bsqueda ptimos

ALGORITMOS AVIDOS
Los algoritmos vidos o voraces (Greedy Algorithms) son algoritmos que toman decisiones de corto alcance, basadas en informacin inmediatamente disponible, sin importar consecuencias futuras. Suelen ser bastante simples y se emplean sobre todo para resolver problemas de optimizacin, como por ejemplo, encontrar la secuencia ptima para procesar un conjunto de tareas por un computador, hallar el camino mnimo de un grafo, etc.

ELEMENTOS QUE INTERVIENEN Un conjunto o lista de candidatos (tareas a procesar, vrtices del grafo, etc.) Un conjunto de decisiones ya tomadas (candidatos ya escogidos) Una funcin que determina si un conjunto de candidatos es una solucin al problema (aunque no tiene por qu ser la ptima)

Una funcin que determina si un conjunto es completable, es decir, si aadiendo a este conjunto nuevos candidatos es posible alcanzar una solucin al problema, suponiendo que esta exista; Una funcin de seleccin que escoge el candidato an no seleccionado que es ms prometedor; una funcin objetivo que da el valor/coste de una solucin (tiempo total del proceso, la longitud del camino, etc.) y que es la que se pretende maximizar o minimizar

Para procesar el problema de optimizacin hay que encontrar un conjunto de candidatos que optimiza la funcin objetivo, estos algoritmos voraces proceden por pasos:
Inicialmente el conjunto de candidatos est vaco En cada paso se intenta aadir al conjunto el mejor candidato de los an no escogidos, utilizando la funcin seleccin Si el conjunto resultante no es completable, se rechaza el candidato y no se vuelve a considerar en el futuro En caso contrario se incorpora al conjunto de candidatos escogidos y permanece siempre en l Tras cada incorporacin se comprueba si el conjunto resultante es una solucin as del problema

Un algoritmo Voraz es correcto si la solucin as encontrada es siempre ptima

EL ESQUEMA GENERICO DEL ALGORITMO VORAZ ES: Funcion voraz(C:conjunto):conjunto { C es el conjunto de todos los candidatos } S <= vaco { S es el conjunto en el que se construye la solucin mientras solucin(S) y C <> vaco hacer x el elemento de C que maximiza seleccionar(x) C C \ {x} si completable(S U {x}) entonces S S U {x} si solucin(S) entonces devolver S si no devolver no hay solucin
El nombre voraz proviene de que, en cada paso, el algoritmo escoge el mejor "pedazo" que es capaz de "comer" sin preocuparse del futuro. Nunca deshace una decisin ya tomada: una vez incorporado un candidato a la solucin permanece ah hasta el final; y cada vez que un candidato es rechazado, lo es para siempre.

EJEMPLO: MINIMO NUMERO DE MONEDAS


Se desea pagar una cantidad de dinero a un cliente empleando el menor nmero posible de monedas. Los elementos del esquema anterior se convierten en: candidato: conjunto finito de monedas de, por ejemplo, 1, 5, 10 y 25 unidades, con una moneda de cada tipo por lo menos; solucin: conjunto de monedas cuya suma es la cantidad a pagar; completable: la suma de las monedas escogidas en un momento dado no supera la cantidad a pagar; funcin de seleccin: la moneda de mayor valor en el conjunto de candidatos an no considerados; funcin objetivo: nmero de monedas utilizadas en la solucin.

METODO DE RETROCESO(BACKTRACKING)
El Backtracking o vuelta atrs es una tcnica de resolucin general de problemas mediante una bsqueda sistemtica de soluciones. El procedimiento general se basa en la descomposicin del proceso de bsqueda en tareas parciales de tanteo de soluciones (trial and error). Las tareas parciales se plantean de forma recursiva al construir gradualmente las soluciones. Para resolver cada tarea, se descompone en varias subtareas y se comprueba si alguna de ellas conduce a la solucin del problema. Las subtareas se prueban una a una, y si una subtarea no conduce a la solucin se prueba con la siguiente.

La descripcin natural del proceso se representa por un rbol de bsqueda en el que se muestra como cada tarea se ramifica en subtareas. El rbol de bsqueda suele crecer rpidamente por lo que se buscan herramientas eficientes para descartar algunas ramas de bsqueda producindose la poda del rbol. Diversas estrategias heursticas, frecuentemente dependientes del problema, establecen las reglas para decidir en que orden se tratan las tareas mediante las que se realiza la ramificacin del rbol de bsqueda, y qu funciones se utilizan para provocar la poda del rbol. El mtodo de backtracking se ajusta a muchos famosos problemas de la inteligencia artificial que admiten extensiones muy sencillas. Algunos de estos problemas son el de las Torres de Hanoi, el del salto del caballo o el de la colocacin de las ocho reinas en el tablero de ajedrez.

CASO IMPORTANTE EN OPTIMIZACION COMBINATORIA ES EL PROBLEMA DE SELECCIN OPTIMA Se trata del problema de seleccionar una solucin para sus componentes, de forma que respetando una serie de restricciones de lugar a la solucin que optimiza una funcin objetivo que se evala al construirla. El rbol de bsqueda permite recorrer todas las soluciones para quedarse con la mejor de entre las que sean factibles. El problema tpico es el conocido como problema de la mochila. Se dispone de una mochila en la que se soporta un peso mximo P en la que se desean introducir objetos que le den el mximo valor. Se dispone de una coleccin de n objetos de los que se conoce su peso y su valor: (pi,vi); i = 1, 2, ..., n.

METODO DE BRANCH AND BOUND


Branch and bound (o tambin conocido como Ramifica y Poda) es una tcnica muy similar a la de Backtracking, pues basa su diseo en el anlisis del rbol de bsqueda de soluciones a un problema. Sin embargo, no utiliza la bsqueda en profundidad (depth first), y solamente se aplica en problemas de Optimizacin. Los algoritmos generados por est tcnica son normalmente de orden exponencial o peor en su peor caso, pero su aplicacin ante instancias muy grandes, ha demostrado ser eficiente (incluso ms que bactracking). Se debe decidir de qu manera se conforma el rbol de bsqueda de soluciones. Sobre el rbol, se aplicar una bsqueda en anchura (breadthfirst), pero considerando prioridades en los nodos que se visitan (bestfirst). El criterio de seleccin de nodos, se basa en un valor ptimo posible (bound), con el que se toman decisiones para hacer las podas en el rbol.

MODO DE PROCEDER DE LOS ALGORITMOS BRANCH AND BOUND:

Nodo vivo: nodo con posibilidad de ser ramificado, es decir, no se ha realizado una poda. No se pueden comenzar las podas hasta que no se haya descendido a una hoja del rbol Se aplicar la poda a los nodos con una cota peor al valor de una solucin dada a los nodos podados a los que se les ha aplicado una poda se les conoce como nodos muertos Se ramificar hasta que no queden nodos vivos por expandir Los nodos vivos han de estar almacenados en algn sitio lista de nodos, de modo que sepamos qu nodo expandir

ALGORITMO GENERAL

Funcin ramipoda(P:problema): solucin L={P} (lista de nodos vivos) S= (segn se aplique mximo o mnimo) Mientras L 0 n=nodo de mejor cota en L si solucion(n) si (valor(n) mejor que s) s=valor(n) para todo m L y Cota(m) peor que S borrar nodo m de L sino aadir a L los hijos de n con sus cotas borrar n de L (tanto si es solucin como si ha ramificado) Fin_mientras Devolver S

You might also like