Algoritmos Voraces Introducción Andrés Becerra Sandoval Ponticia Universidad Javeriana 2007 Lenguajes III Contenido Knapsack Un ladrón que va a robar un conjunto de objetos tiene un morral que puede tiene una capacidad máxima de carga de W kilos (W ∈N), sabe que cada objeto tiene un peso wi y un precio vi determinados, su problema consiste en decidir que objetos robarse de manera que maximice el precio total y no sobrepase la capacidad de carga de su morral. 1. knapsack 0-1 (binario) 2. knapsack fraccional Knapsack binario c[i,w] es la solución para los objetos del 1 al i, y para el peso máximo w. 0 c [i − 1, w ] c [i , w ] = max {vi + c [i − 1, w − wi ], c [i − 1, w ]} si i = 0 o w = 0 wi > W − w i >0 w ≥ W − wi Estrategia Voraz I I I I Obtener la relación vi /wi (precio por unidad de peso) Ordenar los datos de acuerdo a este nuevo valor Echar el objeto con el mayor precio por unidad de peso Estará correcta esta estrategia? Contraejemplo item 1 2 3 precio 60 100 120 W=50 peso 10 20 30 Ahora obtenemos el precio por unidad de peso: item 1 2 3 precio/peso 6 5 4 Que escogería la estrategia voraz? Morral fraccional v w i i ≥ v w i +1 i +1 para todo item i morral-Fraccional(v , w , W ) 1 carga ← 0 2 i ←1 3 while load ≤ W and i ≤ n 4 do if wi ≤ W − carga 5 then echar todo el item i 6 carga ← carga + wi W −carga del item i 7 else echar w 8 carga ← carga + W −wcarga 9 i ←i +1 i i Paradas mínimas Una empresa de transportes envía camiones a diferentes ciudades y ha estimado que con el tanque lleno cada camión recorre n kilómetros. La ruta desde el origen a cada ciudad pasa por varias ciudades intermedias, y se conocen las distancias entre todas las parejas de ciudades que aparecen consecutivamente en una ruta. Problema El problema que usted debe resolver consiste en denir un conjunto mínimo de paradas para tanquear que le permitean a un camión hacer un viaje siguiendo una ruta establecida. Para ésto usted debe diseñar e implementar un algoritmo voraz que solucione el problema. Especicación I Entrada: r, un arreglo; m, una matriz; y n, la distancia en kilómetros que recorren los camiones con el tanque lleno. I Cada I cada ri mi ,j contiene una ciudad, contiene la distancia en kilometros entre la ciudad i y la j I Salida: u, un conjunto de ciudades en las que el camíon debe realizar paradas a tanquear Algoritmo paradas(r , m, n) 1 k ← length[r ] 2 d ←0 3 u←∅ 4 for j ← 1 to k − 1 5 do d ← d + rk 6 if d + rk +1 ≥ n 7 then u ← u ∪ rk 8 d ←0 Demostración si u={a}t, donde a es la primer ciudad en en el camión para para tanquear antes de que se le acabe el combustible, no puede existir otra solución mejor u'. Si existiera, u'={a'}t', donde a' sería otra ciudad en la que el camión pararía antes de llegar a a, como la distancia recorrida desde el origen hasta a' es menor que la distancia recorrida hasta a, entonces, la lista t' tendría que contener el mismo número de paradas que la lista t, o tendría una parada más por la distancia extra que no se recorrió al parar en a'. Asi que u' no sería mejor que u y tendríamos una contradicción. Además, la elección de u={a}t, siempre deja espacio para buscar una solución óptima para el problema que toma la lista de ciudades a recorrer, eliminando la a. Este problema tiene la misma estructura que el inicial. Una solución voraz u es óptima: Human a b c d e f f 45 13 12 16 9 5 cod jo 000 001 010 011 100 101 cod variable 0 101 100 111 1101 1100 Si tenemos un archivo con 100000 caracteres puede codicarse con I 300000 bits para el código de tamaño jo I 240000 bits para el código de tamaño variable (valor esperado) Algoritmo de Human human(C ) 1 n ← |C | 2 Q←C 3 for i ← 1 to n − 1 4 do new node z 5 left [z ] ← x ← EXTRACT-MIN(Q ) 6 right [z ] ← y ← EXTRACT-MIN(Q ) 7 f [z ] ← f [x ] + f [y ] 8 INSERT(Q , z ) 9 return EXTRACT-MIN(Q) Demostración Sea C un alfabeto, cada c ∈ C tiene una frecuencia f [c ] Sean x e y dos caracteres en C con las frecuencias mas bajas. Existe un código libre de prejos en el cual las representaciones de x e y tiene la misma longitud y dieren solo en el último bit. I Leer la demostración en el libro! Tarea I I I Probar que el algoritmo voraz funciona para el morral fraccional Cambio de monedas óptimo Ejemplos en sistemas operativos (ejercicios del libro): I El trabajo mas corto primero I El trabajo al que le resta el tiempo mas corto para terminar