Está en la página 1de 5

Algoritmos Voraces

Los algoritmos voraces, también llamados ávidos o


glotones, se aplican principalmente a problemas de
optimización, es decir, problemas en los que hay que maximizar
o minimizar algo. Estos algoritmos toman decisiones basándose
en la información que tienen disponible de forma inmediata, sin
tomar en cuenta los efectos que pudieran tener estas decisiones en el futuro.
Su nombre original proviene del término inglés greedy y se debe a su
comportamiento: en cada etapa “toman lo que pueden” sin analizar las
consecuencias, es decir, son glotones por naturaleza.

Los algoritmos voraces son fáciles de inventar, porque no requieren de métodos


sofisticados, como la evaluación de alternativas o métodos de seguimiento que
permitan deshacer las decisiones anteriores. En general, los algoritmos voraces
intentan optimizar una función objetivo. La función objetivo proporciona el
valor de una solución al problema, por ejemplo: la cantidad de monedas que se
utilizarán para dar cambio, la longitud de la ruta construida, el tiempo necesario
para procesar todas las tareas de la planificación. Para hallar el valor de la
función objetivo, los algoritmos voraces construyen la solución de la
siguiente manera:

• Se define un conjunto o lista de candidatos, por ejemplo: el conjunto de


monedas disponibles, las aristas de un grafo que se pueden utilizar para
construir una ruta, el conjunto de tareas que hay que planificar, etc.
• En cada paso se considera al candidato indicado por una función de
selección voraz, que indica cuál es el candidato más prometedor de entre
los que aún no se han considerado, es decir, los que aún no han sido
seleccionados ni rechazados.
• Conforme avanza el algoritmo, los elementos del conjunto inicial de
candidatos pasan a formar parte de uno de dos conjuntos: el de los
candidatos que ya se consideraron y que forman parte de la solución o el
conjunto de los candidatos que ya se consideraron y se rechazaron.
• Mediante una función de factibilidad se determina si es posible o no
completar un conjunto de candidatos que constituya una solución al
problema. Es decir, se analiza si existe un candidato compatible con la
solución parcial construida hasta el momento.

Para poder utilizar esta técnica, el problema debe poder dividirse en sub-
etapas en las que hay varias opciones. La decisión para continuar a la siguiente
etapa se toma eligiendo la opción con el mejor resultado parcial.
El problema de la mochila resuelto con un algoritmo voraz

El problema de la mochila es un problema clásico en el


estudio de los algoritmos. Éste consiste en llenar una
mochila que soporta un peso máximo W. Se tienen n
objetos, cada uno de estos objetos tiene un peso wi y un
valor vi ( i = 1, 2, …, n).

Los objetos se pueden romper en trozos más pequeños al multiplicarlos por


una fracción 0 ≤ xi ≤ 1, de tal manera que el peso del objeto i dentro de la
mochila sea xiwi. De esta manera cada objeto i contribuye en xiwi al peso
total de la mochila y en xivi al valor de la carga.
El problema consiste en maximizar el valor de la carga en la mochila, es decir,
maximizar:

con la restricción:

Tanto los pesos como los valores son positivos (wi >0 y vi >0) y las fracciones
xi pueden ir de cero a 1 (0 ≤ xi ≤ 1). Si utilizamos un algoritmo voraz para
resolver el problema tendremos que los candidatos son los diferentes objetos y
la solución es un vector (x1, x2,…, xn) este vector indica qué fracción de cada
objeto se debe incluir en la mochila. La función objetivo es el valor total de los
objetos que están en la mochila. La solución es factible siempre que se cumpla
la restricción. Cuando la suma de todos los pesos de los objetos enteros es
menor o igual a W, la solución al problema es es trivial (incluir en la mochila
todos los objetos), por lo que asumiremos que esta suma sobrepasa W, para
que el caso sea interesante.

La mochila estará llena si:

Solución óptima

El bucle requiere como máximo n (num. obj.) iteraciones: O(n) (una para cada
posible objeto en el caso de que todos quepan en la mochila)

La función de selección requiere buscar el objeto con mejor relación valor/peso:


