1 tema 10: algoritmos voraces 1. método general. 2. análisis de tiempos de ejecución. 3....

25
1 Tema 10: Algoritmos voraces 1. 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.

Upload: julia-calderon-del-rio

Post on 24-Jan-2016

237 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: 1 Tema 10: Algoritmos voraces 1. 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

1

Tema 10: Algoritmos voraces

1. 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.

Page 2: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 3: 1 Tema 10: Algoritmos voraces 1. 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

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}finmientrassi 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.

Page 4: 1 Tema 10: Algoritmos voraces 1. 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

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).

Page 5: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 6: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 7: 1 Tema 10: Algoritmos voraces 1. 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

7

Problema del cambio de monedas

Devolver-cambio (P: integer; C: array [1..N] of integer; var X: array [1..N] of integer);act = 0para i = 1,2,...,N X[i] = 0mientras 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]

Page 8: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 9: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 10: 1 Tema 10: Algoritmos voraces 1. 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

10

• 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:

Problema de la mochila

Restricción Mwxn

iii

1

Función objetivo

n

iiivx

1

Page 11: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 12: 1 Tema 10: Algoritmos voraces 1. 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

12

Problema de la mochila

Mochila (M: integer; V, W: array [1..N] of integer; var X: array [1..N] of integer);para i = 1,2,...,N X[i] = 0peso_act = 0mientras peso_act < M i = el mejor objeto restante si peso_act + W[i] M

X[i] = 1peso_act = peso_act + W[i]

en otro casoX[i] = (M - peso_act)/W[i]peso_act = M

Page 13: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 14: 1 Tema 10: Algoritmos voraces 1. 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

14

Secuenciamiento de trabajos• Tenemos n tareas que 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 kig1

Page 15: 1 Tema 10: Algoritmos voraces 1. 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

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.

Solución (1,3) no óptima.

Page 16: 1 Tema 10: Algoritmos voraces 1. 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

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 d i 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.

Page 17: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 18: 1 Tema 10: Algoritmos voraces 1. 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

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] = 1para i = 2,3,..,n

r = kmientras d[s[r]]>d[i] y d[s[r]]r

r = r-1finmientrassi d[s[r]]d[i] y d[i]>r

para l = k,k-1,..,r+1s[l+1] = s[l]

finparas[r+1] = ik = k+1

finsifinpara

Page 19: 1 Tema 10: Algoritmos voraces 1. 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

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).

Page 20: 1 Tema 10: Algoritmos voraces 1. 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

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.

Page 21: 1 Tema 10: Algoritmos voraces 1. 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

21

• 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.

El problema del viajante

• 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 ciclo.

15

30

20

25

50

45

10

35

40 55

5

4

3

1

2

Page 22: 1 Tema 10: Algoritmos voraces 1. 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

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.Empezando en el nodo 1.

Solución: (1, 4, 5, 3, 2)Coste: 30+15+25+10+45=125

Empezando en el nodo 3.

Solución: (5, 4, 3, 2, 1)Coste: 15+20+10+45+50=140

2 3

41

5 15

30 25

45

10

2 3

41

5 15

20

50

45

10

Page 23: 1 Tema 10: Algoritmos voraces 1. 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

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.

• Ejemplo.Solución: ((2, 3), (4, 5), (3, 4), (1, 2), (1, 5))Coste = 10+15+20+45+50 = 140

• Conclusiones:– 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.

2 3

41

5 15

20

50

45

10

Page 24: 1 Tema 10: Algoritmos voraces 1. 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

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.

1 2

5

4

3

• 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 volver al paso anterior.

Page 25: 1 Tema 10: Algoritmos voraces 1. 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

25

Coloración de grafos• Ejemplo.

Solución: ((1, 1), (2, 1), (3, 2), (4, 3), (5, 3))

Número de colores = 3

1 2

5

4

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).

• ¿Cuál será el tiempo de ejecución en el peor caso?

1 2

5

4

3