Вы находитесь на странице: 1из 25

ALGORITMOS

VORACES
Docente Yudi Guzmán Monteza
27 de Mayo del 2019
Objetivos de la clase
■ Se aprenderá cómo enfrentar problemas que no tienen solución algorítmica rápida
(problemas NP completos).

■ Se aprenderá cómo identificar esos problemas cuando los veas, de tal forma que no
perderás el tiempo buscando un algoritmo rápido para ellos.

■ Se conocerá sobre la estrategia golosa (voraz), una forma muy sencilla de resolver
problemas.
Algoritmos voraces
■ Toman decisiones basándose en la información que tiene disponible de modo
inmediato.

■ No tomar en cuenta los efectos que estas decisiones puedan tener en el futuro.

■ Selecciona la tarea que le parezca más prometedora en un determinado instante


(modo rápido o inmediato).

■ Resulta fáciles de inventar, fáciles de implementar y funcionan eficientemente.

■ Se utilizan típicamente para resolver problemas de optimización.

■ Existen problemas que no se pueden resolver correctamente con algoritmos de esta


naturaleza.
Algoritmos voraces

■ Casos a analizar:
– Dar la vuelta [1]

– El problema de la mochila [1]


CASO: DAR LA VUELTA [1]
Devolver cambio

■ Supongamos que vivimos en un país en el que están disponibles las siguientes


monedas: 100 pesetas, 25 pesetas, 10 pesetas, 5 pesetas y 1 peseta. Nuestro
algoritmo consistirá en diseñar un algoritmo para pagar una cierta cantidad a un
cliente, utilizando el menor número posible de monedas.
■ Por ejemplo, si tenemos que pagar 289 pesetas, la mejor solución consiste en dar
al cliente 10 monedas: 2 monedas de 100, 3 de 25, 1 de 5 y 4 de 1 pesetas.

Algoritmo evidentemente voraz

■ Empieza con nada y en cada fase se va añadiendo las monedas que ya están
seleccionadas como monedas de la mayor denominación posible, pero que no debe
llevarnos más allá de la cantidad que haya que pagar.
Características
■ El algoritmo es voraz porque en cada paso selecciona la mayor de las monedas que
pueda escoger (siguiendo el ejemplo), sin preocuparse por lo correcto de esta
decisión a la larga.

■ El algoritmo es voraz porque nunca cambia de opinión; una vez que una moneda
(siguiendo el ejemplo) se ha incluido en la solución, tal moneda se queda allí para
siempre.

■ Los algoritmos voraces resuelven un problema de forma óptima: Para solucionar el


problema, se dispone de un conjunto o lista de candidatos. Por ejemplo: las
monedas disponibles, las aristas de un grafo que se pueden utilizar para construir
una ruta, el conjunto de tareas que hay que planificar, entre otros casos más.
Funciones
Genera dos conjuntos: El primero conjunto con los candidatos que han sido considerados y
los seleccionados y el segundo conjunto con los candidatos que han sido considerados y
rechazados.
■ La primera función comprueba si un cierto conjunto de candidatos constituye una
solución de nuestro problema; ignorando si es o no óptima por el momento.

■ La segunda función comprueba si un cierto conjunto de candidatos es factible, si es


posible o no completar el conjunto, añadiendo otros candidatos para obtener al menos
una solución del problema. Aquí tampoco preocupa si es óptimo o no.

■ La tercera función de selección indica en cualquier momento cuál es el más prometedor


de los candidatos restantes; que no han sido seleccionados ni rechazados.

■ La cuarta función objetivo que genera el valor de la solución que hemos hallado:
Número de monedas utilizadas para dar la vuelta, la longitud de la ruta que se ha
construido, el tiempo necesario para procesar todas las tareas de planificación o
cualquier otro valor que se quiera optimizar.
Qué significa resuelve “problemas de
optimización”?
■ Buscamos un conjunto de candidatos que constituya una solución que permita
minimizar o maximizar según sea el caso, el valor de la función objetivo.
Procedimiento
■ Los algoritmos voraces avanzan paso a paso.
■ Inicialmente, el conjunto e elementos de elementos seleccionados está vacío.
■ En cada paso se considera añadir a este conjunto el mejor candidato sin considerar los
restantes, estando guiada nuestra elección por la función de selección.
■ Si el conjunto ampliado de candidatos seleccionados ya no fuera factible, rechaza el
candidato que se considera en ese momento.
■ Si el conjunto ampliado de candidatos seleccionados fuera factible, añade el candidato
actual al conjunto de candidatos seleccionados, el mismo que pasará a estar adelante.
■ Cada vez que amplía el conjunto de candidatos seleccionados, comprueba si éste
constituye una. solución para el problema (función objetivo)
■ Cuando el algoritmo voraz funciona correctamente, la primera solución que se encuentra
es siempre óptima.
Inicio

