Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Bloque temtico 1. Lenguajes de programacin Bloque temtico 2. Metodologa de programacin Bloque temtico 3. Esquemas algortmicos Tema 4. Introduccin a los Algoritmos Tema 5. Algoritmos voraces, heursticos y aproximados Tema 6. Divide y Vencers Tema 7. Ordenacin Tema 8. Programacin dinmica Tema 9. Vuelta atrs Tema 10.Ramificacin y poda Tema 11.Introduccin a los Algoritmos Genticos Tema 12.Eleccin del esquema algortmico
Programacin II Mario Aldea Rivas 05/04/11
5.1 Introduccin
Los algoritmos voraces (Greedy) se utilizan tpicamente para resolver problemas de optimizacin: minimizar o maximizar, bajo determinadas condiciones, el valor de una funcin del tipo: f(x1,x2,..,xn)=c1x1+c2x2+..+cnxn La solucin se va construyendo en etapas: en cada etapa se aade un nuevo elemento a la solucin parcial - el que nos parece el mejor candidato en ese momento las decisiones tomadas nunca se revisan - voracidad: se consume el mejor elemento lo antes posible sin pensar en futuras consecuencias al final de cada etapa se verifica si la solucin parcial ya constituye una solucin total para el problema Ejemplo: dar cambio utilizando el mnimo nmero de monedas
Programacin II Mario Aldea Rivas 05/04/11
Tema 5. Algoritmos voraces, heursticos y aproximados 5.3 Eficiencia de los algoritmos voraces
Tema 5. Algoritmos voraces, heursticos y aproximados 5.3 Eficiencia de los algoritmos voraces
Programacin II
Tema 5. Algoritmos voraces, heursticos y aproximados 5.4 Cundo usar algoritmos voraces
10
Tema 5. Algoritmos voraces, heursticos y aproximados 5.4 Cundo usar algoritmos voraces
Un algoritmo que no garantice encontrar la solucin ptima puede ser til en algunos casos para encontrar una solucin aproximada los algoritmos voraces no ptimos a menudo encuentran soluciones bastante aproximadas a las ptimas hablaremos de ellos al tratar los algoritmos heursticos y aproximados (apartado 5.8)
Programacin II Mario Aldea Rivas 05/04/11
11
Tema 5. Algoritmos voraces, heursticos y aproximados 5.4 Cundo usar algoritmos voraces
Principio de optimalidad
Un problema verifica el principio de optimalidad si: en una secuencia ptima de decisiones toda subsecuencia ha de ser tambin ptima P.e. el clculo del camino ms corto entre ciudades: - el camino ms corto Santander Madrid pasa por Burgos
- unin de los caminos ms cortos Santander Burgos, Burgos Madrid
No pasa igual con el camino ms rpido: - ir rpido en un tramo puede obligar a repostar en el siguiente La mayora de los problemas que verifican este principio pueden resolverse utilizando algoritmos voraces puesto que es posible que exista una funcin de seleccin que conduzca a la solucin ptima pero no hay garanta de que se vaya a encontrar esa funcin (ni siquiera de que exista)
Programacin II Mario Aldea Rivas 05/04/11
12
Tema 5. Algoritmos voraces, heursticos y aproximados 5.4 Cundo usar algoritmos voraces Principio de optimalidad (cont.)
Dar el cambio cumple el principio de optimalidad la vuelta ptima de 74 cent. es igual a la vuelta ptima de 50 cent. ms la vuelta ptima de 24 cent. pero no es igual a la vuelta ptima de 43 cent. ms la vuelta ptima de 31 cent. - de ah la importancia de una buena funcin de seleccin el algoritmo para el sistema monetario ingls funcionara correctamente con una funcin de seleccin apropiada
Programacin II
13
14
Tema 5. Algoritmos voraces, heursticos y aproximados 5.5 El problema de la mochila El problema de la mochila (cont.)
El problema cumple el principio de optimalidad intentaremos resolverlo utilizando un algoritmo voraz el problema ser encontrar la funcin de seleccin adecuada El pseudocdigo de nuestro algoritmo ser:
mtodo mochila(real[1..n] p, real[1..n] v, real P) retorna real[1..n] peso := 0 mientras peso < P y quedan objetos hacer i := seleccionaMejorObjeto si peso + p[i] <= P entonces x[i] := 1 peso := peso + p[i] sino x[i] := (P-peso)/p[i] peso := P fsi fhacer retorna x fmtodo
Programacin II Mario Aldea Rivas 05/04/11
15
16
17
Posibles aplicaciones: tendido de lneas de telfono que permita intercomunicar un conjunto de ciudades
Programacin II Mario Aldea Rivas 05/04/11
18
Tema 5. Algoritmos voraces, heursticos y aproximados 5.6 rbol de recubrimiento mnimo rbol de recubrimiento mnimo (cont.)
Algoritmo voraz: Funcin a minimizar: longitud del rbol de recubrimiento Candidatos: las aristas del grafo Funcin solucin: rbol de recubrimiento de longitud mnima Funcin factible: el conjunto de aristas no contiene ciclos Funcin de seleccin: - Seleccionar la arista de menor peso que an no ha sido seleccionada y que no forme un ciclo (Algoritmo Kruskal) - Seleccionar la arista de menor peso que an no ha sido seleccionada y que forme un rbol junto con el resto de aristas seleccionadas (Algoritmo Prim)
Programacin II
19
Algoritmo de Kruskal
Seleccionar la arista de menor peso que: an no haya sido seleccionada y que no conecte dos nudos de la misma componente conexa - es decir, que no forme un ciclo
Paso
1 2 3 4 5 6 7
Programacin II
4
1 1 2
2 3
4 3
5 8
7 4 3
Arista considerada
(1,2) (2,3) (4,5) (6,7) (1,4) (2,5) (4,7)
Componentes conexas
{1} {2} {3} {4} {5} {6} {7} {1,2} {3} {4} {5} {6} {7} {1,2,3} {4} {5} {6} {7} {1,2,3} {4,5} {6} {7} {1,2,3} {4,5} {6,7} {1,2,3,4,5} {6,7} forma ciclo {1,2,3,4,5,6,7}
Mario Aldea Rivas 05/04/11
20
Tema 5. Algoritmos voraces, heursticos y aproximados 5.6 rbol de recubrimiento mnimo Algoritmo de Kruskal (cont.)
mtodo kruskal(Grafo g) retorna ConjuntoAristas {Pre: el grafo es conexo} ordena las aristas por pesos crecientes crea un conjunto distinto para cada nodo mst := conjunto vaco // bucle voraz hacer a := arista de menor peso an no considerada conj1 := conjunto que contiene al nodo a.origen conj2 := conjunto que contiene al nodo a.destino si conj1 != conj2 entonces une conj1 con conj2 mst.aade(a) // la arista forma parte del mst fsi mientras mst tiene menos de g.numNodos-1 aristas retorna mst fmtodo
Programacin II Mario Aldea Rivas 05/04/11
21
Algoritmo de Prim
4
1 1 2
2 3
Comenzando por un nodo cualquiera, seleccionar la arista de menor peso que: an no haya sido seleccionada y que forme un rbol junto con el resto de aristas seleccionadas
Paso
1 2 3 4 5 6
Programacin II
4 3
5 8
7 4 3
Arista considerada
(1,2) (2,3) (1,4) (4,5) (4,7) (7,6)
22
Tema 5. Algoritmos voraces, heursticos y aproximados 5.6 rbol de recubrimiento mnimo Algoritmo de Prim (cont.)
mtodo prim(Grafo g) retorna ConjuntoAristas {Pre: el grafo es conexo} mst := conjunto vaco B := conjunto con un nodo cualquiera de g.nodos // bucle voraz mientras B != g.nodos hacer a := arista de menor peso an no considerada que cumple que a.origen B y a.destino g.nodos - B mst.aade(a) B.aade(a.destino) fhacer retorna mst fmtodo
Programacin II
23
Programacin II
24
25
Tema 5. Algoritmos voraces, heursticos y aproximados 5.7 Caminos mnimos (Dijkstra) Caminos mnimos (Dijkstra) (cont.)
100
30
10 4
20 5 50 3
Nodo Adyacencia
1 5 4 3 2
Programacin II
Cola nodo(distancia)
1(0), 2(), 3(), 4(), 5() 5(10), 3(30), 2(50), 4(100) 4(20), 3(30), 2(50) 3(30), 2(40) 2(35) -
previo 3 4
2, 3, 4, 5 4 2, 3 2 -
null null null null null null 1 1 1 1 null 1 1 5 1 null 4 1 5 1 null 3 1 5 1 null 3 1 5 1
26
Tema 5. Algoritmos voraces, heursticos y aproximados 5.7 Caminos mnimos (Dijkstra) Caminos mnimos (Dijkstra) (cont.)
mtodo dijkstra(Grafo g, Nodo s) retorna distancia[],previo[] para cada u g.nodos hacer distancia[u] = y padre[u] = null fhacer distancia[s] = 0 conjunto cola = g.nodos // bucle voraz mientras cola != hacer u = extraerNodoMinDistancia(cola, distancia) para cada nodo v adyacencia[u] hacer si distancia[v]>distancia[u]+arista(u,v).peso entonces distancia[v] = distancia[u]+arista(u,v).peso previo[v] = u fsi fhacer fhacer fmtodo
Programacin II Mario Aldea Rivas 05/04/11
27
28
Algoritmos heursticos
Suelen estar basados en una regla de sentido comn P.e.: para aprovechar al mximo el maletero del coche vamos colocando los objetos de mayor a menor tamao
heurstica
ptima
Normalmente obtienen una solucin prxima a la ptima incluso pueden llegar a obtener la ptima en algunos casos Pero puede haber casos especiales (patolgicos) para los que la solucin encontrada sea muy mala o incluso no encontrar heurstica solucin
ptima
Mario Aldea Rivas 05/04/11
Programacin II
29
Algoritmos aproximados
Son un tipo especial de heursticos que: siempre encuentran una solucin el error mximo de la solucin obtenida est acotado. Esta cota puede ser: - valor mximo de la diferencia (en valor absoluto) entre la solucin obtenida y la ptima - valor mximo de la razn entre la solucin ptima y la obtenida Debemos encontrar una demostracin matemtica de la existencia de la cota No existe un algoritmo aproximado para todos los problemas para los que existe un heurstico
Programacin II
30
Tema 5. Algoritmos voraces, heursticos y aproximados 5.9 Heurstico para coloreado de grafos
31
Tema 5. Algoritmos voraces, heursticos y aproximados 5.9 Heurstico para coloreado de grafos
Pseudocdigo
// coloreado de grafos utilizando una heurstica // voraz mtodo coloreaGrafoVoraz(Grafo g) Lista nodosNoColoreados=g.listaDeNodos() mientras nodosNoColoreados no est vaca hacer n=nodosNoColoreados.extraePrimero() c=un color no usado an n.colorea(c) para cada nodo nnc en nodosNoColoreados hacer si nnc no tiene ningn vecino de color c entonces nodosNoColoreados.extrae(nnc) nnc.colorea(c) fsi fhacer fhacer // mientras nodosNoColoreados no est vaca fmtodo
Programacin II Mario Aldea Rivas 05/04/11
32
Tema 5. Algoritmos voraces, heursticos y aproximados 5.9 Heurstico para coloreado de grafos
Para los grafos bipartitos la solucin obtenida podra estar muy lejos de la ptima:
1 3 5 7 1 3 5 7
Orden:1,2,3,4,5,6,7,8
Programacin II
Orden:1,3,5,7,2,4,6,8
Mario Aldea Rivas 05/04/11
33
Tema 5. Algoritmos voraces, heursticos y aproximados 5.9 Heurstico para coloreado de grafos Bondad de la solucin obtenida (cont.)
El algoritmo coloreaGrafoVoraz NO es un algoritmo aproximado no podemos poner cota al error de la solucin obtenida ya que crece con el nmero de nodos del grafo - para un grafo bipartito de n nodos la solucin ptima es 2 colores, pero el algoritmo puede llegar a utilizar n/2 Su eficiencia en el peor caso es O(n3) peor caso: grafo completo (todos los nodos estn conectados entre s) el lazo externo se realiza n veces ya que a cada pasada slo se va a lograr colorear un nico nodo: O(n) el lazo interno se realiza para todos los nodos no coloreados: O(n) dentro del lazo interno, para cada nodo puede haber que comprobar sus n-1 vecinos: O(n)
Programacin II Mario Aldea Rivas 05/04/11
34
Tema 5. Algoritmos voraces, heursticos y aproximados 5.10 Heurstico para el problema del viajante
35
Tema 5. Algoritmos voraces, heursticos y aproximados 5.10 Heurstico para el problema del viajante Heurstico para el problema del viajante (cont.)
Una heurstica voraz sencilla consiste en ir desplazndose desde cada ciudad a la ciudad ms prxima no visitada an finalmente retornar a la ciudad desde la que se comenz el viaje
Ejemplo de matriz de distancias para 6 ciudades: Recorrido ptimo: A B C F D E A=58 Recorrido encontrado por el heurstico: A B C E D F A=60
Desde
A B C D E F
Hasta C D
F
25 26 20 15 18 36
3 10 3 8 10 8 11 12 9 7 9 4 25 26 20
11 7 12 9 9 4 5 5 15 18
Programacin II
Tema 5. Algoritmos voraces, heursticos y aproximados 5.10 Heurstico para el problema del viajante
Pseudocdigo
// problema del viajante usando heurstica voraz mtodo viajanteVoraz(Grafo g) Lista ciudadesPorVisitar=g.listaDeNodos() c=ciudadesPorVisitar.extraePrimera() Lista itinerario={c} // comienza en c mientras ciudadesPorVisitar no est vaca hacer cprox=ciudad ms prxima a c en ciudadesPorVisitar // elimina la ms prxima de la lista a visitar // y la aade al itinerario ciudadesPorVisitar.extrae(cprox) itinerario.aadeAlFinal(cprox) c=cprox fhacer // vuelve al comienzo itinerario.aadeAlFinal(itinerario.primera()) fmtodo
Programacin II Mario Aldea Rivas 05/04/11
37
Tema 5. Algoritmos voraces, heursticos y aproximados 5.10 Heurstico para el problema del viajante
A=1+2+2+2
por consiguiente el algoritmo es un heurstico, pero no un aproximado (ya que no es posible acotar el error mximo) Eficiencia: O(n2) (donde n es el nmero de ciudades) el lazo externo se realiza una vez para cada ciudad O(n) para buscar la ciudad ms prxima hay que recorrer todas las ciudades que faltan de visitar O(n)
Programacin II Mario Aldea Rivas 05/04/11
38
Tema 5. Algoritmos voraces, heursticos y aproximados 5.11 Aproximado para el problema del viajante
39
Tema 5. Algoritmos voraces, heursticos y aproximados 5.11 Aproximado para el problema del viajante
Demostracin
El itinerario que buscamos es un ciclo (ciclo hamiltoniano) en cualquier ciclo si se elimina una de sus aristas se obtiene un camino (de longitud menor que la del ciclo) todo camino es un rbol de expansin, por consiguiente tendr una longitud mayor que el rbol de expansin mnimo
A B D C E B D A C E B D A C E
40
Tema 5. Algoritmos voraces, heursticos y aproximados 5.11 Aproximado para el problema del viajante Demostracin (cont.)
Si recorremos todos los nodos utilizando nicamente las aristas del MST recorrido: A B A C D C E F E C A hay que pasar dos veces por cada arista distancia recorrida 2r Si tomamos atajos: recorrido: A B C D E F A la propiedad mtrica permite asegurar que la distancia recorrida d es menor o igual que 2r
A B D distancia:2r F A B D C E C E
distancia: Luego este itinerario verifica que: d2r F d 2r < 2c por consiguiente, ser como mximo dos veces ms largo que cualquier ciclo (incluido el itinerario ptimo para el viajante)
Mario Aldea Rivas 05/04/11
Programacin II
41
Tema 5. Algoritmos voraces, heursticos y aproximados 5.11 Aproximado para el problema del viajante
Algoritmo
El algoritmo aproximado para el problema del viajante mtrico consistir en: encontrar el rbol de expansin mnima del grafo - utilizando el algoritmo de Prim (O(n2)) y posteriormente ordenar sus nodos en preorden (O(n)) luego su eficiencia es O(n2)
El itinerario obtenido por este algoritmo nunca ser ms de dos veces ms largo que el que habramos obtenido utilizando el algoritmo ptimo daprox<2dptima
Programacin II
42
Tema 5. Algoritmos voraces, heursticos y aproximados 5.12 Aproximado para el llenado de cajas
p=4 p=3
P=7
ptima
p=2
p=5
p=3
p=4
43
Tema 5. Algoritmos voraces, heursticos y aproximados 5.12 Aproximado para el llenado de cajas Aproximado para el llenado de cajas (cont.)
Aunque el heurstico no es ptimo para C=2, es posible demostrar que fallar, como mximo, en un objeto suponemos que tenemos una caja que soporta un peso 2P y la llenamos empezando por los objetos de menor peso - la solucin obtenida es ptima para una caja de peso 2P y mejor o igual que la solucin ptima para 2 cajas de peso P
2P
Si ahora partimos la caja por la mitad, deberemos desplazar el objeto partido a la segunda caja lo que puede provocar que, a lo sumo, el ltimo objeto no quepa
P P
est sera la solucin que habramos obtenido con nuestro algoritmo aproximado
Programacin II Mario Aldea Rivas 05/04/11
44
Tema 5. Algoritmos voraces, heursticos y aproximados 5.12 Aproximado para el llenado de cajas Aproximado para el llenado de cajas (cont.)
El resultado anterior se puede generalizar: para un nmero de cajas C, la solucin aproximada tendr, a lo sumo, C-1 objetos menos que la solucin ptima
La eficiencia del algoritmo es: ordenacin de los objetos por pesos no decrecientes: O(n log n) algoritmo voraz que va tomando los objetos uno a uno y guardndoles en las cajas: O(n) eficiencia total: O(n log n)
Programacin II
45
5.13 Bibliografa
[1] Brassard G., Bratley P., Fundamentos de algoritmia. Prentice Hall, 1997. [2] Aho A.V., Hopcroft J.E., Ullman J.D., Estructuras de datos y algoritmos. Addison-Wesley, 1988. [3] Entrada en la Wikipedia para algoritmo voraz [4] Sartaj Sahni, Data Structures, Algorithms, and Applications in Java. Mc Graw Hill, 2000
Programacin II
46