Está en la página 1de 43

Programación y Estructuras de

Datos Avanzadas

Capítulo 3: Algoritmos voraces


Capítulo 3: Algoritmos voraces

Capítulo 3: Algoritmos voraces


3.1 Planteamiento y esquema general
• El esquema voraz (greedy algorithms) se aplica a problemas de optimización
en los que la solución se puede construir paso a paso sin necesidad de
reconsiderar decisiones ya tomadas.
– El problema se interpreta como: “seleccionar algunos elementos de entre un
conjunto de n candidatos que constituya una solución y que optimice
(maximice o minimice) una función objetivo”.
– El orden el que se eligen estos elementos puede ser importante o no.

• Un algoritmo voraz funciona por pasos:


– Inicialmente partimos de una solución vacía.
– En cada paso se escoge el candidato más prometedor de los disponibles
(relacionado con la función objetivo) y se decide si se incluye o no en la
solución.
– Una vez tomada esta decisión no se podrá deshacer.
– El algoritmo acabará cuando el conjunto de elementos seleccionados constituya
una solución.

2
Capítulo 3: Algoritmos voraces

• Esquema general de un Algoritmo voraz:


Entrada: c conjunto de candidatos inicial Salida: conjunto solución (subconjunto de c)

1. Comenzamos con un conjunto solución vacío


Itera 2 a 5 mientras queden candidatos y no se
haya alcanzado la solución
2. Función de selección: devuelve el candidato más prometedor de los
que todavía no se han considerado. Relacionado con la optimización.
Necesaria demostración de optimalidad
3. Se elimina dicho candidato del conjunto de candidatos posibles (c)

4. Se comprueba si el conjunto resultante de


incorporar el candidato a la solución es factible o
completable (es decir si cumple las restricciones al
problema para llegar a ser solución)
5. En caso afirmativo se añade a la solución, en caso
negativo se descarta y ya no se incorporará nunca a
la solución final

Determina si el conjunto factible sol es


solución o no
Características:
− Al no reconsiderar decisiones son
algoritmos eficientes.
− Aunque puedan parecer sencillos →
demostración optimalidad compleja.
3
Capítulo 3: Algoritmos voraces

• Ejemplo: Problema del cambio de monedas


 Contamos con un conjunto de monedas de determinados valores.
 Problema: construir un algoritmo que dada una cantidad P devuelva esa
cantidad usando el menor número posible de monedas.

Disponemos un nº ilimitado
de monedas con valores de
1, 2, 5, 10, 20 y 50 céntimos
de euro, 1 y 2 euros (€).

Caso 1. Devolver 3,89 Euros.


1 moneda de 2€, 1 moneda de 1€, 1 moneda de 50c, 1 moneda de 20c, 1
moneda de 10c , 1 moneda de 5c y 2 monedas de 2c.
Total: 8 monedas
El método intuitivo se puede entender como
un algoritmo voraz: en cada paso añadir una
moneda nueva a la solución actual, hasta
llegar a P. 4
Capítulo 3: Algoritmos voraces

Adaptación de este problema al esquema general:


− Conjunto de candidatos: todos los tipos de monedas disponibles. Supondremos una cantidad
ilimitada de monedas de cada tipo.
− Solución: conjunto de monedas que sumen P.
− Función objetivo: minimizar el número de monedas.

Funciones del algoritmo:


− Seleccionar: escoge la moneda de mayor valor que todavía no ha sido descartada. Habría que
demostrar su optimalidad.
− Factible: comprueba si el valor de las monedas seleccionadas en s es ≤P.
− Solucion: comprueba si el valor de las monedas de s es igual a P.
→ En la práctica , en vez de ir de 1 en 1 moneda, seleccionar utiliza el cociente de la división
entera: P div m (siendo m la siguiente moneda de mayor valor)=nº de monedas de valor
m que hay incluir en la solución. De esa forma factible es siempre cierto.

Optimalidad: ¿está asegurada la solución óptima?


