Está en la página 1de 6

TECNICA DE DISEÑO DE ALGORITMO

Es una estrategia de búsqueda por la cual se sigue una heurística consistente en elegir la opción óptima en cada paso
local con la esperanza de llegar a una solución general óptima. Este esquema algorítmico es el que menos dificultades
plantea a la hora de diseñar y comprobar su funcionamiento. Normalmente se aplica a los problemas de
optimización.

Características de algoritmos voraces

Una aproximación voraz consiste en que cada elemento a considerar se evalúa una única vez, siendo
descartado o seleccionado, de tal forma que si es seleccionado forma parte de la solución, y si es
descartado, no forma parte de la solución ni volverá a ser considerado para la misma. Una forma de ver los
algoritmos voraces es considerar la estrategia de Vuelta atrás, en la cual se vuelve recursivamente a
decisiones anteriormente tomadas para variar la elección entonces tomada, pero eliminando esa recursión
y eligiendo la mejor opción. El término voraz se deriva de la forma en que los datos de entrada se van
tratando, realizando la elección de desechar o seleccionar un determinado elemento una sola vez.
Al contrario que con otros métodos algorítmicos, no siempre es posible dar una solución a un problema
empleando un algoritmo voraz. No todos los problemas son resolubles con algoritmos voraces.
Los algoritmos voraces tienden a ser bastante eficientes y pueden implementarse de forma relativamente
sencilla. Su eficiencia se deriva de la forma en que trata los datos, llegando a alcanzar muchas veces una
complejidad de orden lineal. Sin embargo, la mayoría de los intentos de crear un algoritmo voraz correcto
fallan a menos que exista previamente una prueba precisa que demuestre la correctitud del algoritmo.
Cuando una estrategia voraz falla al producir resultados óptimos en todas las entradas, en lugar de
algoritmo suele denominarse heurística. Las heurísticas resultan útiles cuando la velocidad es más
importante que los resultados exactos (por ejemplo, cuando resultados "bastante buenos" son suficientes).

Suelen aplicarse a problemas de optimización.

Maximizar o minimizar una función objetivo.

Suelen ser rápidos y fáciles de implementar.

Exploran soluciones “Locales”.

No siempre garantizan la solución óptima.

Ejemplos de algoritmos voraces


 Algoritmo de Kruskal
 Algoritmo de Prim
 Algoritmo de Dijkstra
 Algoritmo de triangulación voraz
 Algoritmo para la ubicación óptima

Algoritmo de Dijkstra

El algoritmo de Dijkstra, también llamado algoritmo de caminos mínimos, es un algoritmo para la


determinación del camino más corto dado un vértice origen al resto de vértices en un grafo dirigido y con
pesos en cada arista. Su nombre se refiere a Edsger Dijkstra, quien lo describió por primera vez en 1959.

La idea subyacente en este algoritmo consiste en ir explorando todos los caminos más cortos que parten
del vértice origen y que llevan a todos los demás vértices; cuando se obtiene el camino más corto desde el
vértice origen, al resto de vértices que componen el grafo, el algoritmo se detiene. El algoritmo es una
especialización de la búsqueda de costo uniforme, y como tal, no funciona en grafos con aristas de costo
negativo (al elegir siempre el nodo con distancia menor, pueden quedar excluidos de la búsqueda nodos
que en próximas iteraciones bajarían el costo general del camino al pasar por una arista con costo
negativo).
Algoritmo de Prim

El algoritmo de Prim es un algoritmo de la teoría de los grafos para encontrar un árbol recubridor mínimo en
un grafo conexo, no dirigido y cuyas aristas están etiquetadas.

En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los
vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo,
entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que
forman dicho grafo no conexo.

El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y luego de manera independiente por el
científico computacional Robert C. Prim en 1957 y redescubierto.

¿PARA QUE SIRVE EL TEMA?

Los algoritmos voraces suelen ser bastante simples. Se emplean sobre todo para resolver problemas de
optimización, como por ejemplo, encontrar la secuencia óptima para procesar un conjunto de tareas por un
computador, hallar el camino mínimo de un grafo, etc. Habitualmente, los elementos que intervienen son:

 un conjunto o lista de candidatos (tareas a procesar, vértices del grafo, etc.);


 un conjunto de decisiones ya tomadas (candidatos ya escogidos);
 una función que determina si un conjunto de candidatos es una solución al problema (aunque no
tiene por qué ser la óptima);
 una función que determina si un conjunto es completable, es decir, si añadiendo a este conjunto
