P. 1
1.1.1. Conceptos básicos Algoritmos y aproximaciones

1.1.1. Conceptos básicos Algoritmos y aproximaciones

|Views: 189|Likes:

More info:

Published by: Karina Mumentey Regalado on Feb 16, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOCX, PDF, TXT or read online from Scribd
See more
See less

01/07/2016

pdf

text

original

Conceptos básicos: Algoritmos y aproximaciones

En el siguiente trabajo pretendemos presentar una serie de concepto y definiciones propios del estudio de los Algoritmos, su análisis y diseño. En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes, análisis y diseño. También veremos los diferentes tipos de formas y tamaños o medidas en que se pueden almacenar y representar los datos y estructuras en un algoritmo o programa. En ese mismo orden encontraremos las diferentes técnicas para diseñarlos como son el método de la fuerza bruta, el voraz, divide y vencerás, programación dinámica, de vuelta atrás, entre otros. De igual forma podremos ver las definiciones y algunas características, reglas, normas, tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones. Finalmente veremos los que es la verificación y derivación de programas, donde daremos los conceptos básicos de semántica y sus tipos haciendo mayor énfasis en la semántica axiomática, la recursividad e iteración, los diseños de estos últimos, así como los típicos ciclos utilizados en algoritmos y programas y los paso a tener en cuenta al momento de desarrollar un algoritmo iterativo o recursivo. Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos Computacionales, que desde su aparición hasta nuestros días es, y seguirá siendo; vital para el desarrollo de aplicaciones para computadoras y el manejo y dominio de la lógica de programación para resolver problemas. Como estudiantes de la Facultad de Ciencias y Tecnología " Escuela de Informática y Computación " de la Universidad Dominicana Organización y Métodos O&M con aspiraciones de iniciarnos como Ingeniero en Sistemas y Computación. Con el objetivo inmediato de aprobar con los mejores meritos la asignatura de Algoritmos Computacionales. General: Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los Algoritmos Computacionales. Específicos : Introducir los conceptos propios sobre Algoritmo, su importancia en el mundo de las aplicaciones para computadoras y el manejo de lógica de programación.
y y y y y y

Proporcionar una idea de su uso. Visualizar sus ventajas e importancia. Definir sus tipos y variantes. Proporcionar conceptos sobre su análisis y diseño. Proporcionar concepto sobre las técnicas de diseño. Desglosar sus variantes (ordenación, búsqueda, etc. ).

Marco Historico. Un algoritmo es un conjunto de operaciones y procedimientos que deben seguirse para resolver un problema. La palabra algoritmo se deriva del nombre latinizado del gran Matemático Árabe Mohamed Ibn Al Kow Rizmi, el cual escribió sobre los años 800 y 825 su obra Quitad Al Mugabala, donde se recogía el sistema de numeración hindú y el concepto del cero. Fue Fibinacci, el que tradujo la obra al latín y el inicio con la palabra: Algoritmi Dicit. El lenguaje algorítmico es aquel por medio al cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. El conjunto de todas las operaciones a realizar y e orden en que se deben efectuarse, se le denomina algoritmo.

Es un método para resolver un problema mediante una serie de datos precisos, definidos y finitos. Generalidades El programador de computadoras es ante que nada una personaque resuelve problemas, por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemático. A la metodología necesaria para resolver problemas mediante programas se denomina Metodología de la Programación. El eje central de esta metodología es el concepto, ya tratado, de algoritmo. Un algoritmo es un método para resolver un problema. Aunque la popularización del término ha llegado con el advenimiento de la era informática, algoritmo proviene de Mohammed alKhowarizmi, matemático persa que vivió durante el siglo IX y alcanzo gran reputación por el enunciado de las reglas para sumar, restar, multiplicar y dividir números decimales; la traducciónal latín del apellido de la palabra algorismus derivo posteriormente en algoritmo. Euclides, el gran matemático griego (del siglo IV antes de Cristo) que invento un método para encontrar el máximo común divisor de dos números, se considera con Al-Khowarizmi el otro gran padre de la algoritmia ( ciencia que trata de los algoritmos). El profesor Niklaus Wirth, inventor de Pascal, Modula-2 y Oberon, titulo uno de sus mas famosos libros, Algoritmos + Estructuras de Datos = Programas, significándonos que solo se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta estructura de datos. Esta ecuación será de una de las hipótesis fundamentales consideradas en esta obra. La resolución de un problema exige el diseño de un algoritmo que resuelva el problema propuesto. Los pasos para la resolución de un problema son: 1. Diseño de algoritmo, que describe la secuencia ordenada de pasos que conducen a la solución de un problema dado. (Análisis del problema y desarrollo del algoritmo). 2. Expresar el algoritmo como un programa de lenguaje de programación adecuado. (Fase de codificación.) 3. Ejecución y validación del programa por la computadora. Para llegar a la realización de un programa es necesario el diseño previo de algoritmo, de modo que sin algoritmo no puede existir un programa. Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como de la computadoraque lo ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta; sin embargo, el algoritmo será siempre el mismo. Así, por ejemplo, en una analogía con la vida diaria, una receta de un plato de cocina se puede expresar en español, ingles o francés, pero cualquiera que sea el lenguaje, los pasos para la elaboración del plato se realizaran sin importar el idioma del cocinero. En la cienciade la computación y en la programación, los algoritmos son más importantes que los lenguajes de programación o las computadoras. Un lenguaje de programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. Tanto el lenguaje de programación como la computadora son los mediospara obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso correspondiente. Dada la importancia del algoritmo en la ciencia de la computación, un aspecto muy importante será el diseño de algoritmos. El diseño de la mayoría de los algoritmos requiere creatividady

conocimientos profundos de la técnica de la programación. En esencia, la solución de un problema se puede expresar mediante un algoritmo. Características de los Algoritmos: Las características fundamentales que debe cumplir todo algoritmo son:
y y y

Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. Un algoritmo debe ser finito. Si se sigue un algoritmo se debe terminar en algún momento; o sea, debe tener un numero finito de pasos.

La definición de un algoritmo debe definir tres partes: Entrada, Proceso y Salida. En el algoritmo de receta de cocina citado anteriormente se tendrá: Entrada: ingrediente y utensilios empleados. Proceso: elaboración de la receta en la cocina. Salida: terminación del plato (por ejemplo, cordero). Ejemplo de Algoritmo: Un cliente ejecuta un pedido a una fábrica. Esta examina en su banco de datos la ficha del cliente; si el cliente es solvente entonces la empresa acepta el pedido; en caso contrario rechazara el pedido. Redactar el algoritmo correspondiente. Los pasos del algoritmo son: 1. 2. 3. 4. 5. inicio leer el pedido examinar la ficha del cliente si el cliente es solvente aceptar pedido; en caso contrario, rechazar pedido fin

Diseño del Algoritmo: En la etapa de análisis del proceso de programación se determina que hace el programa. En la etapa de diseño se determina como hace el programa la tarea solicitada. Los métodos mas eficaces para el proceso de diseño se basan en el conocido por Divide y Vencerás, es decir, la resolución de un problema complejo se realiza dividiendo el problema en sub problemas y a continuación dividir estos sub problemas en otros de nivel mas bajo, hasta que pueda ser implementada una solución en la computadora. Este método se conoce técnicamente como diseño descendente (Top Down) o modular. El proceso de romper el problema en cada etapa y expresar cada paso en forma más detallada se denomina refinamiento sucesivo. Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo punto de entrada y un solo punto de salida. Cualquier programa bien diseñado consta de un programa principal (el modulo de nivel mas alto) que llama a sub programas (módulos de nivel mas bajo) que a su vez pueden llamar a otros sub programas. Los programas estructurados de esta forma se dice que tienen un diseño modular y el método de romper el programa en módulos más pequeño se llama Programación Modular. Los módulos pueden ser planeados, codificados, comprobados y depurados independientemente (incluso por diferentes programadores) y a continuación combinarlos entre si. El proceso implica la ejecución de los siguientes pasos hasta que el programa se termina:

y y y y

programar modulo. Comprobar el modulo. Si es necesario, depurar el modulo. Combinar el modulo con los módulos anteriores.

El proceso que convierte los resultados del análisis del problema en un diseño modular con refinamiento sucesivo que permitan una posterior traducción al lenguaje se denomina diseño de algoritmo. El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente. 4. Análisis De Algoritmos Recursos De Computadores Y Complejidad Algoritmo: Conjunto de reglas para resolver un problema. Su ejecución requiere unos recursos. Un algoritmo es mejor cuantos menos recursos consuma, su facilidad de programarlo, corto, fácil de entender, robusto, etc. Criterio empresarial: Maximizar la eficiencia. Eficiencia: Relación entre los recursos consumidos y los productos conseguidos. Recursos consumidos: Tiempo de ejecución. Memoria principal: Entradas/salidas a disco. Comunicaciones, procesadores, etc. Lo que se consigue: Resolver un problema de forma exacta, forma aproximada o algunos casos. Recursos consumidos: Ejemplo. ¿Cuántos recursos de tiempo y memoria consume el siguiente algoritmo sencillo? i:= 0 a[n+1]:= x repetir i:= i + 1 hasta a[i] = x Respuesta: Depende. ¿De qué depende? De lo que valga n y x, de lo que haya en a, de los tipos de datos, de la máquina... En general los recursos dependen de: Factores externos. El ordenador donde lo ejecutemos: 286, Pentium III, Cray,... El lenguaje de programación y el compilador usado. La implementación que haga el programador del algoritmo. En particular, de las estructuras de datos utilizadas. Tamaño de los datos de entrada. Ejemplo. Calcular la media de una matriz de NxM. Contenido de los datos de entrada. Mejor caso. El contenido favorece una rápida ejecución. Peor caso. La ejecución más lenta posible. Caso promedio. Media de todos los posibles contenidos.

T(N) = bN + c...Los factores externos no aportan información sobre el algoritmo.. Asignación de tiempos. Q (T): Orden exacto de T. Notaciones asintóticas: Indican como crece T. T(7)= 10 s N= 8. Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo respecto al tamaño de la entrada y a los posibles casos. ¿Existe una cota inferior y superior del número de ejecuciones? ¿Se puede convertir en un FOR? El análisis de algoritmos también puede ser a posteriori: implementar el algoritmo y contar lo que tarda para distintas entradas. T(N) = N+1.2 s N= 7. o una constante diferente. Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir. para valores suficientemente grandes (asintóticamente) sin considerar constantes. ¿Se puede predecir cuándo se cumplirán las condiciones? Llamadas a procedimientos: Calcular primero los procedimientos que no llaman a otros. T(5)= 5 ms N= 6. ¿Tardarán todas lo mismo? Ejecuciones del bucle principal.. luego se diferencia en una constante con los anteriores. Medidas Asintoticas Notación asintótica: El tiempo de ejecución T(n) está dado en base a unas constantes que dependen de factores externos. Podemos comparar con otros algoritmos. con los límites del FOR. Podemos hacer previsiones. con los segundos que tardan las operaciones básicas correspondientes. externos no aportan información sobre el algoritmo. Algunas reglas básicas. T(6)= 0. O(T): Orden de complejidad de T... Programa "cifras. pero ¿qué significa T(N)? Tiempo de ejecución en segundos. ¿Cuánto tiempo.1 ms N= 5. u omega de T. Ejemplo. Operaciones básicas (+.5 min ¿Qué conclusiones podemos extraer? Análisis a priori: Evitamos la implementación. Nos interesa un análisis que sea independiente de esos factores. Suponiendo que b y c son constantes. cuántas instrucciones. Bucles FOR: Se pueden expresar como una sumatoria. Orden de complejidad de f(n): O(f) . Normalmente usaremos la notación T(N)=. Mejor caso y peor caso según la condición. Instrucciones ejecutadas por el algoritmo.): Una unidad de tiempo. :=. para el conteo de instrucciones. de forma aproximada (y parametrizada)... W (T): Orden inferior de T. Operaciones de entrada salida: Otra unidad de tiempo. *. IF y CASE: Estudiar lo que puede ocurrir.. T(4)= 0. T(8)= 3.exe": N= 4. si el algoritmo es poco eficiente.? Sabemos que cada ejecución lleva un tiempo constante. -. o alguna constante. T(N) = 2N + 4.