− Depende del sistema monetario.
− Ejemplo. Supongamos que tenemos monedas de 1€, 90c y 1c
y queremos devolver 1,80 € (P=1,80€).
• Algoritmo voraz. 1 moneda de 1€ y 80 monedas de 1c: total 81 monedas.
• Solución óptima. 2 monedas de 90c: total 2 monedas → no sirve voraz. 5
Capítulo 3: Algoritmos voraces

Consideraciones:
− Vamos a suponer que tenemos n tipos de moneda que son potencias consecutivas de m.
Tipos de moneda: T={m0,m1,m2,..mn-1}
− Conjunto de candidatos: una cantidad ilimitada de cada tipo de moneda de T.

Comienzo con el último elemento del vector T[i],


o lo que es lo mismo con la moneda más alta

Asigna la siguientes monedas (no necesita


factible, porque si no caben ya asigna 0)
Actualiza la cantidad restante
Pasa al siguiente tipo de monedas

Coste: se ejecutan 2 bucles consecutivos de n iteraciones con todas las instrucciones elementales
→ O(n), siendo n el nº de tipos de monedas disponibles.
6
Capítulo 3: Algoritmos voraces
Demostración de optimalidad
− Los algoritmos voraces son sencillos y rápidos pero requieren la demostración de optimalidad
→ Demostrar que la función de selección conduce a la solución óptima: no suele ser sencillo.

7
Capítulo 3: Algoritmos voraces

3.2 Algoritmos voraces con grafos


• Árbol de recubrimiento mínimo (ARM):
– Sea G=<N,A> grafo conexo y no dirigido cuyas aristas tienen asignados pesos no
negativos.
– Objetivo: cálculo del subconjunto ARM de aristas de G de forma que conecte todos sus
nodos con un peso total mínimo. Contiene exactamente n-1 aristas y puede no ser único
si hay aristas de igual peso.
– Dos algoritmos voraces para resolver este problema: algoritmo de Prim y algoritmo de
Kruskal.
– Suponiendo que los nodos son ciudades y las aristas son carreteras de una determinada
longitud/coste: encontrar que carreteras tengo que construir para que estén conectadas
todas las ciudades y con un coste total mínimo. También se utiliza para asegurar la
conectividad en redes, etc.

• Camino de coste mínimo:


– Sea G=<N,A> grafo dirigido, con pesos mayores o iguales que cero en sus aristas y en el
que los nodos son accesibles desde uno concreto considerado como origen.
– Objetivo: determinar la longitud del camino de coste mínimo que va desde el nodo
origen a cada uno de los demás nodos del grafo → algoritmo de Dijkstra.
– Suponiendo que los nodos son ciudades y las aristas carreteras esto permitiría calcular la
ruta más corta entre una ciudad y todas las demás o entre 2 ciudades cualesquiera.
8
Capítulo 3: Algoritmos voraces

3.2.1 Árboles de recubrimiento mínimo: algoritmo de Prim


• Sea G=<N,A> grafo conexo y no dirigido cuyas aristas tienen asignados pesos no negativos.
i. Selecciona un nodo del grafo como raíz del árbol de recubrimiento (AR).
ii. En cada paso, se añade al árbol una arista de coste mínimo (u,v) tal que AR∪{(u,v)} sea
también un árbol (esto implica que uno de los nodos u o v ya estaban en AR pero el otro no).
iii. El algoritmo termina hasta que AR contiene n-1 aristas.

Inicializo el conjunto de aristas del árbol de recubrimiento mínimo

NA: conjunto de nodos en el AR. Lo inicializo


tomando cualquier nodo como raíz.

En cada paso cojo la arista mas corta que conecte un


nodo que ya está en el árbol de recubrimiento (u) con
uno nodo de los que aún no están en el árbol (v). No
necesito factible.

Incorporo la arista a la solución y el


nodo v al árbol de recubrimiento.