nuevos candidatos es posible alcanzar una solución al problema, suponiendo que esta exista;
 una función de selección que escoge el candidato aún no seleccionado que es más prometedor;
 una función objetivo que da el valor/coste de una solución (tiempo total del proceso, la longitud del
camino, etc.) y que es la que se pretende maximizar o minimizar;
Divide y vencerá
En las ciencias de la computación, el término divide y vencerás (DYV) hace referencia a uno de los más
importantes paradigmas de diseño algorítmico. 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. El proceso continúa hasta que
éstos llegan a ser lo suficientemente sencillos como para que se resuelvan directamente. Al final, las
soluciones a cada uno de los subproblemas se combinan para dar una solución al problema original.

Esta técnica es la base de los algoritmos eficientes para casi cualquier tipo de problema como, por ejemplo,
algoritmos de ordenamiento (quicksort, mergesort, entre muchos otros), multiplicar números grandes
(Karatsuba), análisis sintácticos (análisis sintáctico top-down) y la transformada discreta de Fourier.

El término Divide y Vencerás en su acepción más amplia es algo más que una técnica de diseño de
algoritmos. De hecho, suele ser considerada una filosofía general para resolver problemas y de aquí que su
nombre no sólo forme parte del vocabulario informático, sino que también se utiliza en muchos otros
ámbitos. En nuestro contexto, Divide y Vencerás es una técnica de diseño de algoritmos que consiste en
resolver un problema a partir de la solución de subproblemas del mismo tipo, pero de menor tamaño.

Precedentes históricos

La búsqueda binaria, un algoritmo de divide y vencerás en el que el problema original es partido


sucesivamente en subproblemas simples de más o menos la mitad del tamaño, tiene una larga historia. La
idea de usar una lista ordenada de objetos para facilitar su búsqueda data de la antigua Babilonia en el 200
a. C., mientras que una descripción del algoritmo en ordenadores apareció en 1946 en un artículo de John
Mauchly. Otro algoritmo de “divide y vencerás” con un único subproblema es el algoritmo de Euclides para
computar el máximo común divisor de dos números (mediante reducción de números a problemas
equivalentes cada vez más pequeños), que data de muchos siglos antes de Cristo.

Diseño e implementación

La resolución de un problema mediante esta técnica consta fundamentalmente de los siguientes pasos:

En primer lugar ha de plantearse el problema de forma que pueda ser descompuesto en k subproblemas
del mismo tipo, pero de menor tamaño.

En segundo lugar han de resolverse independientemente todos los subproblemas, bien directamente si son
elementales o bien de forma recursiva. El hecho de que el tamaño de los subproblemas sea estrictamente
menor que el tamaño original del problema nos garantiza la convergencia hacia los casos elementales,
también denominados casos base.

Por último, combinar las soluciones obtenidas en el paso anterior para construir la solución del problema
original.

Recursión

Los algoritmos de “divide y vencerás” están naturalmente implementados, como procesos recursivos. En
ese caso, los subproblemas parciales encabezados por aquel que ya ha sido resuelto se almacenan en la
pila de llamadas de procedimientos.

Un algoritmo recursivo es un algoritmo que expresa la solución de un problema en términos de


una llamada a sí mismo. La llamada a sí mismo se conoce como llamada recursiva o recurrente.

Pila explícita
Los algoritmos de divide y vencerás también pueden ser implementados por un programa no recursivo que
almacena los subproblemas parciales en alguna estructura de datos explícita, tales como una pila, una
cola, o una cola de prioridad.

Programacion dinamica

En informática, la programación dinámica es un método para reducir el tiempo de ejecución de un algoritmo


mediante la utilización de subproblemas superpuestos y subestructuras óptimas, como se describe a
continuación.

El matemático Richard Bellman inventó la programación dinámica en 1953 que se utiliza para optimizar
problemas complejos que pueden ser discretizados y secuencializados.

La programación dinámica no cuenta con una formulación matemática estándar, sino que se trata de un
enfoque de tipo general para la solución de problemas, y las ecuaciones específicas que se usan se deben
desarrollar para que representen cada situación individual.

Comúnmente resuelve el problema por etapas, en donde cada etapa interviene exactamente una variable
de optimización (u optimizadora).

