Algoritmo Fuerza Bruta: C a r a c t e r ís t i c a s Es el algoritmo más simple posible. Consiste en probar todas las posibles posiciones del patrón en el texto. Requiere espacio constante. Realiza siempre saltos de un carácter. Compara de izquierda a derecha. Realiza la búsqueda del patrón en un tiempo O(mn). Realiza 2n comparaciones previstas de los caracteres del texto. Lógica Se sitúa el patrón en la primera posición, y se compara carácter a carácter hasta encontrar un fallo o llegar al final del patrón. Se pasa a la siguiente posición y se repite el proceso. El proceso finaliza al alcanzar el final del texto No existe un preprocesamiento del patrón. Descripción No requiere ninguna fase de preproceso previo, ni un espacio extra constante además del espacio asignado al patrón y al texto. Para la búsqueda: Consiste en la comparación de todas las posiciones del texto entre 0 y el nm, si una ocurrencia del patrón corresponde o no. Si encuentra una no ocurrencia, o una ocurrencia total del patrón, salta un carácter hacia la derecha. Ejemplo Se alinea la primera posición del patrón con la primera posición del texto, y se comparan los caracteres uno a uno hasta que se acabe el patrón, esto es, se encontró una ocurrencia del patrón en el texto, o hasta que se encuentre una discrepancia. en cada paso. una función de selección que escoge el candidato aún no seleccionado que es más prometedor. etc). En caso contrario. Para resolver el problema de optimización hay que encontrar un conjunto de candidatos que optimiza la función objetivo. una función que detemina si un conjunto de candidatos es una solución al problema (aunque no tiene por qué ser la óptima). vértices del grafo. y . en cada paso. el algoritmo escoge el mejor "pedazo" que es capaz de "comer" sin preocuparse del futuro. etc) y que es la que se pretende maximizar o minimizar. Se emplean sobre todo para resolver problemas de optimización. la longitud del camino. Inicialmente el conjunto de candidatos es vacío. se incorpora al conjunto de candidatos escogidos y permanece siempre en él. Habitualmente. una función que determina si un conjunto es completable. se intenta añadir al conjunto el mejor candidato de los aún no escogidos. Un algoritmo voraz es correcto si la solución así encontrada es siempre óptima. un conjunto de decisiones ya tomadas (candidatos ya escogidos).Algoritmos Voráces o Avidos: Los algoritmos voraces suelen ser bastante simples. hallar el camino mínimo de un grafo. si añadiendo a este conjunto nuevos candidatos es posible alcanzar una solución al problema. utilizando la función de selección. suponiendo que esta exista. A continuación. se rechaza el candidato y no se le vuelve a considerar en el futuro. es decir. encontrar la secuencia óptima para procesar un conjunto de tareas por un computador. los elementos que intervienen son: un conjunto o lista de candidatos (tareas a procesar. Los algoritmos voraces proceden por pasos. etc. como por ejemplo. Nunca deshace una decisión ya tomada: una vez incorporado un candidato a la solución permanece ahí hasta el final. El esquema genérico del algoritmo voraz es: funcion voraz(C:conjunto):conjunto { C es el conjunto de todos los candidatos } S <= vacio { S es el conjunto en el que se construye la solucion} mientras ¬solucion(S) y C <> vaciohacer x <= el elemento de C que maximiza seleccionar(x) C <= C \ {x} si completable(S U {x}) entonces S <= S U {x} si solucion(S) entonces devolver S si no devolver no hay solucion El nombre voraz proviene de que. Si el conjunto resultante no es completable. una función objetivo que da el valor/coste de una solución (tiempo total del proceso. Tras cada incorporación se comprueba si el conjunto resultante es una solución del problema. Esta es la forma en que se trabaja en el desarrollo de los procesadores modernos. función objetivo: número de monedas utilizadas en la solución.cada vez que un candidato es rechazado. Algoritmos Paralelos: Los algoritmos paralelos son importantes porque es más rápido tratar grandes tareas de computación mediante la paralelización que mediante técnicas secuenciales. Esto es interesante por ejemplo en casos en los que es muy costoso elegir la alternativa más adecuada. funcion de seleccion: la moneda de mayor valor en el conjunto de cnadidatos aún no considerados. completable: la suma de las monedas escogidas en un momento dado no supera la cantidad a pagar. solucion: conjunto de monedas cuya suma es la cantidad a pagar. Los elementos del esquema anterior se convierten en: candidato: conjunto finito de monedas de. con una moneda de cada tipo por lo menos. El interés radica en que el algoritmo probabilista funcione mejor que el determinista en promedio. 5. esta se elige basándose en el azar. .Por tanto el mismo algoritmo puede comportarse de forma distinta aplicado a los mismos datos. logrando así la ejecución de varios flujos de instrucciones dentro del procesador. por ejemplo. a costa de no dar la respuesta correcta el 100% de las ejecuciones. Por todo esto. El algoritmo probabilistico se ejecuta más eficientemente en tiempo y/o memoria. lo es para siempre. Algoritmos Probabilísticos: Son aquellos en los que en algún punto del algoritmo donde hay que tomar una decisión. Ejemplo: Se desea pagar una cantidad de dinero a un cliente enmpleando el menor número posible de monedas. los algoritmos paralelos puedes llegar a un punto de saturación (ver Ley de Amdahl). 1. 10 y 25 unidades. añadir más unidades de procesamiento puede sólo incrementar el coste y la disipación de calor. Pero hay que ser cauto con la excesiva paralelización de los algoritmos ya que cada algoritmo paralelo tiene una parte secuencial y debido a esto. a partir de cierto nivel de paralelismo. ya que es más difícil incrementar la capacidad de procesamiento con un único procesador que aumentar su capacidad de cómputo mediante la inclusión de unidades en paralelo. y no hay un método sistemático de generalización. El nombre decrementa y vencerás ha sido propuesta para la subclase simple de problemas. El nombre divide y vencerás también se aplica a veces a algoritmos que reducen cada problema a un único subproblema. en particular. El método está basado en la resolución recursiva de un problema dividiéndolo en dos o más subproblemas de igual tipo o similar. Algoritmo Divide y vencerás: Hace referencia a un refrán que implica resolver un problema difícil. entre muchos otros). En las ciencias de la computación. La solución del problema principal se construye con las soluciones encontradas. multiplicar números grandes (Karatsuba). mergesort. Bajo esta amplia definición. el algoritmo de bisección para búsqueda de raíces). Al igual que en la inducción. cada algoritmo que usa recursión o bucles puede ser tomado como un algoritmo de “divide y vencerás”. análisis sintácticos (análisis sintáctico top-down) y la transformada discreta de Fourier. algoritmos de ordenamiento (quicksort. las soluciones a cada uno de los subproblemas se combinan para dar una solución al problema original. No se puede saber de antemano cuál será el resultado de la ejecución de un algoritmo no determinístico. dividiéndolo en partes más simples tantas veces como sea necesario. como la búsqueda binaria para encontrar un elemento en una lista ordenada (o su equivalente en computación numérica. En un algoritmo las condiciones del problema suelen ser los datos de entrada Algoritmos NO Determinísticos: un algoritmo no determinístico es un algoritmo que con la misma entrada ofrece muchos posibles resultados. a veces es necesario sustituir el problema original por uno más complejo para conseguir realizar la recursión. Por otra parte. Estos algoritmos pueden ser implementados más eficientemente que los algoritmos generales de “divide y vencerás”. hasta que la resolución de las partes se torna obvia. analizar y diseñar algoritmos de DyV son tareas que lleva tiempo dominar. Al final.Algoritmos Determinísticos: Son aquellos que bajo las mismas condiciones producen la misma salida. Esta técnica es la base de los algoritmos eficientes para casi cualquier tipo de problema como. por ejemplo. si es usando una serie de recursiones que lo convierten en simples bucles. El proceso continúa hasta que éstos llegan a ser lo suficientemente sencillos como para que se resuelvan directamente. el término divide y vencerás (DYV) hace referencia a uno de los más importantes paradigmas de diseño algorítmico. sin embargo. . en varios órdenes de magnitud. Frente a los supercomputadores paralelos comerciales. a su partir de redes de estaciones de trabajo ordinarias. El principal inconveniente. heuriskein. por ejemplo en resolución de ecuaciones booleanas. Esto hace que la solución exacta no pueda ser obtenida en ocasiones en un tiempo razonable. Por otra parte. aunque a veces los niveles alcanzados siguen sin ser suficientemente válidos. lo que genéricamente se denomina como cluster. estos procedimientos son heurísticos. El nombre combina el prefijo griego "meta" ("más allá". "encontrar"). La mayoría de las metaheurísticas tienen como objetivo los problemas de optimización combinatoria. utilizando el paso de mensajes como paradigma de programación. es su alto coste computacional. se pueden aplicar a cualquier problema que se pueda reformular en términos heurísticos. De este modo. en las últimas décadas y coincidiendo con el desarrollo de los sistemas de computación (software y hardware) se han venido desarrollando diversas técnicas que permiten una considerble reducción de la complejidad computacional. pero por supuesto. de manera que la solución se obtenga en un tiempo mucho menor. hoy en día es posible implementar computadores paralelos virtuales. que sean de utilidad en el campo de control de procesos .Algoritmos Metaheurísticos: Se usan para resolver un tipo de problema computacional general. compartido con todas las técnicas de optimización de tipo combinatorio. en problemas que aceptan este tipo de heurísticas crudas. Normalmente. usando los parámetros dados por el usuario sobre unos procedimientos genéricos y abstractos de una manera que se espera eficiente. Si bien hace pocos años los computadores paralelos eran enormemente costosos. Así es posible obtener sistemas de muy alto rendimiento a bajo costo. los algoritmos de Programación Dinámica pueden ser reformulados para su ejecución en un computador paralelo. los clusters hacen uso del sistema operativo Linux y de herramientas de programación que siguen la filosofía del software libre. Las metaheurísticas generalmente se aplican a problemas que no tienen un algoritmo o heurística específica que dé una solución satisfactoria. Las metaheurísticas no son la panacea y suelen ser menos eficientes que las heurísticas específicas. o bien cuando no es posible implementar ese método óptimo. todo el software y la documentación necesarios para montar. Algoritmos de Programación Dinámica: La Programación Dinámica es una potente herramienta que permite la resolución de una amplia familia de problemas de optimización dentro de la teoría del control. configurar y mantener el cluster se encuentran disponibles de manera libre y gratuita en Intenet. a un coste aceptable y fácilmente escalables. Por este motivo. aquí con el sentido de "nivel superior") y "heurístico" (de ευρισκειν. En esta Tesis se desarrollan algoritmos paralelos de Programación Dinámica generales para clusters. Branch and Bound) se aplica mayoritariamente para resolver cuestiones o problemas de optimización. el recorrido no tiene éxito si en alguna etapa la solución parcial construida hasta el momento no se puede completar.k+1) Algoritmos de Vuelta atrás: En su forma básica. El objetivo del recorrido es encontrar soluciones para algún problema. el recorrido vuelve atrás exactamente igual que en un recorrido en profundidad. La característica de esta técnica con respecto a otras anteriores (y a la que debe su nombre) es que el algoritmo se encarga de detectar en qué ramificación las soluciones dadas ya no están siendo óptimas.k) y G(x. Por otra parte. En tal caso. Cuando vuelve a un nodo que tiene uno o más vecinos sin explorar. o por lo menos no contiene ciclos. El grafo en cuestión suele ser un árbol. Sea cual sea su estructura. prosigue el recorrido de una solución. El recorrido tiene éxito si.k) mientras ( no vacio(P) ) x(k) = extraer(P) if esFactible(x. se puede definir por completo una solución. la idea de backtracking se asemeja a un recorrido en profundidad dentro de un grafo dirigido. En este caso el algoritmo puede bien detenerse (si lo único que se necesita es una solución del problema) o bien seguir buscando soluciones alternativas (si deseamos examinarlas todas). procediendo de esta forma. La técnica de Ramificación y poda se suele interpretar como un árbol de soluciones. existe sólo implícitamente. para «podar» esa rama del árbol y no continuar malgastando recursos y procesos en casos que se alejan de la solución óptima. El término (del inglés.k) < optimo si esSolucion(x) Almacenar(x) else RyP(x. eliminando sobre la marcha los elementos que se hubieran añadido en cada fase.Algoritmos Ramificación y Acotación: El método de diseño de algoritmos Ramificación y poda (también llamado Ramificación y Acotación) es una variante del Backtracking mejorado sustancialmente. Esto se consigue construyendo soluciones parciales a medida que progresa el recorrido. El pseudocódigo del algoritmo de Ramificación y poda es el siguiente: Funcion RyP { P = Hijos(x. . donde cada rama nos lleva a una posible solución posterior a la actual. estas soluciones parciales limitan las regiones en las que se puede encontrar una solución completa. i ]: TSolución. la toma de una decisión). L Resto (L) Backtracking (X.. Cada arco del grafo representa la transición entre dos estados de la solución (i. En cada momento sólo tenemos en una estructura los nodos que van desde el estado inicial al estado actual.Algoritmo de Backtracking proc Backtracking (↕X[1 .e. por lo que no existirá de manera explícita. el grafo es un árbol (el árbol de estados). . . . ok) finmientras finsi fin Podemos visualizar el funcionamiento de una técnica de backtracking como la exploración en profundidad de un grafo. Típicamente el tamaño de este grafo será inmenso. Cada vértice del grafo es un posible estado de la solución del problema. ↑ok: B) variables L: ListaComponentes inicio si EsSolución (X) entonces ok CIERTO en otro caso ok FALSO L=Candidatos (X) mientras ¬ok ^ ¬Vacía (L) hacer X[i + 1] Cabeza (L). Si cada secuencia de decisiones distinta da lugar a un estado diferente.