9
Capítulo 3: Algoritmos voraces
Demostración de optimalidad algoritmo de Prim
• Conjunto prometedor: conjunto de aristas factible (sin ciclos) que se puede extender hasta llegar a
la solución óptima. Arista que sale de un conjunto de nodos: sólo tiene un extremo en él.

10
Capítulo 3: Algoritmos voraces

Descripción detallada del algoritmo de Prim


• Grafo de n nodos → N={1,2,..n} array de n enteros,
nodo 1 raíz
• Array nodoMinimo[i], donde el nodo i∈N\NA →
indica el nodo de NA más próximo al nodo i, siendo
costeMinimo[i] el coste del nodo i a dicho nodo (un
nodo que ya esté en NA se indicará asignando su
costeMinimo[i]=-1).
• En este algoritmo no se utiliza explícitamente NA
(conjunto nodos ya incluidos en el árbol).

Añado la arista a la solución

Función que devuelve la distancia/coste entre 2 nodos

11
Capítulo 3: Algoritmos voraces
Ejemplo de ejecución

Clave: contiene la distancia mínima de los nodos del AR a cada uno de los nodos restantes

2º y 5º nodo Coste:
- bucle principal n-1 veces y dentro de dicho
bucle hay 2 bucles que se ejecutan n-2
veces. Implementando el grafo con una
matriz adyacencia: O(n2)
- Alternativa: usar listas de adyacencia
junto con un montículo (el montículo
almacena los candidatos pendientes):
O(alog n), donde a es el nº de aristas:
(disperso) n-1≤a≤n(n-1)/2 (denso), por lo
que sólo compensa si el grafo es disperso.

12
Capítulo 3: Algoritmos voraces

3.2.2 Árboles de recubrimiento mínimo: algoritmo de Kruskal


• Cambia la forma de seleccionar las aristas:
i. Comienza con un conjunto de aristas AR vacío, de forma que parto de n componentes
conexas de 1 nodo cada una.
ii. En cada paso selecciona la arista más corta (independientemente de en donde esté) que no
haya sido añadida a AR (selecciona las aristas por orden creciente de longitud).
iii. La arista se añadirá a la solución si y solo si sus nodos están en componentes conexas
distintas (si estuviesen en la misma, se formaría un ciclo y la solución no sería factible).
iv. El algoritmo termina hasta que AR contiene n-1 aristas.

Las aristas se ordenan de menor a mayor pues así se van a


seleccionar.

Calculamos en qué componente conexa se encuentra cada nodo

Función factible (comprueba si u y v están en componentes conexas distintas)


Se fusionan ambas componentes conexas
Añado la arista a la solución

13
Capítulo 3: Algoritmos voraces

Demostración de optimalidad

14
Ejemplo de ejecución Capítulo 3: Algoritmos voraces

Coste: varía en una cte.


- Ordenación de a aristas O(a log a)≡O(a log n), cumpliéndose (disperso) n-1≤a≤n(n-1)/2 (denso)
- Bucle principal a veces, pero fusionar y buscarComponenteConexa son O(1), por lo que el coste
viene dado por la ordenación.
Grafo disperso: Kruskal → O(n log n); Grafo denso: Prim → O(n2) 15
Capítulo 3: Algoritmos voraces

3.2.3 Camino de coste mínimo: algoritmo de Dijkstra


• Sea G=<N,A> grafo dirigido, con pesos mayores o iguales que cero en sus aristas, en
el que todos sus nodos son accesibles desde uno concreto considerado como origen.
• El algoritmo de Dijkstra determina la longitud del camino de coste, peso o distancia
mínima que va desde el nodo origen a cada uno de los demás nodos del grafo.
i. Utiliza 2 conjuntos de nodos S y C:
S → nodos ya seleccionados y cuya distancia mínima al origen ya se conoce
C → contiene el resto de los nodos (C=N\S).
ii. La función de selección elegirá en cada paso el nodo de C cuya distancia al origen
sea mínima.
iii. El algoritmo termina hasta que AR contiene n-1 aristas.
iv. En cada paso del algoritmo especial[] es un array, de forma que especial[i] es la
longitud del camino especial (es un camino que va del nodo origen a cualquier
otro nodo en el que todos los nodos intermedios pertenecen a S) más corto del
nodo origen al nodo i-ésimo.
v. A la salida, especial[] contendrá las longitudes de los caminos mínimos buscadas.
16
Capítulo 3: Algoritmos voraces

