Algoritmos Voraces

Anuncio
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
Descargar