C = {Ф}
S = {Ф}

Imprimir S /
C ≠ {Ф} y no solución No hay
Fin
(S) soluciones

Diagrama
NO

X = seleccionar

de flujo
(C)
C = C U {x}

Añadir siguiente
Factible (S U {x}) SI S = S U {x} Solución (S)
mejor candidato

SI
NO

Devolver S
Rechaza {x}
Pseudocódigo del algoritmo voraz
función voraz (C: conjunto): conjunto
{C es el conjunto de candidatos}
S ← Ф {Construimos la solución en el conjunto S}

mientras C ≠ Ф y no solución (S) hacer


x ← seleccionar (C)
C ← C \ {x}
si factible (S U {x}) entonces S ← S U {x}
si solución(S) entonces devolver S
sino devolver “no hay soluciones”

Fuente: Brassard & Bratley, 1997


Volviendo al caso: DAR LA VUELTA [1]
Devolver cambio

■ Supongamos que vivimos en un país en el que están disponibles las siguientes


monedas: 100 pesetas, 25 pesetas, 10 pesetas, 5 pesetas y 1 peseta. Nuestro
algoritmo consistirá en diseñar un algoritmo para pagar una cierta cantidad a un
cliente, utilizando el menor número posible de monedas.
Adecuamos las características generales de los algoritmos
voraces a las características particulares del problema

■ Los candidatos son el conjunto de monedas que representan el ejemplo: 100, 25,
10, 5 y 1 pesetas. Con muchas monedas de cada valor que permita muchas
alternativas. El conjunto de candidatos debe ser finito.
■ La función solución comprueba si el valor de las monedas seleccionadas hasta el
momento es exactamente el valor que hay que pagar.
■ Un conjunto de monedas será factible si su valor total no sobrepasa la cantidad que
haya que pagar.
■ La función de selección toma la moneda de valor más alto que quede en el conjunto
de candidatos.
■ La función objetivo cuenta el número de monedas utilizadas en la solución.
Pseudocódigo del algoritmo “Devolver el
cambio”
función {devolver-cambio } (n: conjunto de monedas)
{Da el cambio de n unidades utilizando el menor número posible de monedas.
La constante C especifica las monedas disponibles}

const ← C {100, 25, 10, 5, 1}


S ← Ф {S es un conjunto que contendrá la solución}
s ← 0 {s es la suma de los elementos de S}
mientras S ≠ n hacer
x ← el mayor elemento de C tal que s+x <= n
si no existe ese elemento entonces
devolver “no hay soluciones”
S ← S U {una moneda de valor x}
s←s+x
devolver S
Limitaciones en el caso: Devolver el
cambio:
■ Si se cuenta con un suministro adecuado de los valores de cada una de las monedas
entonces siempre se producirá una solución óptima para el problema.

■ Con una serie de valores diferentes o si el suministro de alguna de las monedas está
limitado, el algoritmo voraz puede que no funcione correctamente. Veamos:

– Algún caso se puede seleccionar un conjunto de monedas que no sea el óptimo,


es decir el conjunto contiene más monedas que las necesarias.
– O sencillamente no llega a encontrar una solución con los datos disponibles, es
decir que no se disponga de los suministros suficientes.
CASO: El problema de la mochila [1]
■ Nos dan n objetos y una mochila.

■ Para i = 1, 2, …, n. El objeto i tiene un peso positivo wi y un valor positivo vi.

■ La mochila puede llevar un peso que no sobrepase W.

■ Objetivo: Llenar la mochila de tal manera que se maximice el valor de los objetos transportados,
respetando la limitación de capacidad en peso impuesta.

■ En esta versión del problema: Suponemos que se pueden romper los objetos en trozos más
pequeños, de manera que podamos decidir llevar solamente una fracción xi del objeto i, con 0
<= xi <= 1.

■ En este caso, el objeto i contribuye en xiwi, al peso total de la mochila, y en xiwi al valor de la
carga.
CASO: El problema de la mochila [1]

■ En símbolos el problema se puede enunciar:

n n
maximizar Σ xivi con la restricción Σ xivi <= W
i =1 i =1

Donde vi > 0; wi < 0 y 0 <= xi <= 1; para 1 <= i <= n.

■ Las condiciones que afectan a vi y a wi son restricciones sobre el problema.

■ La condición de xi son restricciones sobre la solución.