• Algoritmo (se incluye predecesor[] para almacenar el camino) :

Devuelve la longitud de la arista entre 2 nodos (∞ si no existe)

La función seleccionar devuelve el nodo


de los que quedan en C (todavía no
incluido en S) con menor especial

Se elimina el nodo de C (≡ se añade a S)

Actualizamos especial[]

17
Capítulo 3: Algoritmos voraces

Ejemplo de ejecución

Coste (grafo n nodos y a aristas):


- Bucle mientras → n iteraciones. Dentro de este bucle ya 2 bucles adicionales:
• Bucle que calcula el nodo que minimiza especial → O(n)
• Bucle para → O(n)
- Por lo tanto el coste es cuadrático → O(n2)
- Se puede mejorar si se evita examinar todo el array especial[] utilizando un montículo de mínimos
de forma que en la raíz estaría el que minimiza especial[]. Esto permitiría obtener un coste
O((n+a)log n) → Grafo disperso: O(n log n); Grafo denso: O(n2 log n), por lo que sólo compensa si
el grafo es disperso.

18
Capítulo 3: Algoritmos voraces

19
Capítulo 3: Algoritmos voraces

3.3 Algoritmos voraces para planificación


• Planificación de forma óptima una serie de tareas que deben llevarse a
cabo por un agente o servidor (o un número determinado de ellos).

• Hay 2 variantes:
 Minimización del tiempo del sistema
– Planificar el orden de realización de unas tareas de forma que se minimice el tiempo
total que están los clientes en el sistema (o tiempo medio de espera por cliente).

 Planificación con plazos


– Aquí tenemos n tareas con beneficio bi y con una fecha tope de ejecución fi. El objetivo
es planificar la realización de algunas (o todas) tareas de forma que se minimice el
beneficio obtenido (sólo se obtiene beneficio de una tarea si ésta se ejecuta antes de
superar su fecha límite).

20
Capítulo 3: Algoritmos voraces

3.3.1 Minimización del tiempo del sistema


• n clientes/tareas que esperan un servicio de un determinado agente o servidor.
• ti: tiempo de servicio → es el tiempo que requerirá el agente/servidor en ejecutar la tarea i-
ésima (o atender al cliente i).
• Objetivo: seleccionar el orden de ejecución de tareas de forma que se minimice el tiempo medio
de estancia/espera de los clientes en el sistema.
• Ejemplo: 3 clientes con tiempos de servicio t1=2, t2=8 y t3=4. Hay 6 posibilidades de atender a
los 3 clientes:

Óptima (orden creciente de ti)

Peor (orden decreciente de ti)

• Algoritmo voraz → selecciona los clientes en orden creciente de tiempos de servicio (factible
no es necesario).
• Pseudocódigo → sólo necesitaríamos un algoritmo de ordenación de los tiempos de servicio.
• Coste → el de la ordenación de elementos: O(n log n). 21
Capítulo 3: Algoritmos voraces

22
Capítulo 3: Algoritmos voraces

Generalización a a agentes iguales

23
Capítulo 3: Algoritmos voraces

3.3.2 Planificación con plazos


• n tareas: cada tarea i tiene asignado un beneficio bi>0 y un plazo de ejecución fi>0.
– Para cualquier tarea i, se obtiene el beneficio bi ↔ el trabajo se realiza no más allá de su
fecha tope.
– Las tareas se realizan en una única máquina que sólo puede realizar una tarea cada día.
• Objetivo: seleccionar la secuencia de tareas a realizar para que el beneficio total sea
máximo.
• Solución factible: conjunto de tareas S para el que existe al menos una secuencia
que permite que todas las tareas del conjunto se ejecuten en su plazo. Beneficio de
dicha solución → suma de los beneficios de todos los trabajos que contiene: ∑ bi
i∈S

