Post on 26-Jul-2015
ANÁLISIS Y DISEÑO DE ALGORITMOS
Universidad Nacional de Ingeniería
Contenidos
Programación dinámica Algoritmos voraces
Divide y vencerásProgramación Dinámica
Algoritmos voracesAproximación
Divide y Vencerás: Resumen Dividir
Descomponer el problema. Vencer
Resolver los sub-problemas. Combinar
Obtener la solución global.
Programación Dinámica
Volvamos al caso Fibonacci… ¿Por qué era ineficiente la solución
recursiva? ¿Los subproblemas en los que descomponía
el problema original eran dependientes o independientes?
¿Qué diferencia hay entre ésta y la solución iterativa?
Programación Dinámica
Programación = Escoger basándose en una serie de
opciones Utilización de una tabla o arreglo para
construir una solución
Programación Dinámica: Pasos1. Caracterizar la estructura de la solución
óptima2. Analizar el problema de manera “top-
down”3. Resolver el problema de manera
“bottom-up”4. Construir la solución óptima
Caminos más cortos
Aplicaciones (dos de muchas) Vuelos Líneas de ensamblado
Tipo de grafo Ponderado y dirigido Matriz de pesos
¿Cómo harías para resolver este problema?
v1
v5
v2
v4 v3
3
51
3
2
19
3
24
Nuestro grafo…
Algoritmo de Floyd
Calcula una serie sucesiva de matrices Donde se van almacenando los caminos más
cortos Nota: El CMC siempre será un camino simple
En cada iteración, se va liberando un vértice Para fungir como intermediario en el camino
Primera iteración caminos directos Última iteración Se puede pasar por todos los
vértices
Algoritmo de Floyd
La receta: Matriz de pesos en iteración k (se libera vértice k)
Lo que ya tengo
Distancia que uso con k como intermediario
D(k)[i][j]= min(D(k-1)[i][j],
D(k-1)[i][k]+D(k-1)[k][j]
Pseudocódigo del algoritmo (Neapolitan)
floyd (n, W[][], D[][]){
D=W;
for(k=1; k<=n; k++) for(i=1; i<=n; i++) for(j=1; j<=n; j++) D[i][j]=minimo(D[i][j], D[i][k] + D[k][j]);
}
Algoritmos voraces
Algoritmos voraces
Quiere el máximo en cada paso Para ciertos problemas, asegura el óptimo Algoritmos “miopes”
Árbol de extensión mínima
Subgrafo conectado que contiene todos los vértices del grafo original. Es un árbol. De peso mínimo.
¿Aplicaciones?1
1
1
Algoritmo de Prim
Basado en vértices Pasos
Escoger un vértice De sus aristas, seleccionar la de menor
peso Incluir la arista y los vértices en el árbol
v5
v1
v2
v3
v4
1
3 36
4
2 5
Algoritmo de Kruskal
Basado en aristas Pasos
Ordenar por pesos las aristas. Extraer la más liviana. Si no crea un ciclo
Registrarla como parte del árbol Registrar sus nodos como parte del árbol
v5
v1
v2
v3
v4
1
34
2
Pseudocódigo del algoritmo (alto nivel)
F = crear conjuntos disjuntos de V, uno por cada vértice y que
solamente contiene el vértice
ordenar las aristas de menor a mayor
while la instancia no se ha resuelto seleccionar la siguiente arista if arista conecta dos vértices de conjuntos disjuntos fusiona los conjuntos agrega arista a F if todos los conjuntos se han fusionado la instancia ha sido resuelta
Otros algoritmos para búsqueda y optimización
Local Recocido simulado Tabú Algoritmos genéticos Agrupamiento
Resumen
Programación dinámica Enfoque top-down implementado como
bottom-up Se van almacenando las soluciones
Algoritmos voraces Obtienen el óptimo asegurando el mayor
valor en cada paso
Referencias
Baase, Sara y Allen Van Gelder. Computer Algorithms: Introduction to Design and Analysis. Addison-Wesley, Massachusetts, 2000. 3era. edición.
Cormen, Thomas H. et al. Introduction to Algorithms. McGraw-Hill, EUA, 2003. 2da. Edición.
Neapolitan, Richard & Kumarss Naimipour . Foundations of Algorithms Using C++ Pseudocode. Jones and Bartlett Publishers, Massachusetts, 1998. 2da. edición.