Sei sulla pagina 1di 5

Algoritmos vidos (glotones, voraces)

Los algoritmos vidos son algoritmos en los que tomamos decisiones locales
para llegar a una cantidad ptima global. En este sentido, son parecidos a los
de programacin dinmica. La diferencia es que para resolver un problema con
programacin dinmica, tomamos en cuenta todas las soluciones para los
subproblemas anteriores y con esto encontramos la solucin ptima; mientras
que para resolver un problema mediante un algoritmo vido, slo tomamos la
solucin ptima del subproblema anterior y con esto calculamos la ptima
actual (por lo que no necesitamos guardar datos).

Esto es, empezamos por el caso ms sencillo y en cada paso tomamos la


decisin que resulte ms eficiente en ese momento, con lo que esperamos llegar
a

una

solucin

ptima

global,

sin

reconsiderar

opciones.

Los algoritmos vidos encuentran las soluciones mucho ms rpido que por
programacin dinmica, y muchas veces que por cualquier otro mtodo. El
problema es que, aunque el enfoque es generalmente fcil de implementar, en la
mayora de las ocasiones falla por no tomar en cuenta todas las combinaciones.
Es por esto que no es conveniente utilizarlo a menos de que estemos
convencidos de que funciona (preferentemente con una demostracin).
Entre los algoritmos ms conocidos que utilizan un enfoque vido, se
encuentran los de Dijkstra, Prim y Kruskal (secciones 10.4 y 10.6) que
funcionan en grficas.

A veces son utilizados para disear algoritmos heursticos para problemas NPcompleto, con lo que podemos obtener una buena aproximacin de la solucin en
poco tiempo. De acuerdo a la complejidad del problema, un enfoque vido nos
puede dar una aproximacin suficientemente buena o, si queremos una
respuesta ptima, podemos utilizarla para realizar podas en una bsqueda
exhaustiva.

Problema ejemplo

Conferencia
Problema
Es comn que las conferencias cientficas estn divididas en varias secciones
simultneas. Por ejemplo, puede haber una seccin para computacin en
paralelo, otra para visualizacin, otra para compresin de datos, y as
sucesivamente.
Es obvio que se necesita realizar el trabajo de varias secciones de forma
simultnea para reducir el tiempo de la conferencia y tener suficiente tiempo
para las comidas, tomar caf, y las discusiones informales. Sin embargo, es
posible que se estn dando ponencias interesantes de forma simultnea en
distintas
secciones.
Un participante ha escrito una tabla con los horarios de todas las ponencias
que le interesan. Te ha pedido que encuentres la cantidad mxima de ponencias
a los que puede asistir.
Entrada
La primera lnea contiene el nmero 1 n 100000, que es la cantidad de
ponencias interesantes. Cada una de las siguientes n lneas contiene a dos
enteros ts y te separados por un espacio (1 ts < te 30000). Estos nmeros
corresponden al horario en que las ponencias empiezan y terminan. Los horarios
estn dados en minutos a partir del inicio del evento.
Salida
Debers escribir la cantidad mxima de ponencias a las que el participante
puede asistir. El participante no puede estar en dos ponencias al mismo tiempo,
y a las ponencias a las que asista tienen que estar separadas por un minuto por
lo menos. Por ejemplo, si una ponencia termina en el minuto 15, la siguiente
ponencia a la que puede asistir debe empezar al minuto 16 o despus.
Solucin: Si tenemos dos o ms ponencias que terminan a la misma hora, slo
consideramos la que empieza ms tarde (por lo que dura menos). Una vez hecho
esto, tomamos los datos ordenados por lo hora a la que terminan (de menor a
mayor), y recorremos los datos incrementando un contador cada que podamos
tomar una conferencia.

Cdigo

En las primeras tres lneas definimos las variables que vamos a utilizar.
En n leemos la cantidad de ponencias, i lo usamos para los ciclos, ini y fin para
leer el inicio y final de las ponencias, y el arreglo res para ordenar los datos.
Los datos los ordenaremos en un arreglo, de manera similar a como lo haramos
con una ordenacin por conteo, ya que el valor mximo de n es
significativamente mayor al mximo de fin. En la k-sima casilla de res vamos a
guardar el valor de la hora a la que inicia la ponencia que termina a las k horas.
En seguida buscamos la cantidad mxima de segmentos que no se traslapan
(lneas 5 a 16). El entero i lo usamos para ciclos, r para guardar el resultado
y fin para saber donde termina el ltimo segmento que utilizamos. Empezamos
inicializando r y fin a cero. Buscamos en el intervalo por el primer segmento
cuyo inicio sea posterior a fin (el siguiente segmento que no se sobrepone). Una
vez que lo encontramos, incrementamos el resultado y le asignamos a fin el
final de este segmento. Podemos obtener los valores mximo y mnimo de los

finales de los segmentos para no tener que recorrer valores innecesarios


dentro del ciclo, aunque no es una mejora significativa.
La parte principal del cdigo la tenemos entre las lneas 18 y 26. Empezamos
leyendo la cantidad de ponencias (lnea 19). Para cada ponencia, leemos la hora
de entrada y salida (lnea 22) y si la hora de entrada es mayor a la que
tenamos, la actualizamos (lnea 23). Terminamos escribiendo el nmero mximo
de
ponencias
(segmentos)
que
no
se
empalman
(lnea
25).

Caso ejemplo

Cdigo en C

Tiempo de ejecucin

Potrebbero piacerti anche