• Ejemplo: n=4 con los siguientes beneficios y plazos:

Óptima
Soluciones factibles, secuencia de
realización y beneficios obtenidos
(la secuencia 1,4 no es factible)

24
Capítulo 3: Algoritmos voraces

• Algoritmo voraz:
– Función de selección: elige los trabajos en orden decreciente de beneficios.
– Función completable: en cada paso, el trabajo se incorpora a la solución S, si al
unir dicho trabajo a S éste sigue siendo factible.

Conclusión: basta con comprobar si es factible la secuencia en orden no decreciente


de fechas (de menor a mayor fi) para saber si un conjunto de tareas es o no factible.
→ No hace falta comprobar todas permutaciones/secuencias.
25
Capítulo 3: Algoritmos voraces

Descripción de alto nivel


(los índices i de F[i] contienen las
tareas ordenadas de mayor a menor
beneficio)

26
Capítulo 3: Algoritmos voraces
Algoritmo detallado:

(El array f[i] almacena las fechas tope en orden decreciente de beneficios)

Como mucho podré planificar n tareas

Para cada tarea i-ésima el algoritmo comprueba


que se pueda insertar sin desplazar a las tareas ya
planificadas mas allá de su plazo. Si es posible
inserta dicha tarea y sino la descarta.
Corro las tareas hacia la
derecha para hacer hueco

Añado la tarea en la posición r+1

27
Capítulo 3: Algoritmos voraces

Ejemplo de ejecución
- n=5
- bi=(20,15,10,5,1)
- fi=(2,2,1,3,3)

El elemento i=3 lo descarta


porque la solución no sería
factible

Planificación óptima: 1,2,4


Beneficio: 40

Coste:
- Ordenación de f[n] en orden decreciente de beneficios → O(n log n)
- Caso peor: todas las tareas en f también están ordenadas por orden decreciente de
plazos y se pueden incluir en la planificación. En este caso para cada tarea i, el
algoritmo evalúa las i-1 tareas ya seleccionadas, encuentra su ubicación y realiza los
desplazamientos oportunas (bucle anidado) → O(n2)

28
Capítulo 3: Algoritmos voraces

• Algoritmo mejorado:
– Se consigue mejorar la eficiencia si cada tarea (seleccionada en orden decreciente
de beneficios) se programa lo más tarde posible (de acuerdo a su plazo de
ejecución y siempre que haya hueco).
– Empezando con una planificación vacía, para cada tarea i∈S se planifica i en el
instante t, siendo t el mayor entero tal que 1≤t≤min(n,fi) y la tarea que se
ejecutará en t no se ha decidido todavía.

29
Capítulo 3: Algoritmos voraces
Pseudocódigo algoritmo mejorado:

Inicializo n conjuntos disjuntos (partición)

Esto comprueba si hay hueco para colocar la tarea i

busco el conjunto anterior

Fusiono los conjuntos k y l

Comprimo S[]
eliminando los ceros

30
Capítulo 3: Algoritmos voraces

Ejemplo de ejecución
- n=5, bi=(20,15,10,5,1) y fi=(2,2,1,3,3)

Coste:
- Ordenación de f[n] en orden decreciente de beneficios → O(n log n)
- Fase de inicialización → O(n)
- 2n operaciones buscar O(1) y n operaciones fusionar O(1) → O(n)
- Total → O(n log n)
31
Capítulo 3: Algoritmos voraces

3.4 Almacenamiento óptimo en un soporte secuencial