Para resolver problemas de programación dinámica se necesita:

Un grado de creatividad.

Un buen conocimiento de la estructura general de los problemas de programación dinámica para reconocer
cuando un problema se puede resolver por medio de estos procedimientos y como esto se puede llevar a
cabo.

Características de los problemas de programación dinámica

El problema se puede dividir en etapas que requieren una política de decisión en cada una.

Cada etapa tiene cierto número de estados asociados a ella.

El efecto de la política de decisión en cada etapa es transformar el estado actual en un estado asociado con la
siguiente etapa.

El procedimiento de solución está diseñado para encontrar una política óptima para el problema completo.

Dado un estado actual, una política óptima para las etapas restantes es independiente de la política adoptada
en las etapas anteriores (principio de optimalidad).

El procedimiento de solución se inicia al encontrar la política óptima para la última etapa.

Se dispone de una relación recursiva que identifica la política óptima par la etapa n dada la política óptima
para la etapa (n+1)
Ramificacion y Acotacion o poda
La técnica de Ramificación y poda se suele interpretar como un árbol de soluciones, donde cada rama nos
lleva a una posible solución posterior a la actual. 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, para «podar» esa rama del árbol y no continuar malgastando
recursos y procesos en casos que se alejan de la solución óptima.

Nuestra meta será encontrar el valor mínimo de una función f(x) (un ejemplo puede ser el coste de
manufacturación de un determinado producto) donde fijamos x rangos sobre un determinado conjunto S de
posibles soluciones. Un procedimiento de ramificación y poda requiere dos herramientas.

Ramificación y Corte

Ramificación y corte es un método de optimización combinacional para resolver problemas de enteros lineales, que
son problemas de programación lineal donde algunas o todas las incógnitas están restringidas a valores enteros. Se
trata de un híbrido de ramificación y poda con métodos de planos de corte.

Esta técnica es usada por un gran número de problemas NP-hard, tales como:

Problema de la mochila.
Es un problema de optimización combinatoria, es decir, que busca la mejor solución entre un conjunto finito de
posibles soluciones a un problema. Modela una situación análoga al llenar una mochila, incapaz de soportar
más de un peso determinado, con todo o parte de un conjunto de objetos, cada uno con un peso y valor
específicos. Los objetos colocados en la mochila deben maximizar el valor total sin exceder el peso máximo.

Programación lineal.

La programación lineal es el campo de la programación matemática dedicado a maximizar o minimizar (optimizar)


una función lineal, denominada función objetivo, de tal forma que las variables de dicha función estén sujetas a una
serie de restricciones expresadas mediante un sistema de ecuaciones o inecuaciones también lineales.

Programación no lineal.

Es el proceso de resolución de un sistema de igualdades y desigualdades sujetas a un conjunto de restricciones sobre


un conjunto de variables reales desconocidas, con una función objetivo a maximizar (o minimizar), cuando alguna de
las restricciones o la función objetivo no son lineales.

Problema del viajante.

El problema del vendedor viajero, problema del vendedor ambulante, problema del agente viajero o problema del
viajante (TSP por sus siglas en inglés (Travelling Salesman Problem)), responde a la siguiente pregunta: dada una lista
de ciudades y las distancias entre cada par de ellas, ¿cuál es la ruta más corta posible que visita cada ciudad
exactamente una vez y al finalizar regresa a la ciudad origen? Este es un problema NP-Hard dentro en la optimización
combinatoria, muy importante en la investigación de operaciones y en la ciencia de la computación.

Problema de la asignación cuadrática.

Es un problema estándar en la teoría de locación. En éste se trata de asignar N instalaciones a una cantidad N de
sitios o locaciones en donde se considera un costo asociado a cada una de las asignaciones. Este costo dependerá de
las distancias y flujo entre las instalaciones, además de un costo adicional por instalar cierta instalación en cierta
locación específica. De este modo se buscará que este costo, en función de la distancia y flujo, sea mínimo.
Algoritmo Heuristico

Se denomina heurística al arte de inventar. En programación se dice que un algoritmo es heurístico cuando la
solución no se determina en forma directa, sino mediante ensayos, pruebas y reensayos. El método consiste en
generar candidatos de soluciones posibles de acuerdo a un patrón dado; luego los candidatos son sometidos a
pruebas de acuerdo a un criterio que caracteriza a la solución.

También podría gustarte