Adecuamos las características generales de los
algoritmos voraces al problema de la mochila [1]
■ Los candidatos serán los diferentes objetos que entraran en la
mochila.

■ El conjunto solución es un vector (x1,…,xn) que nos dice qué fracción


de cada objeto hay que incluir.

■ El conjunto de soluciones factibles respetarán las restricciones


indicadas respecto a no sobrepasar un límite determinado.

■ Función objetivo será el valor total de los objetos (fracciones de


objeto) que están en la mochila.

■ Qué debemos tomar como función de selección?


Adecuamos las características generales de los
algoritmos voraces al problema de la mochila [1]
n
■ Si Σ wi <= W Lo óptimo es meter todos los objetos en la mochila.
i =1
■ Casos interesantes:
n
Σ wi > W
i =1
■ Solución óptima: Debe llenar exactamente la mochila.
n
Σ wi = W
i =1
■ Estrategia general: Seleccionar cada objeto x turno en algún orden adecuado; poner
la mayor fracción posible del objeto seleccionado en la mochila y detenernos
cuando la mochila está llena.
El problema de la mochila [1]
■ Existen por lo menos tres funciones de selección posibles:
– En cada fase, podemos seleccionar el objeto más valioso, argumentando que
esto incrementa el valor de la carga del modo mas rápido posible
– Podemos seleccionar el objeto mas ligero restantes, basándonos en que de
este modo la capacidad se agota de la forma más lenta posible
– Podemos evitar estos extremos seleccionando aquel objeto cuyo valor por
unidad de peso sea el mayor posible.

■ En el ejemplo siguiente, trabajaremos con 5 objetos y con una capacidad de peso


máxima de la mochila de 100 Kg. Asimismo, asignaremos un valor a cada objeto
que ingrese a la mochila.
El problema de la mochila [1]
n=5 W = 100

■ n=5
■ W = 100 w 10 20 30 40 50
v 20 30 66 40 60
■ El costo por cada objeto de la v/w 2,0 1,5 2,2 1,0 1,2
mochila

Tres funciones selección posible:


■ Aplicaremos el último enfoque Valor
respecto a seleccionar los Seleccionar: xi (costo)
objetos cuyo valor por unidad Máx vi 0 0 1 0,5 1 146
de peso sea la mayor posible Mín wi 1 1 1 1 0 156
vi/wi Máx vi/wi 1 1 1 0 0,8 164

XI = Fracciones del objeto que puede entrar en la mochila

Las opciones de xI está ordenado en forma ascendente


respecto al peso w
Teorema que soluciona el problema de la mochila [1]
Seleccionando los objetos por orden
Datos del problema
decreciente de vi/wi, el algoritmo mochila
encuentra una solución óptima n = 5, W = 100
■ Seleccionar los objetos por orden
decreciente de los valores de los w 10 20 30 40 50
costos y beneficios máximos de cada v 20 30 66 40 60
objeto (vi/wi)

Corriendo la solución del problema


■ Por cada objeto o fracción de peso del
objeto que entre en la mochila, se v 66 20 30 60 40
realiza el descuento al W, respecto del w 30 10 20 50 40
wi que ingrese.
v/w 2,2 2,0 1,5 1,2 1,0

■ Asimismo, por cada objeto o fracción


de peso del objeto que entre en la v=0 66 86 116 164
mochila, se realiza el incremento al w = 100 70 60 40 0
valor de la carga, respecto del wi que
ingrese. Valor de
solución
Pseudocódigo del problema de la mochila [1]”

función mochila (w[1…n], v[1…n], W): matriz [1…n]


{Inicialización}

para i = 1 hasta n hacer x [i] ← 0


peso ← 0
{bucle voraz}
mientras peso < W hacer
i ← el mejor objeto restante {se analizó arriba}
si peso + w [i] <= W entonces x [i] ← 1
peso ← peso + w [i]
sino x [i] ← (W - peso) / w [i]
peso ← W {almacena el peso de las
fracciones de cada objeto}
devolver x

Fuente: Brassard & Bratley, 1997


CASO: El problema de la mochila [1]

ESTEREO LAPTOP GUITARRA


$ 3000 $ 2000 $ 1500
30 LB 20 LB 15 LB

Estás intentando maximizar el valor de los objetos que se pone en la mochila, pero sólo
puedes llevar lo que cabe en la mochila. La mochila soporta hasta 35 libras. Qué
algoritmo usarías?
LABORATORIO

■ Implementar el algoritmo voraz para cualquiera de los dos casos desarrollados en


clase:

– Caso: Dar la vuelta [1]


– Caso 2: El problema de la mochila [1]

Вам также может понравиться