(similar a minimización del tiempo del sistema)
• Tenemos n programas p1, p2,..pn de longitudes l1,l2, ln.
• Contamos con un soporte secuencial de longitud L, lo que indica que se podrán
almacenar los programas en el soporte si y sólo si la suma de sus longitudes no
supera L.
• Suposición: para poder acceder a un programa pi tendremos que posicionar el
mecanismo de acceso al comienzo del soporte.
• Si los programas están almacenados en el orden I=i1,i2,…,in, el tiempo necesario
para recuperar el programa ij es tj=∑1≤k≤j lik
de donde el tiempo total para acceder a los n programas para el orden I:
D(I)=∑1≤j≤n tj = ∑1≤j≤n ∑1≤k≤j lik
• Objetivo: encontrar una secuencia de almacenamiento de los programas (I) que
minimice el tiempo medio de acceso D(I)/n (equivale a minimizar el tiempo total )
• Esto se consigue si seleccionar elige los programas en orden creciente de longitudes
(porque al posicionarse siempre desde el principio, los primeros son los que más
van a influir en el tiempo de acceso del resto).

32
Capítulo 3: Algoritmos voraces

Funciones del esquema general


 Resolución de un problema de forma óptima: almacenar una serie de
programas en un soporte secuencial de manera que el tiempo medio de acceso
sea mínimo.
 Conjunto inicial de candidatos: los n programas.
 Conjunto de candidatos seleccionados: inicialmente el conjunto de candidatos
ya escogidos está vacío.
 Solución: si la suma de las longitudes de todos los programas es como mucho L
se alcanzará la solución cuando los n programas se hayan seleccionado en el
orden adecuado y se hayan almacenado.
 Factible: si la suma de las longitudes de todos los programas es como mucho L
el conjunto resultante siempre es factible.
 La función de selección se traduce en la selección de los programas en orden
no decreciente de longitudes.
 La función objetivo no aparece explícitamente en el algoritmo

33
Capítulo 3: Algoritmos voraces

Algoritmo voraz

En orden creciente de longitudes

Coste:
- La implementación del conjunto del programas y del conjunto solución se puede
hacer en un array.
- Coste de ordenar los programas de menor a mayor coste → O(n log n)
- Coste del bucle mientras → O(n)
- Total → O(n log n)

Demostración de optimalidad y generalización a n soportes secuenciales: similar a


minimización tiempo del sistema.
34
Capítulo 3: Algoritmos voraces

3.5 Problema de la mochila con objetos fraccionables


 Datos del problema:
– n: número de objetos disponibles.
– M: peso máximo admitido por la mochila.
– p = (p1, p2, ..., pn) pesos de los objetos.
– v = (v1, v2, ..., vn) valores/beneficios de los objetos.

 Objetivo: llenar la mochila (con objetos o fracciones de objetos) de manera que


se maximice el valor total de los objetos almacenados en ésta.
 Formulación matemática:
Maximizar ∑ x i vi , sujeto a la restricción ∑ x ipi ≤ M y 0 ≤ x i ≤ 1
i=1..n i=1..n

 Esquema voraz:
• Conjunto de candidatos → objetos o fracciones de objetos.
• Función objetivo → valor total de los objetos almacenados en la mochila.
• Conjunto solución → array n de reales: x= (x1, x2, ..., xn), 0≤xi≤1. Al ser los objetos
fraccionables, la solución óptima ha de llenar exactamente la mochila.
• ¿Función de selección?

35
Capítulo 3: Algoritmos voraces

Función de selección → 3 posibilidades:


1) Seleccionar el objeto más valioso de los restantes
2) Seleccionar el objeto de menos peso de los restantes
3) Seleccionar el objeto con mayor valor por unidad de peso de los restantes.

Ejemplo: n=3, M=20, (p1,p2,p3) = (18,15,20) y (v1,v2,v3) = (25,24,15)

Valor por unidad de peso de los objetos: (p1/v2, p1/v2, p3/v3) = (1.388,1.6,1.5)

36
Capítulo 3: Algoritmos voraces

