Avarap

276 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
276
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Avarap

  1. 1. Algoritmos voraces1. Método general.2. Análisis de tiempos de ejecución.3. Ejemplos. 3.1. Problema de la mochila. 3.2. Planificación de tareas.4. Técnicas heurísticas. 4.1. El problema del viajante. 4.2. Coloración de grafos. 1
  2. 2. Método general• Los algoritmos voraces, ávidos o de avance rápido (greedy) se utilizan normalmente en problemas de optimización, donde una solución está formada por un conjunto de elementos entre un conjunto de candidatos (con un orden determinado o no).• El algoritmo voraz funciona por pasos: – Partimos de una solución vacía. – En cada paso se escoge el siguiente elemento para añadir a la solución, entre los candidatos. – Una vez tomada esta decisión no se podrá deshacer. – El algoritmo acabará cuando el conjunto de elementos seleccionados constituya una solución. 2
  3. 3. Método general• Esquema general de un algoritmo voraz: voraz (C: conjunto_candidatos; var S: conjunto_solución); S=Ø mientras (C ≠ Ø) y no solución (S) hacer x = seleccionar (C) C = C - {x} si factible (S ∪ {x}) entonces S = S ∪ {x} finmientras si no solución (S) entonces devolver “No se puede encontrar una solución”• En cada paso tenemos los siguientes conjuntos: – Candidatos seleccionados para la solución S. – Candidatos seleccionados pero rechazados luego. – Candidatos pendientes de seleccionar C. 3
  4. 4. Método general• Funciones: – solución (S). Comprueba si un conjunto de candidatos es una solución (independientemente de que sea óptima o no). – seleccionar (C). Devuelve el elemento más “prometedor” del conjunto de candidatos pendientes (no seleccionados ni rechazados). – factible (C). Indica si a partir del conjunto de candidatos C es posible construir una solución (posiblemente añadiendo otros elementos). – Insertar un elemento en la solución. Además de la inserción, puede ser necesario hacer otras cosas. – Función objetivo (S). Dada una solución devuelve el coste asociado a la misma (resultado del problema de optimización). 4
  5. 5. Problema del cambio de monedas Disponemos de monedas de distintos valores: de 1, 2, 5, 10, 20 y 50 céntimos de euro, y de 1 y 2 euros. Supondremos una cantidad ilimitada de cada una. Construir un algoritmo que dada una cantidad P devuelva esa cantidad con monedas de estos tipos, usando un número mínimo de monedas. P. ej.: para devolver 3.89 €: 1 monedas de 2€, 1 moneda de 1€, 1 moneda de 50 c€, 1 moneda de 20 c€, 3 monedas de 5 c€ y 2 monedas de 2 c€.• Podemos aplicar la técnica voraz: en cada paso añadir una moneda nueva a la solución actual, hasta que el valor llegue a P. 5
  6. 6. Problema del cambio de monedas• Candidatos iniciales: todos los tipos de monedas disponibles. Solución: conjunto de monedas que suman la cantidad P.• Una solución será de la forma (x1, x2, x3, x4, x5, x6, x7, x8), donde xi es el número de monedas de tipo i. Suponemos que la moneda i vale ci.• Funciones: – solución. El valor actual será solución si Σ xi·ci = P – objetivo. La función a minimizar es Σ xi, el número de monedas resultante. – seleccionar. Elegir en cada paso la moneda de valor más alto posible, pero menor que el valor que queda por devolver. – factible. Valdrá siempre verdad.• En lugar de seleccionar monedas de una en una, podemos usar la división entera y coger todas las monedas posibles de mayor valor. 6
  7. 7. Problema del cambio de monedasDevolver-cambio (P: integer; C: array [1..N] of integer; var X: array [1..N] of integer); act = 0 para i = 1,2,...,N X[i] = 0 mientras act ≠ P j = el mayor elemento de C tal que C[j] ≤ (P - act) si j=0 then { Si no existe ese elemento } devolver “No existe solución”; X[j] = (P - act) div C[j] act = act + C[j]*X[j] 7
  8. 8. Problema del cambio de monedas• Para este sistema monetario encuentra siempre la solución óptima.• Puede no encontrar la solución óptima: supongamos que tenemos monedas de 100, 90 y 1. Queremos devolver 180. – Algoritmo voraz: 1 moneda de 100 y 80 monedas de 1: total 81 monedas. – Solución óptima: 2 monedas de 90: total 2 monedas.• Puede haber solución y no encontrarla.• Puede no haber solución y no lo detecta. 8
  9. 9. Análisis de tiempos de ejecución• El orden de complejidad depende del número de candidatos, de las funciones básicas a utilizar, del número de elementos de la solución.• N: número de elementos de C. M: número de elementos de una solución.• Repetir, como máximo N veces y como mínimo M: – Comprobar si el valor actual es solución: f(M). Normalmente O(1) ó O(M). – Selección de un elemento entre los candidatos: g(N). Entre O(1) y O(N). – La función factible es parecida a solución, pero con una solución parcial h(M). – La unión de un nuevo elemento a la solución puede requerir otras operaciones de cálculo, j(N, M).• Tiempo de ejecución genérico: t(N,M)∈O(N*(f(M)+g(N)+h(M))+M*j(N, M))• En la práctica los algoritmos voraces suelen ser bastante rápidos, encontrándose dentro de órdenes de complejidad polinomiales. 9
  10. 10. Problema de la mochila• Tenemos n objetos, cada uno con un peso (wi) y un beneficio (vi). También tenemos una mochila en la que podemos meter objetos, con una capacidad de peso máximo M. (Supondremos todos los valores > 0)• El objetivo es llenar la mochila, maximizando el valor de los objetos transportados, y respetando la limitación de capacidad máxima M.• Supondremos que los objetos se pueden partir. De cada objeto i podremos coger un fracción xi, entre 0 y 1.• Una solución será de la forma S = (x1, x2, ..., xn), cumpliendo: n n Restricción ∑x i=1 i ⋅ wi ≤ M Función objetivo ∑x i=1 i ⋅ vi 10
  11. 11. Problema de la mochila• Ejemplo: n = 3; M = 20 w = (18, 15, 10) v = (25, 24, 15) Solución 1: S = (1, 2/15, 0), Valor total = 25 + 24*2/15 = 28.2 Solución 2: S = (0, 2/3, 1), Valor total = 15 + 24*2/3 = 31• Diseño de la solución. Podemos utilizar un algoritmo voraz para resolver el problema. – Candidatos: Cada uno de los n objetos de partida. – Función solución: Tendremos una solución si hemos introducido en la mochila el peso máximo M (o si se han acabado los objetos). – Función seleccionar: Escoger el objeto más “prometedor”. – Función factible: Será siempre cierta (podemos añadir trozos de objetos). – Añadir a la solución: Añadir el objeto entero si cabe en la mochila, o en otro caso la proporción del mismo que quede para completarla. – Función objetivo: Suma de los beneficios de cada candidato por la proporción seleccionada del mismo. 11
  12. 12. Problema de la mochilaMochila (M: integer; V, W: array [1..N] of integer; var X: array [1..N] of integer); para i = 1,2,...,N X[i] = 0 peso_act = 0 mientras peso_act < M j = el mejor objeto restante si peso_act + W[i] ≤ M X[i] = 1 peso_act = peso_act + W[i] en otro caso X[i] = (M - peso_act)/W[i] peso_act = M 12
  13. 13. Problema de la mochila• Criterios para seleccionar el mejor objeto de los restantes: 1. El objeto con más beneficio vi. 2. El objeto menos pesado wi (para poder añadir muchos objetos). 3. El objeto con mejor proporción vi/wi (coste por unidad de peso).• El criterio 3 obtiene siempre la solución óptima. 13
  14. 14. Secuenciamiento de trabajos• Tenemos n tareas requieren un tiempo unitario en ejecutarse, y un único procesador donde ejecutarlas.• En cualquier instante T = 1, 2, ... podemos ejecutar una única tarea i. La ejecución de esta tarea provocará un beneficio gi.• Restricción: una tarea i sólo puede ejecutarse si se hace antes de un plazo di. Cada tarea tiene un plazo de ejecución y un beneficio dados.• En general puede que no sea posible ejecutar todas las tareas.• Objetivo: dar una planificación de las tareas a ejecutar (i1, i2, ..., im) de forma que se maximice el beneficio obtenido: ∑ m k =1 gi k 14
  15. 15. Secuenciamiento de trabajos• Ejemplo: n = 4 g = (100, 10, 15, 27) d = ( 2, 1, 2, 1) Soluciones: (1) GTOTAL = 100 (2, 1) GTOTAL = 110 (4, 3) GTOTAL = 42 (4, 1) GTOTAL = 127• Comprobar todas las posibilidades tendría una complejidad n!• Con un algoritmo voraz construimos la solución paso a paso.• Una solución estará formada por un conjunto de candidatos, junto con un orden de ejecución de los mismos, S = (i1, i2, ..., im).• Función solución: Tendremos la solución cuando hayamos tratado todos los candidatos.• Función de selección: de los candidatos restantes elegir el que tenga mayor valor de beneficio. 15 Solución (1,3) no óptima.
  16. 16. Secuenciamiento de trabajos• Función factible: Dada una planificación (i1, i2, ..., ik) en un paso del algoritmo y un nuevo candidato j, – ¿Cuándo será factible la solución parcial que incluye a j? – ¿Dónde debería ser colocado j dentro de la planificación?• Solución: buscar si existe alguna ordenación de {i1, i2, ..., ik, j} que respete los plazos de ejecución di. Problema: complejidad (k+1)!• Parece lógico no comprobar todas las posibles ordenaciones, sino hacer una ordenación de forma que las tareas con plazos di más tempranos se ejecuten antes, y dejar para después las que tengan plazos mayores.• Lema: Sea J un conjunto de k tareas, entonces existe una ordenación factible de J (es decir que respeta los plazos) sí y sólo sí la ordenación S = (s1, s2, ..., sk), con ds1 ≤ ds2 ≤ ... ≤ dsk es factible.• Es decir, sólo es necesario probar la planificación en orden creciente de plazo de ejecución. 16
  17. 17. Secuenciamiento de trabajos• Estructura del algoritmo voraz: – Empezar con una secuencia vacía, con todos las tareas como candidatas. – Ordenar los candidatos según el valor de gi. – En cada paso, hasta que se acaben los candidatos, repetir: • Elegir entre los candidatos restantes el que tenga mayor beneficio. • Comprobar si es posible añadir la tarea elegida a la solución actual. Para ello introducir la nueva tarea en la posición adecuada, según el valor de plazo d. • Si el nuevo orden (s1, s2, ..., sk) es tal que dsi ≥ i, para todo i entre 1 y k, entonces el nuevo candidato es factible. Sino rechazar el candidato. 17
  18. 18. Secuenciamiento de trabajosTrabajos(in d:array[1..n] of real; out s:array[0..n] of 0..n) d[0] = 0 ; s[0] = 0 ; k = 1 ; s[1] = 1 para i = 2,3,..,n r=k mientras d[s[r]]>d[i] y d[s[r]]≠r r = r-1 finmientras si d[s[r]]≤d[i] y d[i]>r para l = k,k-1,..,r+1 s[l+1] = s[l] finpara s[r+1] = i k = k+1 finsifinpara 18
  19. 19. Secuenciamiento de trabajos• Orden de complejidad del algoritmo, suponiendo n tareas: – Primero, ordenar las tareas por orden creciente de plazo: O(n·log n) – Repetir para i desde 1 hasta n: • Elegir el próximo candidato: O(1). • Comprobar si la nueva planificación es factible, y añadirlo a la solución en caso afirmativo: O(i) en el peor caso. • En total, el algoritmo es de O(n2). – En promedio es una ordenación por inserción: θ(n2). 19
  20. 20. Técnicas heurísticas• Existen muchos problemas para los cuales no se conocen algoritmos que puedan encontrar la solución de forma eficiente: problemas NP-completos.• La solución exacta puede requerir un orden factorial o exponencial: el problema de la explosión combinatoria.• 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. Normalmente, se basa en un conocimiento intuitivo del programador sobre un determinado problema.• La estructura de algoritmo voraz se puede utilizar para construir procedimientos heurísticos: hablamos de heurísticas voraces.• Objetivo: obtener buenas soluciones en un tiempo de ejecución corto. 20
  21. 21. El problema del viajante• Problema: Dado un grafo no dirigido y con pesos G = (V, A), encontrar un ciclo simple de costo mínimo que pase por todos los nodos. 10 2 3 45 20 40 55 25 1 4 35 30 50 5 15• Es un problema NP, pero necesitamos una solución eficiente.• Problema de optimización, donde la solución está formada por un grupo de elementos en cierto orden: podemos aplicar el esquema voraz.• Posibilidades: 1) Los nodos son los candidatos. Empezar en un nodo cualquiera. En cada paso moverse al nodo no visitado más próximo al último nodo seleccionado. 2) Las aristas son los candidatos, pero garantizando que se forme un 21 ciclo.
  22. 22. El problema del viajante• Heurística voraz 1) – Una solución será un cierto orden en el conjunto de nodos (c1, c2, ..., cn): el orden de visita de los nodos. – Inicialización: seleccionar un nodo cualquiera. – 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, c2, ..., ca). – Acabamos cuando tengamos n nodos.• Ejemplo. 2 10 3 Empezando en el nodo 1. 45 30 25 1 4 Solución: (1, 4, 5, 3, 2) Coste: 30+15+25+10+45=125 5 15 10 Empezando en el nodo 3. 2 3 45 20 Solución: (5, 4, 3, 2, 1) 1 4 Coste: 15+20+10+45+50=140 50 5 15 22
  23. 23. El problema del viajante• Heurística voraz 2) – Una solución será un conjunto de aristas (a1, a2, ..., an-1) que formen un ciclo hamiltoniano, sin importar el orden. – Empezar con un grafo sin aristas. – Selección: seleccionar la arista candidata de menor coste. – 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. 10 2 3• Ejemplo. 45 20 Solución: ((2, 3), (4, 5), (3, 4), (1, 2), (1, 5)) 1 4 Coste = 10+15+20+45+50 = 140• Conclusiones: 50 5 15 – Ninguno de las dos funciones de selección garantiza una solución óptima. Sin embargo, normalmente ambos dan soluciones buenas, próximas a la óptima. – Posibles mejoras: buscar heurísticas mejores; repetir la heurística 1 con varios orígenes; o bien, a partir de la solución del algoritmo intentar hacer modificaciones locales para mejorar esa solución: búsqueda local. 23
  24. 24. Coloración de grafos• Problema: dado un grafo no dirigido, realizar una coloración utilizando el número mínimo de colores.• Coloración: asignación de un color a cada nodo, de forma que dos nodos unidos con un arco tengan siempre distinto color. 4 1 3 2 5 • Una solución será un conjunto de pares de la forma (nodo, color) cumpliendo que para todo (ni, ci) y (nj, cj), si (ni, nj) es una arista del grafo, entonces ci ≠ cj. • Podemos usar una heurística voraz para obtener una solución: – Empezar con un color c1, y todos los nodos sin colorear. – Para cada uno de los nodos que no tienen asignado un color, comprobar si es posible asignarles el color actual. Repetir hasta comprobar todos los candidatos. – Si quedan nodos sin colorear, escoger otro color y 24 volver al paso anterior.
  25. 25. Coloración de grafos• Ejemplo. 4 1 3 2Solución: ((1, 1), (2, 1), (3, 2), (4, 3), (5, 3)) 5Número de colores = 3• La estructura básica del esquema voraz se repite varias veces, una por cada color, hasta que todos los nodos estén coloreados.• Función de selección: seleccionar cualquier candidato restante.• Función factible: se puede asignar un color al candidato actual si ninguno de sus adyacentes tiene ese mismo color.• El algoritmo no garantiza la solución óptima (en el ejemplo 2 colores). 4 1 3 2 5• ¿Cuál será el tiempo de ejecución en el peor caso? 25

×