O(n)
Coste del algoritmo: O(n)· O(n) = O (n2 )

El pseudocódigo del algoritmo es el siguiente:

Función mochila ( ↓pesos ∊ Real Vector[1…n], ↓valores ∊


Real Vector[1…n], ↓W∊ Entero,
ooooooooooooooooo↓↑x ∊ Real Vector[1…n])
Constantes

Variables
i, suma ∊
Entero
Acciones
suma ← 0
Para i←1
hasta n
x[i] = 0
Fin Para

Mientras suma < W


i ← SeleccionVoraz( x,
pesos, valores ) Si suma
+ pesos[i] ≤ W entonces
x[i]← 1
suma← suma +
pesos[i] sino
x[i]← (W-suma)/ pesos[i]
suma ← W
Fin Si
Fin Mientras
regresar ( x )
Fin Función mochila
Se reciben como datos los vectores con los pesos, con los valores de cada
objeto y también el peso máximo W que soporta la mochila. La función
mochila regresa como solución un vector con los coeficientes por los que se
multiplicará el peso de cada objeto para obtener el peso total W. Primero se
inicializa el vector solución x con cero. Posteriormente se hace una selección
voraz para elegir al mejor objeto, siempre y cuando la suma no sea igual al
peso W. Si al acumular en suma el peso del objeto i no se supera a W, entonces
se incorpora a la suma la totalidad del objeto, es decir, el peso wi multiplicado
por el coeficiente 1, de lo contrario se incorpora a la suma el producto xiwi. Al
observar detenidamente el algoritmo podría pensarse que se puede sustituir :
suma ← W por suma ← suma + x[i]*pesos[i]
Sin embargo, hay que tomar en cuenta que al multiplicar el peso por el
coeficiente xi muy probablemente se obtendrá un número fraccionario que, al
sumarlo con suma, será un valor muy cercano a W pero no exactamente igual
(debido a la limitada precisión de las computadoras), lo que probablemente
haría que se ejecute el ciclo hasta el infinito. Por lo anterior, forzamos a que
suma tome el valor de W.

La estrategia es obtener la relación valor/peso y elegir en el orden de mayor a


menor valor/peso. A continuación un ejemplo propuesto por Brassard & Bratley
[2008].
Para n = 5 objetos y peso máximo que soporta la mochila W=100 kg:

i =1 i =2 i =3 i =4 i =5
Pesos: 10 20 30 40 50 kg

Valores: 20 30 66 40 60 pesos

Valor/peso: 2.0 1.5 2.2 1.0 1.2


pesos/kg

Seleccionamos primero el objeto 3 porque es el que tiene mayor relación


valor/peso, en seguida el objeto 1, después el objeto 2. El objeto 5, con
valor/peso = 1.2$/kg ya no cabe, entonces, para obtener un peso total de 100kg
multiplicamos el objeto 5 por 0.8, así tenemos W= 30kg+10kg+20kg+
(0.8)50kg =100kg. Con este método de selección, el valor final es de $66+$20+
$30+(0.8)$60= $164.

En este caso el vector solución es x={1, 1, 1, 0, 0.8}.

Teorema: “Si se seleccionan los objetos por orden decreciente de la razón valori
/pesoi , entonces el algoritmo de la mochila encuentra una solución óptima”
[Brassard y Bratley, 2008].

Pregunta 1: ¿Cuál sería la mejor función de selección voraz en el caso en el


que todos los objetos tuvieran el mismo valor?

Se seleccionarían primero los objetos más ligeros, para almacenar la mayor


cantidad de objetos en la mochila.

Pregunta 2: ¿Cuál sería la mejor función de selección voraz en el caso en el


que todos los objetos tuvieran el mismo peso?

Habría que elegir primero los objetos más valiosos.


Referencias:
 https://www.ctr.unican.es/asignaturas/programacion2/apuntes/05_voraces_3en1.pdf
 https://es.wikibooks.org/wiki/Algoritmia/Algoritmos_voraces
 http://www.cartagena99.com/recursos/alumnos/temarios/Algoritmos_voraces.pdf

También podría gustarte