Algoritmo voraz

La solución inicial no selecciona ningún objeto o fracción

Función seleccionar
Factible: comprueba si el siguiente objeto cabe entero
Si cabe, lo meto entero

Coste:
- Coste de ordenar los objetos en orden
decreciente de vi/pi → O(n log n)
Si no cabe, meto la fracción
correspondiente. - Coste del resto → O(n)
- Total → O(n log n) 37
Capítulo 3: Algoritmos voraces

• Demostración de optimalidad

38
Capítulo 3: Algoritmos voraces

3.6 Mantenimiento de la conectividad


• Operadora de comunicaciones de 8 nodos conectados entre sí mediante fibra óptica .
• Cada conexión tiene un coste c(i,j)=(i×j) mod 6.
 Objetivo: reducir las conexiones manteniendo la conectividad de la red a coste mínimo.
Problema del cálculo del ARM → Algoritmo de Prim o Kruskal

3.8 Problema del robot desplazándose en un circuito


• Robot R que dispone de una batería de N unidades de
energía.
• Se tiene que desplazar desde un punto origen hasta un punto
de salida del circuito.
• En el circuito se puede encontrar obstáculos O que serán
infranqueables.
• El paso de una casilla infranqueable supone un gasto total de
energía igual al indicado por ésta.

 Objetivo: encontrar el camino hasta la salida con un consumo de energía mínimo.


Problema del cálculo del camino de coste mínimo → Algoritmo de Dijkstra

39
Capítulo 3: Algoritmos voraces

3.7 Problema de mensajería urgente


• Un transportista tiene que ir desde in origen a un destino y dispone de un vehículo que puede
hacer n kilómetros sin repostar.
• Se conocen las distancias entre las G gasolineras en todas las posibles rutas DG[1..G-1], siendo
DG[i] el número de kilómetros que hay entre la gasolinera i-1 e i.
• Objetivo: Encontrar la ruta que tiene que seguir (en qué gasolineras debe parar) para repostar
el menor número de veces posible.

Elementos del esquema voraz:


 Conjunto inicial de candidatos → las G gasolineras
 Conjunto de candidatos seleccionados → inicialmente está vacío
 Solución → se alcanzará la solución cuando se llegue al destino repostando según indique la
función de selección.
 Factible → si la distancia entre las gasolineras de la solución es menor o igual que n, el
conjunto resultante es siempre factible.
 Función de selección → se traduce en recorrer el mayor nº de kilómetros sin repostar.
→ Tratará de recorrer el mayor nº de kilómetros in repostar, tratando de ir desde cada
gasolinera en la que se pare a repostar a la más lejana posible, hasta llegar al destino.
40
Capítulo 3: Algoritmos voraces

41
Capítulo 3: Algoritmos voraces
Algoritmo detallado:

El vector de booleanos almacenará la solución: vector[i]=F no paro en la


gasolinera i-ésima, vector[i]=V, sí paro en dicha gasolinera)

Vector solución inicial, todos los elementos a falso


(ninguna gasolinera escogida)

Va sumando los Km de cada gasolinera

Bucle voraz: se detendrá cuando el


cuentaKm supera n (autonomía del
vehículo) o cuando ya no hay mas
gasolineras

Coste: se ejecutan 2 bucles “anidados”, sin


Me detengo en la gasolinera anterior embargo usan el mismo contador i desde 1 hasta
(i-1) y reseteo el cuentaKm
G-1, por lo que con todas las instrucciones
elementales → O(G).
42
Capítulo 3: Algoritmos voraces

3.9 Asistencia a incidencias


• Empresa que debe atender las incidencias de sus clientes lo más rápido posible.
• Cada jornada efectúa n salidas y sabe de antemano el tiempo que va a llevar atender
cada una de las incidencias.
• Objetivo: minimizar el tiempo medio de espera de sus clientes
→ Similar al problema de Minimización del tiempo en el sistema (3.3.1).

43

También podría gustarte