f: Nm ® R+ (f: Nx. nm) suficientemente grandes. .xN ® R+) Ej. llamamos orden de f al conjunto de todas las funciones de Nm en R+ acotadas superiormente por un múltiplo real positivo de f. para valores de (n1. ¿Qué relación hay entre O(log2 n) y O(log10 n)? P6... Ej.n. Dadas f y g de N en R+. no sólo tiempos de ejec.. Si f Î O(g) entonces O(f) Í O(g). Dadas f y g. La definición es aplicable a cualquier función de N en R. "Valores de n sufic. W (g) Í W (f) g(n) P5. $ n0 Î N. M(B.. W (f)=W (g)..... n2.": no nos importa lo que pase para valores pequeños. nm): O(f) Dada una función f: Nm ® R+. Dadas f y g de N en R+. k) = kB+l+n+2kn Orden de complejidad de f(n1. llamamos orden de f al conjunto de todas las funciones de N en R+ acotadas superiormente por un múltiplo real positivo de f. W (f+g) = W (max(f+g)) ¿Y para los Q (f+g)? ¿Es cierto que O(f . Grandes. Propiedades P1. se cumple: i) O(f) = O(g) Û f Î O(g) y g Î O(f) ii) O(f) Í O(g) Û f Î O(g) ¿La relación de orden entre O(. "Funciones acotadas superiormente por un múltiplo de f. O(f)= { t: N ® R+ / $ c Î R+... g)). .) es completa? Dadas f y g.Dada una función f: N ® R+.. Dadas f y g de N en R+. Memoria en una tabla hash. -g))? P5. O(f)=O(g) Û Q (f)=Q (g) Û f Î Q (g) Û W (f)=W (g) P7. n Î O(n2) Þ 2n+1 Î O(n2) P2. el tiempo y la memoria consumidos pueden depender de muchos parámetros. de N en R+.. ..": nos quitamos las constantes. ¿se cumple O(f)Í O(g) ó O(g)Í O(f)? P4. ¿Cómo es la relación para los W ? P3.. no una función. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f)=O(g). Si f Î O(g) y g Î O(h) entonces f Î O(h).m. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f) = O(g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Ì O(g) g(n) iii) limn¥ ® f(n) = +¥ Þ O(f) É O(g) g(n) Notación con varios parámetros: En general. O(f+g) = O(max(f. para valores de n suficientemente grandes. Dadas f y g de N en R+. Si f Î W (g) y g Î W (h) entonces f Î W (h) Ej. l. " n ³ n0: t(n) £ c·f(n) } Nota: O(f) es un conjunto de funciones. Q (f)=Q (g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Í O(g). 2n+1 Î O(n).g) = O(max(f.

.. podemos extender los conceptos de W (f) y Q (f). Podemos suponerlos constantes T(N). si p es un polinomio de menor grado que q. para funciones con varios parámetros. o variables T(N. O(nm) O(n2). O(p) Ì O(q). Ejemplo.. Orden exacto de f(n): Q (f): Dada una función f: N ® R+. nm Î N.. " n ³ n0: P(n) Þ t(n) £ c·f(n) } De igual forma.. . Las propiedades se siguen cumpliendo ® Demostrarlo. Relación de orden: igual que antes.. Ejemplo. Orden inferior u omega de f(n): W (f): Dada una función f: N ® R+. Algoritmo de búsqueda binaria: Si N es potencia de 2 el estudio se simplifica. k2.) = Relación de inclusión entre conjuntos. llamamos orden de f según P (o condicionado a P) al conjunto: O(f | P)= { t: N ® R+ / $ c Î R+. k2 ³ n2 . " n ³ n0: t(n) ³ c·f(n) } La notación omega se usa para establecer cotas inferiores del tiempo de ejecución. O(c) Ì O(n) O(cn + b) = O(dn + e) O(p) = O(q).O(f)= { t: Nm ® R+ / $ c Î R+. siendo c y d constantes positivas." km ³ nm : t(k1. t Î O(g) ‡Se cumple que: O(c) = O(d). ¿O(f) « O(f | P)? Ordenes De Complejidad Uso de los órdenes de complejidad: Dado un tiempo t(n). O(n+2m) Notaciones condicionales: En algunos casos interesa estudiar el tiempo sólo para ciertos tamaños de entrada. ‡Relación de orden entre O(. Para cualquier f y g. . t(n) Î O(n2).. b) = a·N + b El tiempo depende del tamaño del problema N. llamamos orden exacto de f al conjunto de todas las funciones de N en R+ que crecen igual que f. Orden condicionado de f(n): O(f | P) Dada una función f: N ® R+. n2.. " k1 ³ n1 .. tenemos W (f | P) y Q (f | P). y que más se aproxime asintóticamente.. $ n0 Î N. a. si p y q son polinomios del mismo grado.. ¿Qué relación hay entre los siguientes órdenes? O(n+m). O(f) = O(f | true). y del tiempo de inicialización b y de ejecución de un paso a. t(n) = 2n2/5 + 3p /2. para valores de n suficientemente grandes.a.. ±O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f). km) } De la misma forma.. $ n1. llamamos omega de f al conjunto de todas las funciones de N en R+ acotadas inferiormente por un múltiplo real positivo de f. $ n0 Î N. f Î O(g | false). encontrar la función f más simple tal que t Î O(f). Ejemplo. asintóticamente y salvo constantes. W (f)= { t: N ® R+ / $ c Î R+. T(N) = T(N. . km) £ c·f(k1.b). k2. y P: N ® B.

pero con un poco de análisis puede encontrarse algoritmos más eficientes. " n ³ n0: c·f(n) ³ t(n) ³ d·f(n) } Notación o pequeña de f(n): o(f): Dada una función f: N ® R+. å im Î O(nm+1) i=1 i=1 i=1 Si hacemos una operación para n. a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema... . otros son bastante complejos.. una tarea difícil. Técnica de diseño de algoritmos Diseño de Algoritmos: Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación . Muchos problemas pueden resolverse buscando una solución fácil y directa pero. Los logaritmos son del mismo orden. Ejemplo.+a1x+a0 es O(xn). se decir. otra para n/2. No obstante.Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c. y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño desde cero.. a la vez bastante ineficiente.) Ì O(n2) Ì O(n3) Ì . Este método... idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene un papel fundamental.. $ n0 Î N. basado en la descomposición de un problema en .Es necesario en este momento mencionar algo sobre como hacerlo. Ì O(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+. La investigaciónen esta área ha permitido descubrir un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la realización de muchos algoritmos. Todo problema algorítmico es un reto para su diseñador. 5. +a1n + a0 t(n) Î o(amnm) ¹ o(nm) ¿o(amnm) Í O(amnm)? ¿o(t) Í O(t)? Costa de complejidad con frecuencia Algunas relaciones entre órdenes frecuentes: O(1) Ì O(log n) Ì O(n) Ì O(n·log n) Ì O(n·(log n)2) Ì O(n1. El esquema mas sencillo quizás sea el llamado divide y vencerás. puede ser muy directo. llamado de fuerza bruta. d Î R+. independientemente de la base. n/4. nnn å 1 = n Î O(n).001.. aparecerá un orden logarítmico O(log2 n). en general. Una forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de algoritmos. t(n) = amnm + am-1nm-1 + . El diseño de un algoritmo que resuelva un problema es. llamamos o pequeña de f al conjunto de todas las funciones de N en R+ que crecen igual que f asintóticamente: o(f)= { t: N ® R+ / lim t(n)/f(n) = 1}n¥ ® Esta notación conserva las constantes multiplicativas para el término de mayor orden.. algunos resultan inmediatos de resolver... El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo automatizada. å i = n(n+1)/2 Î O(n2).

podríamos utilizar un algoritmo general llamado algoritmo del museo británico. Nos estamos refiriendo a métodos basados en la mejora de la eficiencia (por ejemplo. Por ultimo. solo puede tomarse tras considerar varias solucionesde otras etapas mas simples. es organizar el diseño sobre un esquema de algoritmo o una técnica de diseño que haya demostrado su utilidad para otros problemas. Por ejemplos: Algunos algoritmos de búsqueda de un elemento en un vector. se produzca cierto resultado. dados uno datos de entrada valido. y a métodos basados en transformaciones del dominio para encontrar una solución mas fácilmente a un problema en un dominio transformado. Método de fuerza bruta Comenzamos el estudio de esquemas algorítmicos con un método sencillo. En principio. El conocimiento de técnicas de diseño es solo un primer paso para el diseñador. pero que debe evitarse siempre que se pueda. Otro algoritmo realizaba un búsqueda dicotomica o binaria. la fuerza bruta. si no mas bien calificativo Para una forma de diseñar algoritmos: tomar una solución directa. con complejidad . con la experiencia. El mas entendido. esto no es malo. su uso adecuado mediante el esquema de búsqueda con retroceso (o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. si la decisión en una etapa. Otros esquemas requieren un análisis minucioso del problema de forma que la solución se vaya construyendo en etapas. que debe completarse con otros conocimientos y. puesto que existe un número reducido de esquema y técnicas de diseño. En realidad. el uso de parámetros de acumulación al resolver problemas utilizando divide y vencerás. tenemos una solución voraz. la solución es dinámica. hay problemas cuya solución no puede hallarse sino mediante un proceso de búsqueda. Aprender los principiosbásicos del diseño de algoritmos podemos preguntarnos por un método aceptable. Aun así. dad su ineficacia. completa y consistente del problema a resolver y queremos obtener un algoritmo en el que. Supongamos que disponemos de una especificación precisa. pero dado que no se ha analizado apenas el problema. es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solución sea terriblemente ineficiente. y quizás el mejor.subproblemas. Consideraciones generales Si el hábil programador dispone de un recetario de algoritmos de donde poder seleccionar el más adecuado para cada problema. a pesar de lo complejas que son las operaciones de búsqueda. y el empleode tablas como estructura auxiliar para la resolución eficiente de problemas donde se aplica programación dinámica). siendo dicha solución finalmente adaptada al dominio original. su tarea se simplifica. Si puede preverse que decisión conviene en cada etapa para producir cierto tipo de mejor resultado. sobre todo. poco reflexionada. Uno de ellos realizaba una búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con cualquier vector. conviene conocer otros métodos de diseño de algoritmos que también resultan de utilidad práctica. Si no nos importa la eficiencia del algoritmo. Una solución por fuerza bruta también puede resultar adecuada como primera aproximación a la solución final. Este método de trabajo es practicable. porque su desarrollo puede permitir profundizar más sobre el problema y conocer propiedades que sean utilizadas para obtener otra versión más eficiente. Se programa un computador de manera que parta de un conjunto de axioma matemáticos y los que use para reducir aleatoriamente teoremas validos. no es un esquema algorítmico.

pero poco reflexionada. una solución funcional a muchos problemas. El algoritmo primero responde a un razonamiento más sencillo. la modificación para incorporar probabilidades diferentes es evidente y no complica el problema. y solo se podía usar cuando el vector estuviese ordenado. Ejemplo: Números de Fibonacci Los números de fibonacci suele especificarse como: Fib(0)=1 Fib(1)1 Fib(n+2)=fib(n)+fib(n+1) Esta especificación de los números de fibonacci tienen una formulación recursiva inmediata en estilo funcional. pero no todos: hay algunos fácilmente formulables. Parámetros Acumuladores Veamos primero una solución ineficiente que intentaremos mejorar. A. siendo ( n ) mayor que( 0 ). donde puede consultarse otras veces que se necesite. La intención es que la primera vez que se realiza un cálculo. pero debe mejorar su rendimiento para que sea práctico. no importa que). se supone que ambos participantes tienen cualidades y preparación similar . aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria. en caso positivo. De todas formas. Lo más razonable es comprobar si el vector esta ordenado y. pero muy ineficientes. Otra técnica útil es el uso de tablas. en combinación con otras contrucciones. Por sencillez . se almacena en una tabla. Los parámetros adicionales tienen como misión ir acumulando resultados principales durante el proceso recursivo. Muchos algoritmos recursivos resultan eficientes. Técnicas de los Parámetros Acumuladores y de Tabulacion La recurcion es un mecanismo que permite obtener. De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. La función principal simplemente realiza una llamada a esta función auxiliar en los que los parámetros de aquellas se modifican y los parámetros nuevos toman un valor inicial adecuado . cuya idea básica se expone a continuación. Veremos dos parámetros para la mejora de eficiencia de algoritmos recursivos: el uso de parámetros acumuladores y el uso de tablas. Tabulacion No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los parámetros acumuladores. resolver independientemente los . Esta es la solución de fuerza bruta: una solución directa. La función principal usa una función auxiliar que tiene los parámetros de aquellas más algunos adicionales. Hay dos participantes (deportistas o equipos. En estos casos.B.logarítmica. Ejemplo: Sea el problema de la competición. que juegan una competición que es ganada por el primero que venza en n partidos. dichos algoritmos pueden servir como una primera aproximación al algoritmo definitivo. Esta técnica también se suele emplear con la programación dinámica. por lo que uno puede sentirse tentado a usar siempre. Divide y vencerás: Consiste en descomponer un problema en un subproblema. Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores. Cada una se ilustra con un ejemplo distinto.

la moneda de mayor valor ( es decir. la ordenación de vectores. y así sucesivamente. Búsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de una palabra en un diccionariode acuerdo con el siguiente criterio. se buscara en la segunda mitad. se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. continua aplicándose el mismo criterio para la segunda moneda mas valiosa. cierta medida. como el conocido de la mochila. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. Ejemplo. También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y entender para otras personas. en la búsqueda de caminos mínimos sobre grafos. se va procedimiento paso a paso realizándose la mejor elección (usando una función objetivo que respeta un conjunto de restricciones ) de entre las posibles. el algoritmo debe funcionar. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión. la búsqueda en estructuras ordenadas. Se abre el diccionario por la pagina centrar(quedando dividido en dos mitades) y se comprueba si la palabra aparece allí o si es léxico gráficamente anterior o posterior. Consideraciones y Criterios para Diseñar Algoritmos Algunas consideraciones estilísticas pueden contribuir a mejor la calidadde los algoritmos (y programas ) mediante la reducción del numero de errores que aparecen al desarrollar los. palabras claves. Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal. Dar un cambioutilizando el menor número de monedas Considérese ahora el problema de la devolución del cambio al realizar una compra (por ejemplo.. etc. subprogramas. en una maquina expendedora de tabaco). Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fácilmente en caso de necesidad. El proceso finaliza cuando se ha devuelto todo el cambio. Pude aparecer obvio. Puede emplearse en problemas de optimización.etc. estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan.. y la normas sobre como y donde deben de introducirse los comentarios. 1. los factores que identifican la calidad en ellos .etc. las siguientes respuestas reflejan. mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). pero resulta difícil de asegurar en algoritmos complejos. Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas . la planificación en el orden de la ejecución de unos programas en un computador.subproblemas para luego combinar sus soluciones y obtener la solución del problema original. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad. Generalmente. 2. Ejemplo. La estrategia voraz aplicada comienza devolviendo. cuando se pueda. Estilo y calidad de los programas van fuertemente unidos. la tipografía seguida ala hora de escribir nombres de variables. si es posterior. Ante la pregunta ¿Cuáles son las característica de un buen algoritmo?.Para ello. . El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione. Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. Corrección.

la dificultad principal al diseñar un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de selección que garantice la optimalidad de la solución.3. estos problemas no se intentan resolver "de golpe ". Un algoritmo voraz sigue el esquema anterior. analizando durante cada etapa que elemento conviene añadir a la solución parcial ya existente. la primera solución encontrada es óptima. el candidato se incorpora definitivamente. la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. por tanto. Se supone que un problema de esta clasetiene al menos una solución. Si este conjunto ampliado sigue siendo válido. La documentación ayuda a comprender el funcionamiento de los algoritmos. puede llamarse candidato al elemento tratado en cada paso. En particular. Algoritmos voraces Esquema voraz Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que satisfaga ciertas restricciones y que optimice alguna medida. Resumiendo. Según esta descripción. En cada paso se intenta añadir el mejor de los candidatos restantes a dicha solución parcial. Claridad. Inicialmente. Al contrario. el problema incluye restricciones adicionales que limitan el número posible de soluciones. se habla de la memoria y del tiempo de ejecución . Por tanto. La única complicación es comprobar que se siguen satisfaciendo las restricciones del problema. dados unos ficheros almacenados en una cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio. si dicho conjunto no es válido. encontrando de una sola vez la solución completa y óptima. Por ejemplo. se desecha el candidato. Otro ejemplo se da cuando. La dificultad principal para resolver esta clase de problemas estriba en el análisis necesario para poder formular un algoritmo que halle la solución en varios pasos. el problema parte de: y Una función objetivo que da el valor de una solución. claro. eficiente. el conjunto de candidatos que forman la solución está vacío. Puede haber varias soluciones optimas. ésta es la función por optimizar. Por lo que se ha descrito del esquema voraz. en cuyo caso no importa cual se elija. Es más frecuente que el subconjunto de la solución se vaya formando paso a paso. La eficiencia de un algoritmo se mide por los recursos que este consume. es decir. la solución voraz siempre resulte sencilla. A menudo. permite formar una solución del problema. y de acuerdo con los puntos de vista anteriores. Para facilitar la descripción de este proceso. pero con la fortuna de que cada vez que añade un elemento a la solución se tiene la certeza de haber realizado la mejor elección posible. 4. Normalmente. no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. fiable y fácil de mantener. lo ideal es que nuestro algoritmo resulte correcto. el algoritmo debe estar bien documentación. Esta característica hace que aunque el análisis del problema sea arduo. Eficiencia. A pesar de que con la reducción de los costes del hardware es posible diseñar computadores más rápidos y con más memoria. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están adecuadamente comentadas. el algoritmo no debe desaprovechar recursos. En realidad. Obviamente. Si el algoritmo voraz se ha diseñado correctamente. . si satisface las restricciones del problema y. sea el problema de encontrar un subconjunto de los arcos de un grafo. éste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema.

n). sino que se utiliza durante el análisis del problema y es determinante en la elección de la función de selección. Obsérvese que las funciones de validez y completitud no se preocupan de la optimalidad del la solución. La función objetivo no suele aparecer en el algoritmo final. ( ) ) Puede verse por qué estos algoritmos se llaman " voraces " : en cada paso toman el mejor trozo de la solución. Además. tales que sumados sus valores equivalgan al importe.. es decir.n ) : ( 1. Solución : (1. De todas formas. se parte de un conjunto de tipos de monedas válidas. la decisión. en este caso. Cada fila resultante puede tener una complejidad de o (n2). debe recordarse que puede haber varios criterios alternativos de selección y que de su correcta elección depende que la solución calculada por el algoritmo sea optima. es decir. Es fácil encontrar una solución si en cada etapa se genera el subcalendario correspondiente a un equipo.y Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solución final del problema. el lector puede intentar encontrar una solución voraz del problema del calendario. se considera el problema de un cambio o desglose en monedas. nunca cambian de opinión: una vez que un candidato es aceptado o rechazado en la solución. A su vez. es definitiva. . solución v (siguiente)) VorazAcumulador (candidatos ± (siguiente). Se trata de indicar la cantidad (menor) de monedas de los tipos considerados.. de las que se supone que hay cantidad suficiente para realizar el desglose. la tabla de competición se va completando por filas. Una función que determine si cierto conjunto de candidatos es válido.n) -> FUNCTION VorazAcumulador ( candidatos : (1. cada solución válida y completa es optima.n) : (1. y de un importe. Hay que desglosar una cantidad en un conjunto de monedas tratando de cumplir alguna condición. el mejor candidato..n) -> Cadidatos = ( ) v EsSolución ( solución)-> Value siguiente -> seleccionar ( candidatos ) IN EsVálida (solución v ( siguiente)) => VorazAcumulador (candidatos ± (solución). pero si la función de selección es la adecuada. Para ello.. utilizar el menor número de monedas. Como ejercicio. Además. Podemos representar el esquema voraz de la siguiente forma funcional: FUNCTION Voraz ( candidatos: ( 1.. Desglose en monedas Como primer ejemplo introductorio sencillo al que puede aplicarse la técnica voraz. Como fila primera se toma la secuencia de los índices de los participantes en cualquier orden. si permite formar alguna solución del problema. es decir. la solución consta de: y y y Un conjunto de candidatos Una función de selección que en cada momento determine que candidato de los aún no usados parece ser el mejor. solución) VorazAcumulador (candidatos. este algoritmo tiene la ventaja de valer para las situaciones en que el número de participantes no es una potencia de dos.

25. se declaran los tipos VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la cantidad de cada tipo de moneda que se devolverá en el desglose. Con esta información se puede comprobar que en este problema están presentes los distintos elementos de la técnica voraz. podemos utilizar sólo monedas de 500. suponemos que manejamos dineroespañol y. 1<k<=n. dado un problema al resolver planteando en términos de una entrada de tamaño n. mientras sea posible. Su declaración es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1. la técnica de divide y vencerás parte la entrada en k subproblemas. y cuyo valor total es igual al importe a desglosar. Esquema de Divide y vencerás. Estos valores se definen por medio de un tipo enumerado MONEDAS. La técnica de divide y vencerás es quizás una de las utilizadas debido a su sencillez: si un problema es demasiado grande para resolverlo de una vez. La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. en particular. Divide Y Vencerás La técnica divide y vencerás consiste en descomponer el problema en un conjunto de subproblemas más pequeños. éste no será nunca excluido de él. el proceso recursivo nunca terminaría. la moneda de mayor valor de entre las candidatas. Mas formalmente. de tipo resultado: TYPEVAR     .M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. El caso más frecuente es cuando el número de subproblemas es dos. Además.Para simplificar. Este esquema de partición de problemas se denomina esquema de divide y vencerás solo en el caso en que los problemas sean de la misma clase del problema original. considerado el problema como de tipo dato y la solución. Estos subproblemas se resuelven independientemente y después se combinan sus soluciones parciales para obtener la solución del problema original. Su formación funcional es como sigue. Esta restricción permite una formulación y resolución recursiva de los subproblemas. en caso contrario. Una solución viene dad por un conjunto de monedas devuelto tras el desglose. La condición de factibilidad de la solución siendo construida establece en el desglose debe ser menor o igual que el importe a desglosar. 5 y 1 pesetas para el desglose. 100. Después se resuelven estos subproblemas y se combinan las soluciones para obtener la solución para el problema original. Por supuesto. La función de selección establece que hay que elegir. Veamos el esquema de divide y vencerás para dos subproblemas. 50. Los elementos de la técnica voraz están presentes en este problema de la siguiente forma: y y y y y El conjunto de candidatos está constituido por cada una de las monedas de los diferentes tipos que se pueden usar para realizar el desglose del importe dado. es fácil su generalización a k subproblemas 2<k<=n. deben existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente. Valores -> Integer M500 M1 Cantidades -> Integer M500 . cuando un candidato (moneda) se incorpora al conjunto solución. Asimismo. se descompone en varias partes más fáciles de resolver.

para que esta técnica resulte eficiente todos los subproblemas deben ser de tamaño parecido. inferior. es general. Elaboración de un Calendario Deportivo: Sea un campeonato deportivo.. DivideYVenceras (subproblema2)) Se puede hacer una formulación imperativa similar.. subproblema2) => Combinar (DivideYVenceras (subproblema1) . TYPEVAR dato. en la que se utiliza un vector de tamaño N. Sin embargo. Partir y Combinar por funciones o procedimientos concretos. resultado PROCEDURE DivideYVenceras (IN problema : dato1.Dato.. N. Nótese que.N. superior. subsolucion2.si n es pequeño T(n) = 2 T(n/2) + f(n). Combinar (subsolucion1.N subsolucion1. para nuestros propósitos resulta indiferente el deporteobjeto de la competición. en caso contrario donde T(n) es la función de tiempo de DivideYVenceras para entradas de tamaño n. olución) ELSE Medio := Partir (inferior. OUT solución : resultado) -> PROCEDURE DyVAux (IN problema : dato1. IN inferior. y sin perdida de generalidad. 1. subsolucion2). subsolucion2 : resultado IF EsPequeño (inferior. así que hablaremos de participantes en vez de deportistas o equipos. DyVAux (problema. Por concreción. g(n) es el tiempo que tarda la función ResolverDirectamente en resolver problemas de pequeño tamaño (normalmente una constante) y f(n) es el tiempo necesario para partir el problema y combinar las subsoluciones. superior). medio+1. resultado FUNCTION DivideYVenceras (problema : dato) : resultado -> EsPequeño (problema) }=> ResolverDirectamente (problema) | VALUE subproblemas -> Partir (problema) IN subproblemas == (subproblema1.. DyVAux (problema. medio. inferior. Si el tamaño de los dos subproblemas es el mismo (o casi). puede suponerse que las competiciones se celebran en días sucesivos y . subsolucion1). superior. ResolverDirectamente.n. superior : 1. escribiremos una formulación más restrictiva pero bastante usual. El problema consiste en elaborar un calendario de competición de forma que cada participante compita exactamente una vez con cada uno de los demás participantes. La eficiencia final del algoritmo depende de la función f(n) concreta que aparezca durante el análisis. solución) DyVAux (problema.n. OUT solución : resultado) -> VAR medio: 1. solución) El esquema general se adapta a un problema concreto al sustituir los metasimbolos EsPequeño. el tiempo de cómputo de la función DivideYVecneras se describe con la siguiente relación de recurrencia: g(n). superior) THEN ResolverDirectamente (problema.

contiene el numero del participante contra el que el participante i-esimo compite el día j-esimo. el conjunto de permutaciones de los números {1. el conjunto P(i) de todas las permutaciones posibles del resto de los participantes con los que debe competir. Dado que el numero de participantes de n. Solo sirve como solución aquellas combinaciones de fila que cumplan las restricciones enunciadas en el párrafoanterior sobre las columnas de la tabla (las restricciones sobre las filas están garantizadas por el modo de generar los conjuntos P(i)). Se dispone de una solución inmediata aplicando fuerza bruta.. se elige uno cualquiera. Para simplificar el problema.n}-{i} ahora se completan las filas de la tabla de todas las formas posibles. Obsérvese que los números de participantes incluidos en la fila i de la tabla son distintos porque el participante i-esimo solo debe competir una vez con cada participante restante. Se necesitan elaborar n-1 competiciones por participantes. El elemento (i. pero es terriblemente ineficiente. días 1 participantes 1 2 2 1 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 8 5 6 7 3 4 1 2 7 8 5 6 4 3 2 1 6 7 8 5 5 6 7 8 1 2 3 4 6 5 8 7 4 1 2 3 7 8 5 6 3 4 1 2 . A su vez. es decir. la solución del problema puede representarse en una tabla de dimensión nx(n-1). Cada conjunto P(i) consta de (n-1)! Elementos. resultan nx(n-1)!=n! formas de rellenar la tabla. Si hay varios calendarios validos. incluyendo en cada fila i algún ejemplo de P(i). Primero se obtiene para cada participante i.j)±esimo de la tabla. se supone que el numero de participantes es una potencia de dos. Se supone también que cada participante tiene asignado un número comprendido entre 1 y N. La siguiente figura describe visualmente parte de la elaboración de la tabla. Sin embargo la aplicación de la técnica de divide y vencerás produce una solución mas sencillas aun pero muy eficientes. 1<= i<=n. la columna j también contiene números distintos. hay n = 2k participantes para algún entero positivo k. 1<=j<n. Por tanto.que cada participante compite una vez por día. es decir. 1<=i<=n. porque el día j-esimo cada participante solo puede competir con otro participante. El método de fuerza bruta resulta sencillo.

tabla). para k>1.8 7 6 5 2 3 4 1 Se distinguen dos casos. La idea consiste en añadir inicialmente a la tabla una columna "ficticia" de índice j=0. rotando dicha secuencia a la derecha. medio+1.. la mitad izquierda de la tabla. Sin embargo. sup-1.2n . El subcalendario del primer participante es sencillo porque basta con que compita en días sucesivos con los participantes de numeración. de numeración comprendida entre 1 y 2k-1 y otro para los participantes comprendidos entre 2k-1 +1 y 2k .N. sucesivamente con los participantes 2k-1 +1. Finalmente se completa la mitad derecha de la tabla (correspondiente al cruce de los dos ¡ . tabla). El problema puede reducirse a dos sub problemas de tamaño 2k-1 si se elaboran independientemente dos subcalendarios de tamaño 2k x(2k-1 -1): uno para los participantes..N) 1.N-1) -> PROCEDURE FormaTabla (IN inf : 1. Después se genera. El calendario de los participantes de numeración superior se completa de forma similar con los números de los participantes de numeración inferior..1 : = sup. cuando hay más de dos participantes. que es mucho mas eficiente que la solución de fuerza bruta. también de orden de complejidad cuadrática.1.sup-1. tablasup. Por fortuna.N. Completemos primero la parte de los participantes de numeración inferior. El caso recursivo. la unión de estos subcalendarios no forma un calendario completo para el campeonato de 2k participantes. es más complejo.. Este proceso se repite para el resto de los participantes de numeración inferior. IN sup :1.. El siguiente participante toma esta secuencia y realiza una fácil permutación de la misma que le garantiza el respeto de las restricciones de la solución. faltan por elaborar las competiciones cruzadas entre los participantes de numeración inferior y los de numeración superior. sup.N-1) -> VAR medio : 1.. inf.1 := inf ELSE medio := (inf + sup) Div 2. donde se aplica divide y vencerás para resolver el problema y que se aprovecha de la simetría de la solución. superior en orden creciente de numeración.N IF inf = sup-1 THEN tablainf. El algoritmo descrito se expresa a continuación. mediante divide y vencerás. El caso básico se da cuando solo hay dos participantes. medio. ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1). PROCEDURE Calendario ( INOUT tabla : (1. Veamos otra estrategia. CompletarTabla (medio+1...N)1. medio.. CompletarTabla (inf. que almacena los índices de las filas. sup. . medio. La solución es directa porque se celebra una sola competición entre ambos.1. Si el numero de participantes es 2k .. FormarTabla (inf. medio. tabla). por ejemplo. FormarTabla (medio+1.N. tabla) Este sistema de ecuacionesdefina una función de tiempo del orden de O(n2). el resto del calendario se puede construir fácilmente. es decir. En efecto. puede decirse que el "tamaño" del problema es 2k (sabemos que el calendario tendrá un tamaño de 2k x(2k-1 -1) posiciones). faltando 2k x2k-1 celdas para completar el calendario total.N. OUT tabla : (1.

sup) OrdenarAux (v.. Para el caso general.m y vm+1.. i1 :=i1 + 1 ELSE vectorAuxj . basta con mezclar los dos subvectores. índice : INTEGER i1 := inf.N) -> (* ordenación por mezcla *) PROCEDURE OrdenarAux (INOUT Vector : INTEGER1. siendo 1<=k<=n y 0<=l<=(n/2)-1... mediante comparaciones de sus elementos sucesivos. WHILE (i1<=medio) ^ (i2<=sup) DO IF vectori1 << vectori2 THEN vectorAuxj :=vectori1. i2 := i2 + 1 .l).. medio+1. OrdenarAux (vector. los valores de las casillas (k. N) El procedimiento para realizar la mezcla de los subvectores ordenados es: PROCEDURE Mezclar ( IN inf : INTEGER.= vectori2..N IF inf < sup THEN medio := (inf+sup) Div 2. IN sup : INTEGER. para obtener un único vector ordenado. OrdenarAux (vector. medio). los componentes tablai. i2 := medio + 1. IN medio: INTEGER. la combinación de los dos subvectores ya ordenados es fácil. j : INTEGER. sup : 1.N.s .grupos de equipos cuyos subcalendarios se han generado por divide y vencerás). En esta última etapa.. La partición puede hacerse por la mitad si se toma un índice m=[(i+s)/2] y dos subvectores vi. que obviamente ya esta ordenado. IN inf. es decir.N) -> VAR Medio : 1.N. Este proceso de mezcla es realizado por un procedimiento auxiliar. i2. inf. j := inf.j a partir de las casillas tablak.s un vector de índice inferior i e índice superior s. El algoritmo resultante es: PROCEDURE Ordenar (INOUT v : INTEGER1. i1. INOUT vector : INTEGER1.l ya completadas. Mezclar (vector. de acuerdo con las siguientes expresiones de los índices: i = (k + n/2) Mod (n+1) j = (1 + n/2) Mod n De esta forma se rellenan las casillas aun vacías.. sea vi. El caso básico corresponde a un subvector de un solo elemento. 1. inf.. medio.N.1.N) -> VAR vectorAux : INTEGER1. Ordenación de un Vector por Mezcla: La ordenación de un vector es un problema que se presta fácilmente a la aplicación de la técnica de divide y vencerás.. sup).

que existe un entero no negativo k tal que n=2k. (Si n no es un potencia de dos. A y B. Sin embargo. las ecuaciones anteriores se resuelven por sustituciones sucesivas. n=1. por sencillez. la técnica de divide y vencerás sugiere un algoritmo distinto. n =2k para algún k. pueden añadirse las filas y columnas de ceros necesarias para formar una dimensión que sea potencia de dos. Los únicos inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de almacenamiento (para dos copias del vector) y que. además de mezclar.sup DO vectorindice := vectorAuxindice El algoritmo resultante es sencillo conceptualmente. Si el producto AxB tiene la forma: A11 A12 B11 B12 C11 C12 A21 A22 B21 B22 C21 C22 Entonces: C11 = A11*B11 + A12*B21 C12 = A11*B12 + A12*B22 C21 = A21*B11 + A22*B21 C22 = A21*B12 + A22*B22 ¢ . b=cte Si n es una potencia de 2. de dimensión nxn... a=cte 2T(n/2) + bn. es decir. resultando: T(n) = 2T(n/2) + bn= =2K T(n/2K) + kbn = an + bn log2 n El algoritmo de ordenación por mezcla es óptimo en tiempo de ejecución. La matriz C tiene n2 elementos.) las submatrices A y B pueden partirse en cuatro submatrices de dimensión (n/2)x(n/2). que podemos llamar algoritmo convencional de multiplicación de matrices. que n es una potencia de dos.j)-esimo se forma multiplicando cada elemento de la final i-esima de A por el elemento correspondiente de la columna j-esima de B y sumando los productos parciales. Multiplicación de Matrices: Sean dos matrices.j := j + FOR índice IN i1. J := j + 1 FOR índice IN i2. La matriz productoC=AxB también es una matriz de nxn cuyo elemento (i. El cálculo de cada elemento Cij requiere n multiplicaciones.sup DO vectorAuxj := vectorindice . necesita copiar el vector auxiliar completo en el principal. de forma que las ecuaciones de recurrencia de la función de tiempo son: T(n) = a. n>1. Es fácil analizar la complejidad del algoritmo para un vector de longitud n.medio DO vectorAuxj := vectorindice. proviene directamente de la definición matemática del producto de matrices. Supongamos. Puede diseñarse un algoritmo de mezcla más complejo que mejore ambos aspectos. es decir. J := j + 1 FOR índice In inf.. así que el tiempo total del algoritmo de multiplicación es de orden O(n3). La operación de mezcla es proporcional a n. El algoritmo anterior. pero mantenga la complejidad asintótica calculada.

como inversión de una matriz o hallar su determinante. dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). siendo b alguna constante. de forma que no se ha conseguido ningún ahorro sustancial de tiempo. interesa encontrar algoritmos mas eficientes. Entonces. £ . Sin embargo. una característica es que el programa "aprende "dinámicamente de las decisiones que toma. Sin embargo. el número de secuencias de decisión es exponencial sobre el número de decisiones. no se reconsidera en el futuro. asimismo. evitándose una explosión combinatoria en la producción de las secuencias y consiguiéndose soluciones más eficientes en cuanto a tiempo de ejecución. Solamente al final se sabe cuál es la mejor de todas. 1<i<n. Programación Dinámica Principios de programación dinámica Se ha visto que la técnica voraz se aplica a problemas cuya solución puede formularse como el resultado de una secuencia de decisiones. no todos los problemas pueden resolverse de esta manera. conduciendo de forma directa a la solución. Este principio establece que "una secuencia óptima de decisiones que resuelve un problema debe cumplir la propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto al subproblema que resuelva ". pero de una manera menos directa que en el caso voraz. El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices. El método es eficiente porque una vez que se toma una decisión en un paso. porque la multiplicación esta relacionada con otras operaciones sobre matrices mas usuales. De esta forma se reduce al número total de subsecuencias generadas. resultará un total de d secuencias posibles de decisión. La existencia de un algoritmo eficiente para la multiplicación (en realidad. Podemos formalizar algo más la idea básica. aunque fuera a costa de un mayor numero de sumas de matrices. tal que Eo es el estado inicial del problema y deben tomarse n decisiones d. Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de matrices. sea. Eli el estado del problema tras la elección del valor vli 1<i<n1 y Sli una secuencia óptima de decisiones respecto al estao Eli. La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3). todo problema resoluble con esta técnica debe de satisfacer el principio de optimalidad.Para n=2. Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2. Usando una técnica de fuerza bruta. Supongamos que tenemos un problema que satisface el principio de optimalidad. No es fácil establecer una definición de la programación dinámica. La programación dinámica (también llamada planificación dinámica) es una técnica de programación que también permite resolver problemas mediante una secuencia de decisiones. Además. porque si hay d opciones para cada una de las n decisiones. pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensión (n/2)x(n/2). una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }. para cualquier operación de las anteriores) significaría la existencia de un algoritmo similar para las demás. En la programación dinámica todos los subproblemas se resuelven de acuerdo con criterio de tamaño creciente y los resultados de subproblemas más pequeños se almacenan en algún tipo de estructura de datos (normalmente tablas) para facilitar la solución de los problemas más grandes..vn} el conjunto de valores de decisión posibles para la decisión d1. asegurando que la secuencia de decisiones es la mejor de las posibles. 1<i<N1. los elementos Cij se calculan mediante algunas multiplicaciones y sumas de números. Esta vez se necesita producir varias secuencias de decisiones. Sea D = { v1 .

xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado... la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi.. a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ). hay un caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones. En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz. partiendo como estado inicial de Ek-1. Por lo tanto. todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solución. además. debe existir una función de criterios que debe ser satisfecha por cada secuencia solución u optimizada por dichas secuencias solución si solo queremos la mejor. si este subproblema de simboliza como problema (k.. 1<i<n.xi+1) no puede extenderse para alcanzar un nodo de respuesta. Por supuesto. La expresión inicial de la ecuación de recurrencia.. Sin embargo.. La formulación delantera expresa la decisión de Xl . La elección de una formulación delantera o trasera depende del problema considerado o.n ). En resumen... pudiéndose aplicar la técnica de programación dinámica.. 1<i<n . INOUT solucion : elemento1... tiene la ventaja ( quizás paradójica al tratar de un problema más pequeño ) de que proporciona una visión más general del problema en cuestión.l). entonces el problema completo es problema ( l.1 ) resultante de aplicar cada valor de decisión...xi+1) es un camino hasta el estado del problema.. Supongamos que existe algún predicado acotador A tal que A(x1..n son aquellos valores generados por G que satisfacen A. Esquema de Algoritmos de Vuelta Atrás: Sea (x1. 1<k<n. Supongamos que también existe algún predicado R que determina si un camino (x1. Algoritmos De Vuelta Atrás Existen un alto número de problemas que pueden formularse como la búsqueda de la mejor solución o del conjunto de todas las soluciones que satisfacen ciertas condiciones.. los candidatos para la posición i+1 del vector desolucion x1...dl... la aplicación de la técnica de programación dinámica a un problema significa comprobar primero el principio de optimalidad y desarrollar después unas ecuaciones recurrentes del estilo de (1) y (2). ( Obsérvese que vamos a usar la técnica de resolución de problemas por generalización para después poder realizar una particularización de la solución obtenida..1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1.Xn la secuencia de decisiones necesaria para resolver el problema. Sea G(x1... La ecuación general relaciona la secuencia óptima en una etapa i con la decisión tomada en la etapa i y la subsecuencia óptima en la etapa posterior i+1. que es problema ( n.. sólo que en orden contrario. La formulación trasera expresa la decisión de Xi. Otros problemas satisfacen el principio de optimalidad. Sea X1 ..) Una solución dinámica para problema ( k.El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo.n) -> ¤ ¤¤ ¤ . cada solución es el resultado de una secuencia de decisiones. sencillamente. del gusto del programador. El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER.xi) el conjunto de todos los valores posibles de xi+1 tales que (x1.. Además. puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk .. La ecuación de recurrencia puede formularse de dos formas: delantera o trasera.. a tomar. 1<i<n. Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera.n ).xi+1) es falso si el camino (xi.xi+1) termina en un nodo de respuesta.

1. La técnica de ramificación y acotacotacion aplica de la siguiente manera: Supóngase que al recorrer un árbol y alcanza una hoja se tiene una solucion con k colores. 1. Retroceso (k+1. A). Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. k-1) DO Solucion k := nodo. Es un problema NP. IF R(solucion. Normalmente. La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces. 1. Ramificación (Bifurcacion) Y Acotación Los métodos de Ramificación y Acotación constituyen un a variante de las técnicas de retroceso para problemas donde se trata de encontrar el valor máximo o mínimo de cierta función objeto (esto suele suceder en los problemas de programación lineal entera). pero necesitamos una solución eficiente.k) THEN << guardar µsolucion¶ >>. completo y ponderado G = (V. donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. El problema del viajante Problema: Dado un grafo no dirigido.VAR nodo : elemento FOR noso IN G(solucion. Este mismo proceso se repite en el resto de nodos del árbol. Se hace necesario utilizar algoritmos heurísticos: Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución (puede que la óptima) pero también puede que no produzca ninguna solución o dar una solución no muy buena. El procedimiento no hace ninguna llamada recursiva cuando k = N+1 o cuando ningún nodo generado por G satisface el elemento posible que satisfacen A se añade una solución particular. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos. k) THEN IF R(solucion. Posibilidades: . se comprueba si se ha encontrado una solucion. solucion) La llamada inicial del algoritmo es Retroceso(1. Así. pues tenemos ya una solucion mayor. Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. En este punto podemos retroceder (y no seguir avanzando por mas ramas). encontrar un ciclo simple de costo mínimo que pase por todos los nodos. se basa en un conocimiento intuitivo del programador sobre un determinado problema. evitando así la exploración de gran parte de al estructura. Problema de optimización. y que al seguir avanzando en el árbol (mediante la aplicación de varios pasos de retrocesos) se alcanza un nodo que requiere k+1 colores. k sirve de cota inferior al retroceso. La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria. solucion). Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo.

4.1. (3. c2. A continuación se ilustra este tipo de tratamiento de problemas al problema de recubrimiento de un grafico: Dado un grafo G=(V. . 4).. a2. ó bien.. 5. . normalmente ambos dan soluciones buenas. Solución: (5. Se trata de calcular un subconjunto A¶ de aristas tal que dos aristas . 4. 3). Empezar con un grafo sin aristas. 5). Las aristas son los candidatos. Solución: ((2.. es probable que no sepamos resolverlo de manera precisa y completa utilizando un algoritmo polimico en tiempo. (1. como es calcular el ajuste maximizal del grafo G. Solución: (1. Selección: seleccionar la arista candidata de menor coste. an-1) que formen un ciclo hamiltoniano. Acabamos cuando tengamos n nodos. (1. Para este tipo de problemas. Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2. 3. próximas a la óptima. 2). 2. Empezar en un nodo cualquiera. Algoritmos De Aproximación Dado un problema NP completo. Sin embargo.A). Los nodos son los candidatos. repetir la heurística 1 con varios orígenes. el orden de visita de los nodos. En cada paso moverse al nodo no visitado más próximo al último nodo seleccionado. pero garantizando que se forme un ciclo. Este problema se puede resolver a través de otro aproximado. Hacer igual que en el algoritmo de Kruskal.. sin importar el orden. 3. resulta parcialmente interesante que estos garanticen una cota en el margen de imprecisión. cn). Ejemplo. Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al primero) de la secuencia actual (c1. Sin embargo. ..... 2. Inicialización: seleccionar un nodo cualquiera. Heurística voraz 1 ± Una solución será un cierto orden en el conjunto de nodos (c1. ca). Posibles mejoras: buscar heurísticas mejores. 2) Coste: 30+15+25+10+45=125 Empezando en el nodo 3. a partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución. ‡Ejemplo. (4.. c2. 5)) Coste = 10+15+20+45+50 = 140 Conclusiones: Ninguno de los dos algoritmos garantiza una solución óptima. 1) Coste: 15+20+10+45+50=140 Heurística voraz 2 ± Una solución será un conjunto de aristas (a1. se trata de encontrar un conjunto con el menor numero de vértices tal que toda arista sea incidente por lo menos de un vértice de V. Empezando en el nodo 1. los algoritmos que no conducen a una solución óptima se llaman algoritmos de aproximación.

El procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando aristas de G. Este nuevo problema garantiza conseguir un recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. por lo menos la mitad de los vértices de M deben pertenecer a un recubrimiento.análisis y diseño. Justificacion Es importante el estudio y conocimiento de lo que hoy conocemos como Algoritmos Computacionales. Objetivos General : Posibilitar la estudiante alcanzar una visión sistemática de lo que conocemos sobre Los Algoritmos Computacionales. también por la propia definición. ningún vértice perteneciente a M puede recubrir a mas de una arista en M. donde daremos los conceptos básicos de semánticay sus tipos haciendo mayor énfasis en la semántica axiomática. En el siguiente trabajopretendemos presentar una serie de conceptoy definiciones propios del estudio de los Algoritmos. y seguirá siendo.cualquiera de A¶ no tengan ningún vértice común y toda arista de A-A¶ comparta algún vértice común con una arista de A¶. la recursividad e iteración. seria necesario demostrar que el conjunto de todos los vértices inciden a las aristas de un ajuste maximal M para un grafo G es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de tamaño mínimo. También veremos los diferentes tipos de formas y tamaños o medidas en que se pueden almacenar y representar los datos y estructuras en un algoritmo o programa. de una en una y en cualquier orden e ir eliminando las incidentes al conjunto que se esta construyendo hasta recubrir todo en grafo. que desde su aparición hasta nuestros días es. En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes. su análisis y diseño. el voraz. entre otros. su importancia en el mundo de las aplicaciones para computadoras y el manejo de lógica de programación. ya que por la definición de ajuste maximal. Motivación Como estudiantes de la Facultad de Ciencias y Tecnología " Escuela de Informática y Computación " de la Universidad Dominicana Organización y Métodos O&M con aspiraciones de iniciarnos como Ingeniero en Sistemas y Computación. programación dinámica. Específicos : Introducir los conceptos propios sobre Algoritmo. En ese mismo orden encontraremos las diferentes técnicaspara diseñarlos como son el método de la fuerza bruta. Para poder aplicar el nuevo problema aproximado. En consecuencia. . Con el objetivoinmediato de aprobar con los mejores meritos la asignatura de Algoritmos Computacionales. los vértices incidentes a las aristas de M son un recubrimiento de G. vital para el desarrollo de aplicaciones para computadorasy el manejo y dominio de la lógica de programación para resolver problemas. divide y vencerás. los diseños de estos últimos. Esto es evidente. de vuelta atrás. De igual forma podremos ver las definiciones y algunas características. reglas. normas. así como los típicos ciclos utilizados en algoritmos y programas y los paso a tener en cuenta al momento de desarrollar un algoritmo iterativo o recursivo. Finalmente veremos los que es la verificación y derivación de programas. tipos de algoritmos de búsqueda y ordenación así como sus aplicaciones.

matemático persa que vivió durante el siglo IX y alcanzo gran reputación por el enunciado de las reglas para sumar. multiplicar y dividir números decimales. 2. Ejecución y validación del programa por la computadora. Diseño de algoritmo. Generalidades El programador de computadoras es ante que nada una personaque resuelve problemas. etc. 3. ya tratado. que describe la secuencia ordenada de pasos que conducen a la solución de un problema dado. La palabra algoritmo se deriva del nombre latinizado del gran Matemático Árabe Mohamed Ibn Al Kow Rizmi. El conjunto de todas las operaciones a realizar y e orden en que se deben efectuarse. Visualizar sus ventajas e importancia. Definir sus tipos y variantes. Algoritmos + Estructuras de Datos = Programas. Es un método para resolver un problema mediante una serie de datos precisos. Marco Historico Un algoritmo es un conjunto de operaciones y procedimientosque deben seguirse para resolver un problema. A la metodología necesaria para resolver problemas mediante programas se denomina Metodología de la Programación. el que tradujo la obra al latín y el inicio con la palabra: Algoritmi Dicit. La resolución de un problema exige el diseño de un algoritmo que resuelva el problema propuesto. Los pasos para la resolución de un problema son: 1. El profesor Niklaus Wirth. El eje central de esta metodología es el concepto. búsqueda. 2. El lenguajealgorítmico es aquel por medio al cual se realiza un análisis previo del problema a resolver y encontrar un método que permita resolverlo. significándonos que solo se puede llegar a realizar un buen programa con el diseño de un algoritmo y una correcta estructura de datos. Modula-2 y Oberon. donde se recogía el sistema de numeración hindú y el concepto del cero. Un algoritmo es un método para resolver un problema. titulo uno de sus mas famosos libros. Aunque la popularización del término ha llegado con el advenimiento de la era informática. . Euclides. Proporcionar conceptos sobre su análisis y diseño. restar. (Análisis del problema y desarrollo del algoritmo). Fue Fibinacci. Esta ecuación será de una de las hipótesis fundamentales consideradas en esta obra. Proporcionar concepto sobre las técnicas de diseño. por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemático. el cual escribió sobre los años 800 y 825 su obra Quitad Al Mugabala. se considera con Al-Khowarizmi el otro gran padre de la algoritmia ( ciencia que trata de los algoritmos). inventor de Pascal. Desglosar sus variantes (ordenación. algoritmo proviene de Mohammed alKhowarizmi. definidos y finitos. (Fase de codificación. el gran matemático griego (del siglo IV antes de Cristo) que invento un método para encontrar el máximo común divisor de dos números. de algoritmo. se le denomina algoritmo.y y y y y y Proporcionar una idea de su uso. la traducciónal latín del apellido de la palabra algorismus derivo posteriormente en algoritmo.) 3. Expresar el algoritmo como un programa de lenguaje de programación adecuado. ).

Para llegar a la realización de un programa es necesario el diseño previo de algoritmo. cordero). de modo que sin algoritmo no puede existir un programa. Un algoritmo debe estar definido. En la cienciade la computación y en la programación. 3. la solución de un problema se puede expresar mediante un algoritmo. el algoritmo será siempre el mismo. ingles o francés. Dada la importancia del algoritmo en la ciencia de la computación. En el algoritmo de receta de cocina citado anteriormente se tendrá: Entrada: ingrediente y utensilios empleados. 5. Redactar el algoritmo correspondiente. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta. Así. En esencia. Un lenguaje de programación es tan solo un medio para expresar un algoritmo y una computadora es solo un procesador para ejecutarlo. 4. en caso contrario. Proceso y Salida. rechazar pedido fin Diseño del Algoritmo: En la etapa de análisis del proceso de programación se determina que hace el programa. inicio leer el pedido examinar la ficha del cliente si el cliente es solvente aceptar pedido. debe tener un numero finito de pasos. Proceso: elaboración de la receta en la cocina. Los métodos mas eficaces para el proceso de diseño se basan en el conocido por Divide y Vencerás. Características de los Algoritmos: Las características fundamentales que debe cumplir todo algoritmo son: y y y Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como de la computadoraque lo ejecuta. Tanto el lenguaje de programación como la computadora son los mediospara obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso correspondiente. o sea. los algoritmos son más importantes que los lenguajes de programación o las computadoras. 2. Ejemplo de Algoritmo: Un cliente ejecuta un pedido a una fábrica. Un algoritmo debe ser finito. se debe obtener el mismo resultado cada vez. Salida: terminación del plato (por ejemplo. La definición de un algoritmo debe definir tres partes: Entrada. Los pasos del algoritmo son: 1. si el cliente es solvente entonces la empresa acepta el pedido. en una analogía con la vida diaria. un aspecto muy importante será el diseño de algoritmos. es decir. Esta examina en su banco de datos la ficha del cliente. en caso contrario rechazara el pedido. Si se sigue un algoritmo se debe terminar en algún momento. una receta de un plato de cocina se puede expresar en español. la . pero cualquiera que sea el lenguaje. En la etapa de diseño se determina como hace el programa la tarea solicitada. El diseño de la mayoría de los algoritmos requiere creatividady conocimientos profundos de la técnica de la programación. los pasos para la elaboración del plato se realizaran sin importar el idioma del cocinero. sin embargo. Si se sigue un algoritmo dos veces. por ejemplo.

El proceso que convierte los resultados del análisis del problema en un diseño modular con refinamiento sucesivo que permitan una posterior traducción al lenguaje se denomina diseño de algoritmo. Recursos consumidos: Tiempo de ejecución. Cualquier programa bien diseñado consta de un programa principal (el modulo de nivel mas alto) que llama a sub programas (módulos de nivel mas bajo) que a su vez pueden llamar a otros sub programas.resolución de un problema complejo se realiza dividiendo el problema en sub problemas y a continuación dividir estos sub problemas en otros de nivel mas bajo. su facilidad de programarlo. fácil de entender. El diseño del algoritmo es independiente del lenguaje de programación en el que se vaya a codificar posteriormente. Comprobar el modulo. Este método se conoce técnicamente como diseño descendente (Top Down) o modular. Análisis De Algoritmos Recursos De Computadores Y Complejidad Algoritmo: Conjunto de reglas para resolver un problema. Los programas estructurados de esta forma se dice que tienen un diseño modular y el método de romper el programa en módulos más pequeño se llama Programación Modular. Eficiencia: Relación entre los recursos consumidos y los productos conseguidos. Comunicaciones. Recursos consumidos: Ejemplo. Los módulos pueden ser planeados. Criterio empresarial: Maximizar la eficiencia. 4. Su ejecución requiere unos recursos. forma aproximada o algunos casos. ¿Cuántos recursos de tiempo y memoria consume el siguiente algoritmo sencillo? i:= 0 a[n+1]:= x repetir i:= i + 1 . etc. codificados. Combinar el modulo con los módulos anteriores. El proceso de romper el problema en cada etapa y expresar cada paso en forma más detallada se denomina refinamiento sucesivo. El proceso implica la ejecución de los siguientes pasos hasta que el programa se termina: y y y y programar modulo. corto. Si es necesario. etc. Cada sub programa es resuelto mediante un modulo (sub programa) que tiene un solo punto de entrada y un solo punto de salida. procesadores. hasta que pueda ser implementada una solución en la computadora. Lo que se consigue: Resolver un problema de forma exacta. depurar el modulo. Un algoritmo es mejor cuantos menos recursos consuma. Memoria principal: Entradas/salidas a disco. comprobados y depurados independientemente (incluso por diferentes programadores) y a continuación combinarlos entre si. robusto.

. de las estructuras de datos utilizadas. En particular.. ¿Existe una cota inferior y superior del número de ejecuciones? ¿Se puede convertir en un FOR? El análisis de algoritmos también puede ser a posteriori: implementar el algoritmo y contar lo que tarda para distintas entradas.. Bucles FOR: Se pueden expresar como una sumatoria. de forma aproximada (y parametrizada). Conclusión: Estudiar la variación del tiempo y la memoria necesitada por un algoritmo respecto al tamaño de la entrada y a los posibles casos. Asignación de tiempos. con los límites del FOR. T(5)= 5 ms N= 6. de lo que haya en a.): Una unidad de tiempo. Caso promedio. ¿De qué depende? De lo que valga n y x. *. Bucles WHILE y REPEAT: Estudiar lo que puede ocurrir.. Operaciones básicas (+.. de los tipos de datos. Ejemplo. Los factores externos no aportan información sobre el algoritmo. El ordenador donde lo ejecutemos: 286. Programa "cifras. luego se diferencia en una constante con los anteriores.. Calcular la media de una matriz de NxM. con los segundos que tardan las operaciones básicas correspondientes. Operaciones de entrada salida: Otra unidad de tiempo. T(4)= 0. Cray. La ejecución más lenta posible... Ejemplo. ¿Cuánto tiempo. Media de todos los posibles contenidos. -. para el conteo de instrucciones. Mejor caso y peor caso según la condición. externos no aportan información sobre el algoritmo. o una constante diferente.. ¿Tardarán todas lo mismo? Ejecuciones del bucle principal. pero ¿qué significa T(N)? Tiempo de ejecución en segundos.2 s . Pentium III.. El lenguaje de programación y el compilador usado. Mejor caso. La implementación que haga el programador del algoritmo.. de la máquina. Instrucciones ejecutadas por el algoritmo.hasta a[i] = x Respuesta: Depende. Peor caso.. Tamaño de los datos de entrada.1 ms N= 5. T(6)= 0.. Suponiendo que b y c son constantes. :=. Algunas reglas básicas. T(N) = bN + c. Contenido de los datos de entrada. IF y CASE: Estudiar lo que puede ocurrir. ¿Se puede predecir cuándo se cumplirán las condiciones? Llamadas a procedimientos: Calcular primero los procedimientos que no llaman a otros.exe": N= 4. T(N) = N+1. Normalmente usaremos la notación T(N)=.? Sabemos que cada ejecución lleva un tiempo constante.. El contenido favorece una rápida ejecución. cuántas instrucciones. o alguna constante. T(N) = 2N + 4. En general los recursos dependen de: Factores externos.

no una función. Dadas f y g de N en R+. Dadas f y g de N en R+. Medidas Asintoticas Notación asintótica: El tiempo de ejecución T(n) está dado en base a unas constantes que dependen de factores externos. T(7)= 10 s N= 8. n Î O(n2) Þ 2n+1 Î O(n2) P2. Si f Î O(g) y g Î O(h) entonces f Î O(h). Orden de complejidad de f(n): O(f) Dada una función f: N ® R+. T(8)= 3. Dadas f y g. La definición es aplicable a cualquier función de N en R. Nos interesa un análisis que sea independiente de esos factores. ¿se cumple O(f)Í O(g) ó O(g)Í O(f)? P4. de N en R+. Grandes. O(T): Orden de complejidad de T. llamamos orden de f al conjunto de todas las funciones de N en R+ acotadas superiormente por un múltiplo real positivo de f. "Valores de n sufic. W (f+g) = W (max(f+g)) ¿Y para los Q (f+g)? ¿Es cierto que O(f . g)). Propiedades P1. u omega de T. se cumple: i) O(f) = O(g) Û f Î O(g) y g Î O(f) ii) O(f) Í O(g) Û f Î O(g) ¿La relación de orden entre O(. para valores suficientemente grandes (asintóticamente) sin considerar constantes. "Funciones acotadas superiormente por un múltiplo de f... Si f Î W (g) y g Î W (h) entonces f Î W (h) Ej. O(f)= { t: N ® R+ / $ c Î R+. " n ³ n0: t(n) £ c·f(n) } Nota: O(f) es un conjunto de funciones. $ n0 Î N..": no nos importa lo que pase para valores pequeños.. no sólo tiempos de ejec. para valores de n suficientemente grandes. se cumple: i) limn¥ ® f(n) Î R+ Þ O(f)=O(g). Podemos hacer previsiones.N= 7.": nos quitamos las constantes. ¿Cómo es la relación para los W ? P3. W (f)=W (g). Q (T): Orden exacto de T. si el algoritmo es poco eficiente. W (g) Í W (f) g(n) . Podemos comparar con otros algoritmos. 2n+1 Î O(n).g) = O(max(f. -g))? P5.5 min ¿Qué conclusiones podemos extraer? Análisis a priori: Evitamos la implementación. Q (f)=Q (g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Í O(g).) es completa? Dadas f y g. W (T): Orden inferior de T.. O(f+g) = O(max(f. Notaciones asintóticas: Indican como crece T. Si f Î O(g) entonces O(f) Í O(g).

¿O(f) « O(f | P)? Ordenes De Complejidad Uso de los órdenes de complejidad: Dado un tiempo t(n). k2 ³ n2 . o variables T(N. km) £ c·f(k1. para funciones con varios parámetros. O(n+2m) Notaciones condicionales: En algunos casos interesa estudiar el tiempo sólo para ciertos tamaños de entrada.. f: Nm ® R+ (f: Nx. Memoria en una tabla hash. Ejemplo.. Podemos suponerlos constantes T(N). M(B.b). . " k1 ³ n1 .n. llamamos orden de f según P (o condicionado a P) al conjunto: O(f | P)= { t: N ® R+ / $ c Î R+. llamamos orden de f al conjunto de todas las funciones de Nm en R+ acotadas superiormente por un múltiplo real positivo de f. para valores de (n1. Orden condicionado de f(n): O(f | P) Dada una función f: N ® R+. t(n) Î O(n2)..a. Ejemplo. ¿Qué relación hay entre los siguientes órdenes? O(n+m).. " n ³ n0: P(n) Þ t(n) £ c·f(n) } De igual forma.. ‡Relación de orden entre O(..m.. podemos extender los conceptos de W (f) y Q (f). . O(f)=O(g) Û Q (f)=Q (g) Û f Î Q (g) Û W (f)=W (g) P7. k2.. T(N) = T(N.. n2. b) = a·N + b El tiempo depende del tamaño del problema N. k2. .. encontrar la función f más simple tal que t Î O(f). km) } De la misma forma. el tiempo y la memoria consumidos pueden depender de muchos parámetros.P5.. nm): O(f) Dada una función f: Nm ® R+. O(nm) O(n2). Dadas f y g de N en R+. l.. y P: N ® B.. y del tiempo de inicialización b y de ejecución de un paso a. $ n0 Î N.. . f Î O(g | false). O(f) = O(f | true). se cumple: i) limn¥ ® f(n) Î R+ Þ O(f) = O(g) g(n) ii) limn¥ ® f(n) = 0 Þ O(f) Ì O(g) g(n) iii) limn¥ ® f(n) = +¥ Þ O(f) É O(g) g(n) Notación con varios parámetros: En general. nm) suficientemente grandes. Ej. Para cualquier f y g. tenemos W (f | P) y Q (f | P). ¿Qué relación hay entre O(log2 n) y O(log10 n)? P6.) = Relación de inclusión entre conjuntos. $ n1. .. Algoritmo de búsqueda binaria: Si N es potencia de 2 el estudio se simplifica. y que más se aproxime asintóticamente. . O(f)= { t: Nm ® R+ / $ c Î R+. t(n) = 2n2/5 + 3p /2. Dadas f y g de N en R+. Ejemplo.. n2. Las propiedades se siguen cumpliendo ® Demostrarlo. k) = kB+l+n+2kn Orden de complejidad de f(n1.. nm Î N....." km ³ nm : t(k1. a.xN ® R+) Ej.

. $ n0 Î N. otra para n/2.. t(n) = amnm + am-1nm-1 + . O(c) Ì O(n) O(cn + b) = O(dn + e) O(p) = O(q). nnn å 1 = n Î O(n). siendo c y d constantes positivas. asintóticamente y salvo constantes. si p y q son polinomios del mismo grado. Ejemplo. O(p) Ì O(q). Orden inferior u omega de f(n): W (f): Dada una función f: N ® R+.. å im Î O(nm+1) i=1 i=1 i=1 Si hacemos una operación para n. si p es un polinomio de menor grado que q.. El acto de diseñar un algoritmo puede considerarse como una tarea que difícilmente podrá ser del todo . 5. d Î R+.±O(f) £ O(g) Û O(f) Í O(g) Û Para toda t Î O(f).Es necesario en este momento mencionar algo sobre como hacerlo. " n ³ n0: t(n) ³ c·f(n) } La notación omega se usa para establecer cotas inferiores del tiempo de ejecución.) Ì O(n2) Ì O(n3) Ì . para valores de n suficientemente grandes... Relación de orden: igual que antes. +a1n + a0 t(n) Î o(amnm) ¹ o(nm) ¿o(amnm) Í O(amnm)? ¿o(t) Í O(t)? Costa de complejidad con frecuencia Algunas relaciones entre órdenes frecuentes: O(1) Ì O(log n) Ì O(n) Ì O(n·log n) Ì O(n·(log n)2) Ì O(n1. W (f)= { t: N ® R+ / $ c Î R+. Los logaritmos son del mismo orden. independientemente de la base. llamamos orden exacto de f al conjunto de todas las funciones de N en R+ que crecen igual que f. Técnica de diseño de algoritmos Diseño de Algoritmos: Hasta ahora se han realizado algunos comentarios respecto a la necesidad de diseñar algoritmos correctos y eficientes utilizando los elementos de un lenguaje de programación .... " n ³ n0: c·f(n) ³ t(n) ³ d·f(n) } Notación o pequeña de f(n): o(f): Dada una función f: N ® R+. Ì O(2n) Ì O(n!) Ì O(nn) ¿Qué pasa con las omegas? ¿Y con los órdenes exactos? El orden de un polinomio anxn+. llamamos omega de f al conjunto de todas las funciones de N en R+ acotadas inferiormente por un múltiplo real positivo de f.. å i = n(n+1)/2 Î O(n2). Orden exacto de f(n): Q (f): Dada una función f: N ® R+..001. . t Î O(g) ‡Se cumple que: O(c) = O(d). aparecerá un orden logarítmico O(log2 n). llamamos o pequeña de f al conjunto de todas las funciones de N en R+ que crecen igual que f asintóticamente: o(f)= { t: N ® R+ / lim t(n)/f(n) = 1}n¥ ® Esta notación conserva las constantes multiplicativas para el término de mayor orden.+a1x+a0 es O(xn). n/4. $ n0 Î N. Q (f) = O(f) Ç W (f) = { t: N ® R+ / $ c.

Otros esquemas requieren un análisis minucioso del problema de forma que la solución se vaya construyendo en etapas. algunos resultan inmediatos de resolver. una tarea difícil. No obstante. que debe . completa y consistente del problema a resolver y queremos obtener un algoritmo en el que. El esquema mas sencillo quizás sea el llamado divide y vencerás. otros son bastante complejos.automatizada. y el empleode tablas como estructura auxiliar para la resolución eficiente de problemas donde se aplica programación dinámica). Supongamos que disponemos de una especificación precisa. a la vez bastante ineficiente. siendo dicha solución finalmente adaptada al dominio original. pero con un poco de análisis puede encontrarse algoritmos más eficientes. el uso de parámetros de acumulación al resolver problemas utilizando divide y vencerás. y a métodos basados en transformaciones del dominio para encontrar una solución mas fácilmente a un problema en un dominio transformado. Si puede preverse que decisión conviene en cada etapa para producir cierto tipo de mejor resultado. puede ser muy directo. podríamos utilizar un algoritmo general llamado algoritmo del museo británico. su uso adecuado mediante el esquema de búsqueda con retroceso (o backtracking) permite ganar gran eficiencia respecto a soluciones de fuerza bruta. Por ultimo. Aprender los principiosbásicos del diseño de algoritmos podemos preguntarnos por un método aceptable. puesto que existe un número reducido de esquema y técnicas de diseño. Nos estamos refiriendo a métodos basados en la mejora de la eficiencia (por ejemplo. se decir. es organizar el diseño sobre un esquema de algoritmo o una técnica de diseño que haya demostrado su utilidad para otros problemas. Muchos problemas pueden resolverse buscando una solución fácil y directa pero. su tarea se simplifica. Aun así. hay problemas cuya solución no puede hallarse sino mediante un proceso de búsqueda. El mas entendido. Este método de trabajo es practicable. Si no nos importa la eficiencia del algoritmo. Todo problema algorítmico es un reto para su diseñador. Consideraciones generales Si el hábil programador dispone de un recetario de algoritmos de donde poder seleccionar el más adecuado para cada problema. tenemos una solución voraz. y quizás el mejor. basado en la descomposición de un problema en subproblemas. se produzca cierto resultado. La investigaciónen esta área ha permitido descubrir un conjunto de métodos o esquemas de diseño hacia los cuales puede orientarse la realización de muchos algoritmos. a esquemas muy generales que pueden adaptarse a un problema particular al detallar las partes generales del esquema. El conocimiento de técnicas de diseño es solo un primer paso para el diseñador. El diseño de un algoritmo que resuelva un problema es. idear un algoritmo continua siendo una labor bastante creativa donde los conocimientos y la experiencia del propio diseñador tiene un papel fundamental. a pesar de lo complejas que son las operaciones de búsqueda. Se programa un computador de manera que parta de un conjunto de axioma matemáticos y los que use para reducir aleatoriamente teoremas validos. solo puede tomarse tras considerar varias solucionesde otras etapas mas simples. en general. conviene conocer otros métodos de diseño de algoritmos que también resultan de utilidad práctica. llamado de fuerza bruta. Una forma de facilitar esta labor consiste en recurrir a técnicas conocidas de diseño de algoritmos. y a pesar de que resulta mas adecuado en bastantes casos utilizar alguno de estos esquemas que realizar un diseño desde cero. la solución es dinámica. si la decisión en una etapa. dados uno datos de entrada valido. Este método.

. la fuerza bruta. pero muy ineficientes. pero dado que no se ha analizado apenas el problema. por lo que uno puede sentirse tentado a usar siempre. Técnicas de los Parámetros Acumuladores y de Tabulacion La recurcion es un mecanismo que permite obtener. una solución funcional a muchos problemas. poco reflexionada. sobre todo. Muchos algoritmos recursivos resultan eficientes. Uno de ellos realizaba una búsqueda secuencial con complejidad lineal sobre el tamaño del vector y podía usarse con cualquier vector. con la experiencia. En realidad. Una solución por fuerza bruta también puede resultar adecuada como primera aproximación a la solución final. Lo más razonable es comprobar si el vector esta ordenado y. en combinación con otras contrucciones. en caso positivo. pero poco reflexionada. es muy probable que no se hayan aprovechado propiedades deducibles del problema y que la solución sea terriblemente ineficiente. En principio. pero no todos: hay algunos fácilmente formulables. La función principal usa una función auxiliar que tiene los parámetros de aquellas más algunos adicionales. Método de fuerza bruta Comenzamos el estudio de esquemas algorítmicos con un método sencillo. aprovechar esta circunstancia para usar el algoritmo más eficiente: el de búsqueda binaria. porque su desarrollo puede permitir profundizar más sobre el problema y conocer propiedades que sean utilizadas para obtener otra versión más eficiente. cuya idea básica se expone a continuación. Parámetros Acumuladores Veamos primero una solución ineficiente que intentaremos mejorar. La función principal simplemente realiza una llamada a esta función auxiliar en los que los parámetros de aquellas se modifican y los parámetros nuevos toman un valor inicial adecuado . y solo se podía usar cuando el vector estuviese ordenado. Cada una se ilustra con un ejemplo distinto. Esta es la solución de fuerza bruta: una solución directa. El algoritmo primero responde a un razonamiento más sencillo. con complejidad logarítmica. Veremos dos parámetros para la mejora de eficiencia de algoritmos recursivos: el uso de parámetros acumuladores y el uso de tablas. Ejemplo: Números de Fibonacci Los números de fibonacci suele especificarse como: Fib(0)=1 Fib(1)1 Fib(n+2)=fib(n)+fib(n+1) Esta especificación de los números de fibonacci tienen una formulación recursiva inmediata en estilo funcional. si no mas bien calificativo Para una forma de diseñar algoritmos: tomar una solución directa. Un modo de evitar problema lo proporciona la técnica de los parámetros acumuladores. pero debe mejorar su rendimiento para que sea práctico. no es un esquema algorítmico. Por ejemplos: Algunos algoritmos de búsqueda de un elemento en un vector. Otro algoritmo realizaba un búsqueda dicotomica o binaria. En estos casos. dichos algoritmos pueden servir como una primera aproximación al algoritmo definitivo. Los parámetros adicionales tienen como misión ir acumulando resultados principales durante el proceso recursivo. esto no es malo.completarse con otros conocimientos y. pero que debe evitarse siempre que se pueda. dad su ineficacia.

no importa que). Ejemplo. . Divide y vencerás: Consiste en descomponer un problema en un subproblema. Si no ha encontrado y es anterior se procede a buscarla en la primera mitad. se supone que ambos participantes tienen cualidades y preparación similar . siendo ( n ) mayor que( 0 ). Se abre el diccionario por la pagina centrar(quedando dividido en dos mitades) y se comprueba si la palabra aparece allí o si es léxico gráficamente anterior o posterior. mientras el valor de dicha moneda sea mayor o igual al cambio que resta por dar). Consideraciones y Criterios para Diseñar Algoritmos Algunas consideraciones estilísticas pueden contribuir a mejor la calidadde los algoritmos (y programas ) mediante la reducción del numero de errores que aparecen al desarrollar los.Tabulacion No todos los algoritmos recursivos ineficientes pueden optimizarse con la técnica de los parámetros acumuladores. donde puede consultarse otras veces que se necesite. La intención es que la primera vez que se realiza un cálculo. Búsqueda de una palabra en un diccionario Como ejemplo sencillo de aplicación de esta estrategia puede considerarse la búsqueda de una palabra en un diccionariode acuerdo con el siguiente criterio. la moneda de mayor valor ( es decir. si es posterior.etc. se trata de dar como cambio la menor cantidad posible usando estos tipos de monedas. se va procedimiento paso a paso realizándose la mejor elección (usando una función objetivo que respeta un conjunto de restricciones ) de entre las posibles. que juegan una competición que es ganada por el primero que venza en n partidos. cuando se pueda. De forma que cada uno tiene un 50% de posibilidades de ganar cada partido. se almacena en una tabla. Dar un cambioutilizando el menor número de monedas Considérese ahora el problema de la devolución del cambio al realizar una compra (por ejemplo. Hay dos participantes (deportistas o equipos. Método voraz: Este método trata de producir tipo de mejor resultado a partir de conjunto de opciones candidatas . la planificación en el orden de la ejecución de unos programas en un computador.Para ello. La estrategia voraz aplicada comienza devolviendo. Puede emplearse en problemas de optimización.. la ordenación de vectores. Esta técnica también se suele emplear con la programación dinámica. y así sucesivamente. El procedimiento se repite sucesivamente hasta encontrar la palabra o decidir que no aparece. Por sencillez . Esta técnica se puede aplicar con éxito a problemas como la multiplicación de matrices. en una maquina expendedora de tabaco). Otra técnica útil es el uso de tablas. la modificación para incorporar probabilidades diferentes es evidente y no complica el problema. A. El proceso finaliza cuando se ha devuelto todo el cambio. la búsqueda en estructuras ordenadas. De todas formas. como el conocido de la mochila. Suponiendo que se disponga de cantidad suficiente de ciertos tipos diferentes de monedas de curso legal.etc. resolver independientemente los subproblemas para luego combinar sus soluciones y obtener la solución del problema original. en la búsqueda de caminos mínimos sobre grafos.B. Ejemplo. Ejemplo: Sea el problema de la competición. continua aplicándose el mismo criterio para la segunda moneda mas valiosa. se buscara en la segunda mitad.

fiable y fácil de mantener. en cuyo caso no importa cual se elija. Corrección. la solución voraz siempre . Ello asegura que tanto algoritmos como programa resulten legibles y puedan modificarse fácilmente en caso de necesidad. Claridad. Los criterios de estilo pueden reflejarse en un conjunto de normas de estilo de codificación. sea el problema de encontrar un subconjunto de los arcos de un grafo. el problema incluye restricciones adicionales que limitan el número posible de soluciones. Se supone que un problema de esta clasetiene al menos una solución. la calidad de un algoritmo tiene muchas facetas y todas ellas importantes. La dificultad principal para resolver esta clase de problemas estriba en el análisis necesario para poder formular un algoritmo que halle la solución en varios pasos.. analizando durante cada etapa que elemento conviene añadir a la solución parcial ya existente. En particular. las siguientes respuestas reflejan. Nunca se debe olvidar que la característica más simple e importante de un algoritmo es que funcione. La eficiencia de un algoritmo se mide por los recursos que este consume. Resumiendo. etc.También influyen haciendo que nuestro algoritmo resulten más fáciles de leer y entender para otras personas. Es más frecuente que el subconjunto de la solución se vaya formando paso a paso. Pude aparecer obvio. y la normas sobre como y donde deben de introducirse los comentarios. 4. y de acuerdo con los puntos de vista anteriores. Ante la pregunta ¿Cuáles son las característica de un buen algoritmo?. 3. estos problemas no se intentan resolver "de golpe ". Normalmente. los factores que identifican la calidad en ellos . Eficiencia. se habla de la memoria y del tiempo de ejecución . claro. A menudo. Otro ejemplo se da cuando. Ciertos detalles o algunas partes especiales de los mismos pueden olvidarse fácilmente o quedar oscura si no están adecuadamente comentadas. 1. el algoritmo debe funcionar. el algoritmo debe estar bien documentación. estas normas de estilo se dirigen hacia aspectos como la forma de construir los nombres de variables o tipo de datos que aparezcan. lo ideal es que nuestro algoritmo resulte correcto. eficiente. 2. dados unos ficheros almacenados en una cinta de que el tiempo de recuperación de un fichero cualquiera sea el mínimo en promedio. En realidad. encontrando de una sola vez la solución completa y óptima. Por ejemplo. la tipografía seguida ala hora de escribir nombres de variables. no hay que desperdiciar estos recursos y tratar de desarrollar algoritmos más eficientes. Esta característica hace que aunque el análisis del problema sea arduo. palabras claves. El modo de encolumnar las distintas partes de un algoritmo para facilitar su lectura y comprensión. Estilo y calidad de los programas van fuertemente unidos. Un algoritmo voraz sigue el esquema anterior. Generalmente. cierta medida. pero resulta difícil de asegurar en algoritmos complejos. Puede haber varias soluciones optimas. subprogramas. pero con la fortuna de que cada vez que añade un elemento a la solución se tiene la certeza de haber realizado la mejor elección posible. el algoritmo no debe desaprovechar recursos. A pesar de que con la reducción de los costes del hardware es posible diseñar computadores más rápidos y con más memoria. La documentación ayuda a comprender el funcionamiento de los algoritmos. Algoritmos voraces Esquema voraz Hay muchos problemas en los que se pretende obtener un subconjunto de n elementos que satisfaga ciertas restricciones y que optimice alguna medida.

si dicho conjunto no es válido. Si este conjunto ampliado sigue siendo válido.. Por lo que se ha descrito del esquema voraz. Inicialmente. el problema parte de: y y Una función objetivo que da el valor de una solución. Al contrario.. si satisface las restricciones del problema y.n ) : ( 1. ( ) ) Puede verse por qué estos algoritmos se llaman " voraces " : en cada paso toman el mejor trozo de la solución. el mejor candidato.. es decir. se desecha el candidato. la dificultad principal al diseñar un algoritmo voraz reside en encontrar un criterio en encontrar un criterio de selección que garantice la optimalidad de la solución. Si el algoritmo voraz se ha diseñado correctamente. Solución : (1.. el conjunto de candidatos que forman la solución está vacío. es decir. la decisión.resulte sencilla. Obsérvese que las funciones de validez y completitud no se preocupan de la optimalidad del la solución. Para facilitar la descripción de este proceso.n) : (1. la solución consta de: y y y Un conjunto de candidatos Una función de selección que en cada momento determine que candidato de los aún no usados parece ser el mejor. La única complicación es comprobar que se siguen satisfaciendo las restricciones del problema.n).n) -> FUNCTION VorazAcumulador ( candidatos : (1. Podemos representar el esquema voraz de la siguiente forma funcional: FUNCTION Voraz ( candidatos: ( 1. debe recordarse que puede haber varios criterios alternativos de selección y que de su . Por tanto. solución v (siguiente)) VorazAcumulador (candidatos ± (siguiente). Obviamente. A su vez. el candidato se incorpora definitivamente. cada solución válida y completa es optima. si permite formar alguna solución del problema. La función objetivo no suele aparecer en el algoritmo final. es definitiva.n) -> Cadidatos = ( ) v EsSolución ( solución)-> Value siguiente -> seleccionar ( candidatos ) IN EsVálida (solución v ( siguiente)) => VorazAcumulador (candidatos ± (solución). solución) VorazAcumulador (candidatos. Según esta descripción. Una función que determine si cierto conjunto de candidatos es válido.. En cada paso se intenta añadir el mejor de los candidatos restantes a dicha solución parcial. Un conjunto de restricciones sobre el valor de los datos de entrada y sobre la solución final del problema. De todas formas. ésta es la función por optimizar. pero si la función de selección es la adecuada. por tanto. Además. es decir. la primera solución encontrada es óptima. nunca cambian de opinión: una vez que un candidato es aceptado o rechazado en la solución. sino que se utiliza durante el análisis del problema y es determinante en la elección de la función de selección. éste es un proceso repetitivo sencillo que trata sucesivamente los diferentes elementos del problema. puede llamarse candidato al elemento tratado en cada paso. permite formar una solución del problema.

Divide Y Vencerás La técnica divide y vencerás consiste en descomponer el problema en un conjunto de subproblemas más pequeños. Los elementos de la técnica voraz están presentes en este problema de la siguiente forma: y y y y y El conjunto de candidatos está constituido por cada una de las monedas de los diferentes tipos que se pueden usar para realizar el desglose del importe dado. se parte de un conjunto de tipos de monedas válidas. éste no será nunca excluido de él. Como fila primera se toma la secuencia de los índices de los participantes en cualquier orden. se considera el problema de un cambio o desglose en monedas. Además. Como ejercicio.correcta elección depende que la solución calculada por el algoritmo sea optima. tales que sumados sus valores equivalgan al importe. utilizar el menor número de monedas. Estos valores se definen por medio de un tipo enumerado MONEDAS. Su declaración es la siguiente: TYPE Monedas -> M500 I M100 I M50 I M25 I M5 I M1. cuando un candidato (moneda) se incorpora al conjunto solución. 25. 50. y cuyo valor total es igual al importe a desglosar. Hay que desglosar una cantidad en un conjunto de monedas tratando de cumplir alguna condición. es decir. la moneda de mayor valor de entre las candidatas. Valores -> Integer M500 M1 Cantidades -> Integer M500 . La condición de factibilidad de la solución siendo construida establece en el desglose debe ser menor o igual que el importe a desglosar.M1 Se supone inicialmente asignados los valores a cada uno de los tipos de monedas. este algoritmo tiene la ventaja de valer para las situaciones en que el número de participantes no es una potencia de dos. la tabla de competición se va completando por filas. el lector puede intentar encontrar una solución voraz del problema del calendario. Después se resuelven estos subproblemas y se combinan las soluciones para obtener la solución para el problema original. La función de selección establece que hay que elegir. y de un importe. Es fácil encontrar una solución si en cada etapa se genera el subcalendario correspondiente a un equipo. se declaran los tipos VALORES y CANTIDADES para representar el valor asignado a cada unidad monetaria y la cantidad de cada tipo de moneda que se devolverá en el desglose. Además. ¥ ¥ . Para simplificar. podemos utilizar sólo monedas de 500. Desglose en monedas Como primer ejemplo introductorio sencillo al que puede aplicarse la técnica voraz. Cada fila resultante puede tener una complejidad de o (n2). mientras sea posible. Se trata de indicar la cantidad (menor) de monedas de los tipos considerados. Asimismo. La función objetivo cosiste en minimizar la cantidad total de monedas utilizadas en el desglose. 100. en particular. Con esta información se puede comprobar que en este problema están presentes los distintos elementos de la técnica voraz. suponemos que manejamos dineroespañol y. de las que se supone que hay cantidad suficiente para realizar el desglose. en este caso. 5 y 1 pesetas para el desglose. Para ello. Una solución viene dad por un conjunto de monedas devuelto tras el desglose.

deben existir algunos pasos sencillos cuya solución pueda calcularse fácil y directamente. solución) . subsolucion2). IN inferior. olución) ELSE Medio := Partir (inferior.n. superior.. 1<k<=n. superior). Veamos el esquema de divide y vencerás para dos subproblemas.. es fácil su generalización a k subproblemas 2<k<=n. inferior. en caso contrario. DivideYVenceras (subproblema2)) Se puede hacer una formulación imperativa similar.N subsolucion1..N. resultado PROCEDURE DivideYVenceras (IN problema : dato1. Por supuesto. Combinar (subsolucion1. El caso más frecuente es cuando el número de subproblemas es dos. OUT solución : resultado) -> VAR medio: 1. Este esquema de partición de problemas se denomina esquema de divide y vencerás solo en el caso en que los problemas sean de la misma clase del problema original. N. superior. DyVAux (problema. medio. escribiremos una formulación más restrictiva pero bastante usual.. Sin embargo. solución) DyVAux (problema. dado un problema al resolver planteando en términos de una entrada de tamaño n. subsolucion2. La técnica de divide y vencerás es quizás una de las utilizadas debido a su sencillez: si un problema es demasiado grande para resolverlo de una vez. subsolucion2 : resultado IF EsPequeño (inferior. DyVAux (problema.Esquema de Divide y vencerás. Mas formalmente. superior : 1. subsolucion1). inferior. resultado FUNCTION DivideYVenceras (problema : dato) : resultado -> EsPequeño (problema) }=> ResolverDirectamente (problema) | VALUE subproblemas -> Partir (problema) IN subproblemas == (subproblema1. en la que se utiliza un vector de tamaño N. de tipo resultado: TYPEVAR Dato. TYPEVAR dato. el proceso recursivo nunca terminaría. subproblema2) => Combinar (DivideYVenceras (subproblema1) . Esta restricción permite una formulación y resolución recursiva de los subproblemas. la técnica de divide y vencerás parte la entrada en k subproblemas. Su formación funcional es como sigue. 1. OUT solución : resultado) -> PROCEDURE DyVAux (IN problema : dato1. Estos subproblemas se resuelven independientemente y después se combinan sus soluciones parciales para obtener la solución del problema original.n. medio+1. superior) THEN ResolverDirectamente (problema. considerado el problema como de tipo dato y la solución. se descompone en varias partes más fáciles de resolver.

se supone que el numero de participantes es una potencia de dos. Solo sirve como solución aquellas combinaciones de fila que cumplan las restricciones enunciadas en el párrafoanterior sobre las columnas de la tabla (las restricciones sobre las filas están garantizadas por el modo de generar los conjuntos P(i)). la columna j también contiene números distintos. resultan nx(n-1)!=n! formas de rellenar la tabla. Por tanto.j)±esimo de la tabla. Primero se obtiene para cada participante i. 1<=j<n. g(n) es el tiempo que tarda la función ResolverDirectamente en resolver problemas de pequeño tamaño (normalmente una constante) y f(n) es el tiempo necesario para partir el problema y combinar las subsoluciones. la solución del problema puede representarse en una tabla de dimensión nx(n-1). 1<=i<=n. es general. Se dispone de una solución inmediata aplicando fuerza bruta..n}-{i} ahora se completan las filas de la tabla de todas las formas posibles. incluyendo en cada fila i algún ejemplo de P(i). puede suponerse que las competiciones se celebran en días sucesivos y que cada participante compite una vez por día. Elaboración de un Calendario Deportivo: Sea un campeonato deportivo. Si el tamaño de los dos subproblemas es el mismo (o casi). 1<= i<=n. Se supone también que cada participante tiene asignado un número comprendido entre 1 y N. La eficiencia final del algoritmo depende de la función f(n) concreta que aparezca durante el análisis. Partir y Combinar por funciones o procedimientos concretos. Se necesitan elaborar n-1 competiciones por participantes. pero es terriblemente ineficiente. hay n = 2k participantes para algún entero positivo k. contiene el numero del participante contra el que el participante i-esimo compite el día j-esimo. para que esta técnica resulte eficiente todos los subproblemas deben ser de tamaño parecido. Sin embargo la aplicación de la técnica de divide y vencerás produce una solución mas sencillas aun pero muy eficientes. se elige uno cualquiera. A su vez. así que hablaremos de participantes en vez de deportistas o equipos. Cada conjunto P(i) consta de (n-1)! Elementos. Por concreción. el tiempo de cómputo de la función DivideYVecneras se describe con la siguiente relación de recurrencia: g(n). La siguiente figura describe visualmente parte de la elaboración de la tabla. porque el día j-esimo cada participante solo puede competir con otro participante. El método de fuerza bruta resulta sencillo.El esquema general se adapta a un problema concreto al sustituir los metasimbolos EsPequeño. el conjunto P(i) de todas las permutaciones posibles del resto de los participantes con los que debe competir. El problema consiste en elaborar un calendario de competición de forma que cada participante compita exactamente una vez con cada uno de los demás participantes. para nuestros propósitos resulta indiferente el deporteobjeto de la competición. El elemento (i. es decir. Dado que el numero de participantes de n. Para simplificar el problema. y sin perdida de generalidad. Nótese que. Obsérvese que los números de participantes incluidos en la fila i de la tabla son distintos porque el participante i-esimo solo debe competir una vez con cada participante restante. Si hay varios calendarios validos. ResolverDirectamente. es decir.si n es pequeño T(n) = 2 T(n/2) + f(n). en caso contrario donde T(n) es la función de tiempo de DivideYVenceras para entradas de tamaño n. días . el conjunto de permutaciones de los números {1.

sucesivamente con los participantes 2k-1 +1. por ejemplo. El calendario de los participantes de numeración superior se completa de forma similar con los números de los participantes de numeración inferior. faltan por elaborar las competiciones cruzadas entre los participantes de numeración inferior y los de numeración superior. el resto del calendario se puede construir fácilmente..N-1) -> PROCEDURE FormaTabla (IN inf : 1. La solución es directa porque se celebra una sola competición entre ambos. El caso recursivo. ya que a unión de los dos calendarios tiene un tamaño 2k x(2k-1 -1).N-1) -> VAR ¦ . Por fortuna. El problema puede reducirse a dos sub problemas de tamaño 2k-1 si se elaboran independientemente dos subcalendarios de tamaño 2k x(2k-1 -1): uno para los participantes. Si el numero de participantes es 2k .N.N. para k>1.N.1 participantes 1 2 2 1 1 2 3 1 2 3 4 2 1 4 3 3 4 1 2 4 3 2 1 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 2 1 4 3 8 5 6 7 3 4 1 2 7 8 5 6 4 3 2 1 6 7 8 5 5 6 7 8 1 2 3 4 6 5 8 7 4 1 2 3 7 8 5 6 3 4 1 2 8 7 6 5 2 3 4 1 Se distinguen dos casos.. .2n .1.. de numeración comprendida entre 1 y 2k-1 y otro para los participantes comprendidos entre 2k-1 +1 y 2k ..N.. superior en orden creciente de numeración. El siguiente participante toma esta secuencia y realiza una fácil permutación de la misma que le garantiza el respeto de las restricciones de la solución. El algoritmo descrito se expresa a continuación. PROCEDURE Calendario ( INOUT tabla : (1. rotando dicha secuencia a la derecha. puede decirse que el "tamaño" del problema es 2k (sabemos que el calendario tendrá un tamaño de 2k x(2k-1 -1) posiciones). El caso básico se da cuando solo hay dos participantes. Este proceso se repite para el resto de los participantes de numeración inferior. la unión de estos subcalendarios no forma un calendario completo para el campeonato de 2k participantes.. Sin embargo.. El subcalendario del primer participante es sencillo porque basta con que compita en días sucesivos con los participantes de numeración. Completemos primero la parte de los participantes de numeración inferior. IN sup :1. es más complejo. faltando 2k x2k-1 celdas para completar el calendario total.. OUT tabla : (1. es decir.1.N) 1.. cuando hay más de dos participantes.N)1. En efecto.

medio. sup). inf. OrdenarAux (vector. basta con mezclar los dos subvectores. Veamos otra estrategia. mediante comparaciones de sus elementos sucesivos. que es mucho mas eficiente que la solución de fuerza bruta. CompletarTabla (medio+1. la combinación de los dos subvectores ya ordenados es fácil. que obviamente ya esta ordenado. es decir. medio. La partición puede hacerse por la mitad si se toma un índice m=[(i+s)/2] y dos subvectores vi. también de orden de complejidad cuadrática. OrdenarAux (vector. tabla) Este sistema de ecuacionesdefina una función de tiempo del orden de O(n2). FormarTabla (inf. de acuerdo con las siguientes expresiones de los índices: i = (k + n/2) Mod (n+1) j = (1 + n/2) Mod n De esta forma se rellenan las casillas aun vacías. Ordenación de un Vector por Mezcla: La ordenación de un vector es un problema que se presta fácilmente a la aplicación de la técnica de divide y vencerás.N.. N) . Este proceso de mezcla es realizado por un procedimiento auxiliar..1.N IF inf = sup-1 THEN tablainf. que almacena los índices de las filas. sup-1. En esta última etapa. tabla). Finalmente se completa la mitad derecha de la tabla (correspondiente al cruce de los dos grupos de equipos cuyos subcalendarios se han generado por divide y vencerás).l). sup... medio. La idea consiste en añadir inicialmente a la tabla una columna "ficticia" de índice j=0. medio.. sup.m y vm+1. mediante divide y vencerás.medio : 1. El caso básico corresponde a un subvector de un solo elemento. Para el caso general. inf. inf.. medio+1.N. medio+1. El algoritmo resultante es: PROCEDURE Ordenar (INOUT v : INTEGER1. 1. Mezclar (vector. para obtener un único vector ordenado.N) -> VAR Medio : 1. siendo 1<=k<=n y 0<=l<=(n/2)-1.j a partir de las casillas tablak. tabla). sea vi. tabla).. CompletarTabla (inf. sup) OrdenarAux (v. medio). sup : 1.sup-1. FormarTabla (medio+1.s .l ya completadas. los valores de las casillas (k. Después se genera.1 := inf ELSE medio := (inf + sup) Div 2. tablasup. IN inf. medio... la mitad izquierda de la tabla.s un vector de índice inferior i e índice superior s.N) -> (* ordenación por mezcla *) PROCEDURE OrdenarAux (INOUT Vector : INTEGER1. donde se aplica divide y vencerás para resolver el problema y que se aprovecha de la simetría de la solución.1 : = sup. los componentes tablai.N IF inf < sup THEN medio := (inf+sup) Div 2.

b=cte Si n es una potencia de 2.El procedimiento para realizar la mezcla de los subvectores ordenados es: PROCEDURE Mezclar ( IN inf : INTEGER. de dimensión nxn.j)-esimo se forma multiplicando cada elemento de la final i-esima de A por el elemento correspondiente de la columna j-esima de B y sumando los productos § .N. J := j + 1 FOR índice IN i2. i2 := medio + 1. INOUT vector : INTEGER1. IN medio: INTEGER.medio DO vectorAuxj := vectorindice. j : INTEGER.sup DO vectorindice := vectorAuxindice El algoritmo resultante es sencillo conceptualmente. Multiplicación de Matrices: Sean dos matrices.. n =2k para algún k. j := inf. Los únicos inconvenientes que presenta es que el procedimiento de mezcla necesita gran capacidad de almacenamiento (para dos copias del vector) y que. La operación de mezcla es proporcional a n. La matriz productoC=AxB también es una matriz de nxn cuyo elemento (i.= vectori2. i1.. índice : INTEGER i1 := inf. de forma que las ecuaciones de recurrencia de la función de tiempo son: T(n) = a... Es fácil analizar la complejidad del algoritmo para un vector de longitud n.. n=1. IN sup : INTEGER. a=cte 2T(n/2) + bn. i2 := i2 + 1 j := j + FOR índice IN i1. n>1.sup DO vectorAuxj := vectorindice . pero mantenga la complejidad asintótica calculada.N) -> VAR vectorAux : INTEGER1. i2. necesita copiar el vector auxiliar completo en el principal. las ecuaciones anteriores se resuelven por sustituciones sucesivas. i1 :=i1 + 1 ELSE vectorAuxj . J := j + 1 FOR índice In inf. Puede diseñarse un algoritmo de mezcla más complejo que mejore ambos aspectos. resultando: T(n) = 2T(n/2) + bn= =2K T(n/2K) + kbn = an + bn log2 n El algoritmo de ordenación por mezcla es óptimo en tiempo de ejecución. es decir. además de mezclar. WHILE (i1<=medio) ^ (i2<=sup) DO IF vectori1 << vectori2 THEN vectorAuxj :=vectori1. A y B.

que n es una potencia de dos. Dos submatrices de (n/2)x(n/2) pueden sumarse en un tiempo bn2. pero para n>2 las submatrices Cij se calculan mediante multiplicaciones (recursivas) y sumas de submatrices de dimensión (n/2)x(n/2). proviene directamente de la definición matemática del producto de matrices.) las submatrices A y B pueden partirse en cuatro submatrices de dimensión (n/2)x(n/2). La programación dinámica (también llamada planificación dinámica) es una técnica de programación que también permite resolver problemas mediante una secuencia de decisiones. los elementos Cij se calculan mediante algunas multiplicaciones y sumas de números. El algoritmo de Strassen calcula las cuatro submatrices Cij empleando 7 multiplicaciones y 18 sumas o restas de matrices. pueden añadirse las filas y columnas de ceros necesarias para formar una dimensión que sea potencia de dos. la técnica de divide y vencerás sugiere un algoritmo distinto. Si el producto AxB tiene la forma: A11 A12 B11 B12 C11 C12 A21 A22 B21 B22 C21 C22 Entonces: C11 = A11*B11 + A12*B21 C12 = A11*B12 + A12*B22 C21 = A21*B11 + A22*B21 C22 = A21*B12 + A22*B22 Para n=2. que podemos llamar algoritmo convencional de multiplicación de matrices. La resolución de este sistema de ecuaciones nos dice que O(T(n))=OT(n3). La existencia de un algoritmo eficiente para la multiplicación (en realidad. La matriz C tiene n2 elementos. El método es eficiente porque una vez que se toma una decisión en un paso. (Si n no es un potencia de dos. asegurando que la secuencia de decisiones es la mejor de las posibles. dado que la complejidad respectiva de estas operaciones es O(n3)n y o(n2). no se reconsidera en el futuro. Sin embargo. conduciendo de forma directa a la solución. No es fácil establecer una definición de la programación dinámica. que existe un entero no negativo k tal que n=2k. para cualquier operación de las anteriores) significaría la existencia de un algoritmo similar para las demás. Supongamos. aunque fuera a costa de un mayor numero de sumas de matrices. Solamente al final se sabe cuál es la mejor de todas. porque la multiplicación esta relacionada con otras operaciones sobre matrices mas usuales. Programación Dinámica Principios de programación dinámica Se ha visto que la técnica voraz se aplica a problemas cuya solución puede formularse como el resultado de una secuencia de decisiones. no todos los problemas pueden resolverse de esta manera. una característica es que el programa "aprende "dinámicamente de las decisiones que toma. por sencillez. así que el tiempo total del algoritmo de multiplicación es de orden O(n3). todo problema resoluble con esta técnica debe de satisfacer el principio de optimalidad. de forma que no se ha conseguido ningún ahorro sustancial de tiempo. siendo b alguna constante. interesa encontrar algoritmos mas eficientes. Además. Sin embargo. El cálculo de cada elemento Cij requiere n multiplicaciones. Este principio establece que "una secuencia óptima de decisiones que resuelve un problema debe cumplir la . es decir.parciales. El algoritmo anterior. pero de una manera menos directa que en el caso voraz. como inversión de una matriz o hallar su determinante. Esta vez se necesita producir varias secuencias de decisiones. Sin embargo. Podría conseguirse mas eficiencia si lográramos realizar menos multiplicaciones de matrices.

Podemos formalizar algo más la idea básica. La ecuación de recurrencia puede formularse de dos formas: delantera o trasera. El razonamiento anterior se refiere a la primera decisión d1 tomada desde el estado inicial E0 sin embargo.. puede generalizarse la formulación del problema a cualquier subsecuencia de decisiones dk . que es problema ( n..1 ) debe expresarse en términos de los valores de decisión existente para decisiones d1 y el subproblema problema ( k+1.n ). evitándose una explosión combinatoria en la producción de las secuencias y consiguiéndose soluciones más eficientes en cuanto a tiempo de ejecución. Entonces. el número de secuencias de decisión es exponencial sobre el número de decisiones.n ). ( Obsérvese que vamos a usar la técnica de resolución de problemas por generalización para después poder realizar una particularización de la solución obtenida.vn} el conjunto de valores de decisión posibles para la decisión d1.Xn la secuencia de decisiones necesaria para resolver el problema. partiendo como estado inicial de Ek-1. a tomar.) Una solución dinámica para problema ( k. tal que Eo es el estado inicial del problema y deben tomarse n decisiones d. La expresión inicial de la ecuación de recurrencia. Eli el estado del problema tras la elección del valor vli 1<i<n1 y Sli una secuencia óptima de decisiones respecto al estao Eli.1 ) resultante de aplicar cada valor de decisión. además. entonces el problema completo es problema ( l.. del gusto del programador. 1<k<n. La elección de una formulación delantera o trasera depende del problema considerado o. porque si hay d opciones para cada una de las n decisiones. a partir de la recurrentes con formulación trasera es igual que e la formulación delantera. Además. 1<i<n. La formulación trasera expresa la decisión de Xi.dl. hay un caso en que la decisión d1 no va seguida por ninguna secuencia de decisiones. En la programación dinámica todos los subproblemas se resuelven de acuerdo con criterio de tamaño creciente y los resultados de subproblemas más pequeños se almacenan en algún tipo de estructura de datos (normalmente tablas) para facilitar la solución de los problemas más grandes. Tiene sentido centrarse en un subproblema del problema inicial porque éste satisface el principio de optimalidad pero. Sea X1 . 1<i<n . si este subproblema de simboliza como problema (k. Algoritmos De Vuelta Atrás Existen un alto número de problemas que pueden formularse como la búsqueda de la mejor solución o del conjunto de todas las soluciones que satisfacen ciertas condiciones. asimismo. La formulación delantera expresa la decisión de Xl . la ecuación de base establece el valor para la etapa n+1 en que no queda ninguna decisión Xi. 1<i<n. tiene la ventaja ( quizás paradójica al tratar de un problema más pequeño ) de que proporciona una visión más general del problema en cuestión. Sea D = { v1 . sea. una secuencia óptima de decisiones respecto a E0 es la mejor secuencias de decisión { Vli Sli }.l). a partir de la secuencia de decisiones Xi+1 Xn ( es la clase de formulación adoptada hasta ahora ).propiedad de que cualquier subsecuencia de decisiones también debe ser óptima respecto al subproblema que resuelva ". resultará un total de d secuencias posibles de decisión. sólo que en orden contrario. 1<i<N1. En resumen. La ecuación general relaciona la secuencia óptima en una etapa i con la decisión tomada en la etapa i y la subsecuencia óptima en la etapa posterior i+1. Usando una técnica de fuerza bruta. 1<i<n. ¨ ¨¨ ¨ ¨ .. sencillamente. De esta forma se reduce al número total de subsecuencias generadas. la aplicación de la técnica de programación dinámica a un problema significa comprobar primero el principio de optimalidad y desarrollar después unas ecuaciones recurrentes del estilo de (1) y (2). Supongamos que tenemos un problema que satisface el principio de optimalidad.

... solucion) La llamada inicial del algoritmo es Retroceso(1. k) THEN IF R(solucion.. Sin embargo. Retroceso (k+1.. La técnica de ramificación y acotacotacion aplica de la siguiente manera: Supóngase que al recorrer un árbol y alcanza una hoja se tiene una solucion con k colores.. El procedimiento no hace ninguna llamada recursiva cuando k = N+1 o cuando ningún nodo generado por G satisface el elemento posible que satisfacen A se añade una solución particular...xi+1) no puede extenderse para alcanzar un nodo de respuesta..cada solución es el resultado de una secuencia de decisiones. Así. solucion). Se sale del bucle FOR cuando no quedan mas valores para solución terminando la llamada actual al algoritmo. se comprueba si se ha encontrado una solucion.n) -> VAR nodo : elemento FOR noso IN G(solucion... Después simplemente se llama recursivamente al algoritmo para generar los estados descendientes. En algunos problemas de optimización se conoce un criterio óptimo de selección que puede usarse de forma voraz.. Supongamos que también existe algún predicado R que determina si un camino (x1. . Por supuesto. k-1) DO Solucion k := nodo.. En este punto podemos retroceder (y no seguir avanzando por mas ramas).k) THEN << guardar µsolucion¶ >>. Algoritmos Heuristicos Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos. 1.xi) el camino desde la raíz hasta un nodo de un árbol del espacio de estado..xi+1) termina en un nodo de respuesta. Este mismo proceso se repite en el resto de nodos del árbol. pudiéndose aplicar la técnica de programación dinámica.. Supongamos que existe algún predicado acotador A tal que A(x1. pues tenemos ya una solucion mayor.xi) el conjunto de todos los valores posibles de xi+1 tales que (x1.n son aquellos valores generados por G que satisfacen A. y que al seguir avanzando en el árbol (mediante la aplicación de varios pasos de retrocesos) se alcanza un nodo que requiere k+1 colores. IF R(solucion... INOUT solucion : elemento1. Sea G(x1. Esquema de Algoritmos de Vuelta Atrás: Sea (x1..xi+1) es un camino hasta el estado del problema. Ramificación (Bifurcacion) Y Acotación Los métodos de Ramificación y Acotación constituyen un a variante de las técnicas de retroceso para problemas donde se trata de encontrar el valor máximo o mínimo de cierta función objeto (esto suele suceder en los problemas de programación lineal entera). los candidatos para la posición i+1 del vector desolucion x1. El Algoritmo de Vuelta Atrás se especifica de la forma siguiente: PROCEDURE Retroceso (IN k : INTEGER.. todavía hay otros problemas peores que no queda mas remedio que realizar una búsqueda de la solución. debe existir una función de criterios que debe ser satisfecha por cada secuencia solución u optimizada por dichas secuencias solución si solo queremos la mejor... 1.. Por lo tanto.. Otros problemas satisfacen el principio de optimalidad..xi+1) es falso si el camino (xi. 1.. evitando así la exploración de gran parte de al estructura. k sirve de cota inferior al retroceso.

. 2). 3). sin importar el orden. (1.. . . Posibilidades: 1. Hacer igual que en el algoritmo de Kruskal. Selección: seleccionar la arista candidata de menor coste. 2. 2. Inicialización: seleccionar un nodo cualquiera. 3. Problema de optimización... ‡Ejemplo. Factible: una arista se puede añadir a la solución actual si no se forma un ciclo (excepto para la última arista añadida) y si los nodos unidos no tienen grado mayor que 2. 3. c2. Solución: ((2.. Empezar con un grafo sin aristas. encontrar un ciclo simple de costo mínimo que pase por todos los nodos.. A). cn). 2) Coste: 30+15+25+10+45=125 Empezando en el nodo 3. Ejemplo.La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria. donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz. 5)) Coste = 10+15+20+45+50 = 140 . La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces. Las aristas son los candidatos. se basa en un conocimiento intuitivo del programador sobre un determinado problema. En cada paso moverse al nodo no visitado más próximo al último nodo seleccionado. an-1) que formen un ciclo hamiltoniano. Función de selección: de los nodos candidatos seleccionar el más próximo al último (o al primero) de la secuencia actual (c1.. Empezar en un nodo cualquiera. (1. Heurística voraz 1 ± Una solución será un cierto orden en el conjunto de nodos (c1. Solución: (5. Acabamos cuando tengamos n nodos. pero garantizando que se forme un ciclo. Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. Empezando en el nodo 1. completo y ponderado G = (V.. ca). 5).. El problema del viajante Problema: Dado un grafo no dirigido. a2. c2. Normalmente. Solución: (1. Se hace necesario utilizar algoritmos heurísticos: Un algoritmo heurístico (o simplemente heurística) puede producir una buena solución (puede que la óptima) pero también puede que no produzca ninguna solución o dar una solución no muy buena. Es un problema NP. 4. 4). 1) Coste: 15+20+10+45+50=140 Heurística voraz 2 ± Una solución será un conjunto de aristas (a1. pero necesitamos una solución eficiente. Los nodos son los candidatos. (4. el orden de visita de los nodos. (3.. 4. 5.

próximas a la óptima. es probable que no sepamos resolverlo de manera precisa y completa utilizando un algoritmo polimico en tiempo. normalmente ambos dan soluciones buenas. Para este tipo de problemas. ó bien. Sin embargo.Conclusiones: Ninguno de los dos algoritmos garantiza una solución óptima. seria necesario demostrar que el conjunto de todos los vértices inciden a las aristas de un ajuste maximal M para un grafo G es un recubrimiento con no mas de dos veces el numero de veces el recubrimiento de tamaño mínimo. En consecuencia. Esto es evidente. a partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución. los vértices incidentes a las aristas de M son un recubrimiento de G. se trata de encontrar un conjunto con el menor numero de vértices tal que toda arista sea incidente por lo menos de un vértice de V. Este problema se puede resolver a través de otro aproximado. también por la propia definición.A). Para poder aplicar el nuevo problema aproximado. repetir la heurística 1 con varios orígenes. Posibles mejoras: buscar heurísticas mejores. de una en una y en cualquier orden e ir eliminando las incidentes al conjunto que se esta construyendo hasta recubrir todo en grafo. los algoritmos que no conducen a una solución óptima se llaman algoritmos de aproximación. Algoritmos De Aproximación Dado un problema NP completo. . como es calcular el ajuste maximizal del grafo G. Este nuevo problema garantiza conseguir un recubrimiento que contiene no más de dos vértices del recubrimiento mínimo. Sin embargo. ningún vértice perteneciente a M puede recubrir a mas de una arista en M. por lo menos la mitad de los vértices de M deben pertenecer a un recubrimiento. ya que por la definición de ajuste maximal. El procedimiento para construir un ajuste maximizal de un grafo G consistiría en ir tomando aristas de G. Se trata de calcular un subconjunto A¶ de aristas tal que dos aristas cualquiera de A¶ no tengan ningún vértice común y toda arista de A-A¶ comparta algún vértice común con una arista de A¶. resulta parcialmente interesante que estos garanticen una cota en el margen de imprecisión. A continuación se ilustra este tipo de tratamiento de problemas al problema de recubrimiento de un grafico: Dado un grafo G=(V.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->