Está en la página 1de 82

Anlisis y Diseo de Algoritmos

Lenguajes y Ciencias
de la Computacin

E.T.S.I. Informtica

Captulo 4
Algoritmos
Voraces

Avanzar rpidamente proporciona buenas soluciones.

Organizacin del Captulo


Introduccin.
Mtodo General.
Anlisis del Tiempo de Ejecucin.
Ejemplos de Aplicacin.
Algoritmos Voraces sobre Grafos.

Introduccin
Tcnica conocida con diferentes nombres:
Avance rpido.
Algoritmo Greedy.

Consiste bsicamente en seleccionar en cada momento la


mejor opcin de entre un conjunto de candidatos, hasta
que se obtenga una solucin para el problema o no
existan ms candidatos.
Algoritmos relevantes: Kruskal, Prim.

Introduccin
La tcnica greedy o voraz se parece a la programacin
dinmica en que construye soluciones ptimas de
problemas, mediante una secuencia de soluciones a
subproblemas que son ptimas.
La diferencia entre ambas tcnicas es que un algoritmo
voraz, en cada paso, no explora todas las alternativas,
sino que escoge la mejor solucin LOCAL.
Esta tcnica puede fallar en algunos casos pero para
muchos problemas funciona bien, y tiene una complejidad
menor que las soluciones que siguen el esquema
dinmico.

Pasos de los Algoritmos Voraces


Por la forma de actuar, se pueden establecer los
siguientes pasos:
Se parte de una solucin vaca.
En cada paso se escoge el siguiente elemento (el mejor posible)

para aadir a la solucin, entre los candidatos. Una vez tomada


una decisin no se podr deshacer.
El algoritmo acabar cuando el conjunto de elementos
seleccionados constituyan una solucin o no existan ms
candidatos.

Es una tcnica que se aplica principalmente a problemas


de optimizacin

Similitudes de los Algoritmos Voraces


Las similitudes de los Algoritmos son las siguientes:
Un conjunto de candidatos. (Tareas a ejecutar, nodos, vrtices de

un grafo,...).
El conjunto de candidatos que ya se han usado.
Una funcin Seleccin que indica en cualquier instante cul es el
candidato ms prometedor de los no usados hasta el momento.
Una funcin Factible que indica cundo un (sub)conjunto (sin ser
necesariamente solucin) tiene la posibilidad de llegar a ser una
solucin (no necesariamente ptima).
Una Funcin Solucin que indica cundo un conjunto constituye
una solucin.
Una funcin Objetivo que da el valor de la solucin.

Mtodo General
La manera de proceder de un algoritmo diseado
mediante este mtodo consiste en considerar en cada
paso o etapa una entrada. Las entradas se van
considerando en un determinado orden y se seleccionan.
Si el candidato no se puede incluir en la solucin se
eliminar y ya no se volver a incluir como posible
candidato. Cada vez que se aade un nuevo candidato se
ver si el subconjunto constituye una solucin.

Funciones del Mtodo General


Las funciones del mtodo general son las siguientes:
seleccionar (C). Devuelve el elemento ms prometedor del

conjunto de candidatos pendientes (no seleccionados ni


rechazados).
factible (C). Indica si a partir del conjunto de candidatos C es
posible construir una solucin (posiblemente aadiendo otros
elementos). En ocasiones, factible y seleccionar pueden ser una
nica funcin
Insertar un elemento en la solucin.
solucin (S). Comprueba si un conjunto de candidatos es una
solucin (independientemente de que sea ptima o no).
Funcin objetivo (S). Dada una solucin devuelve el coste
asociado a la misma (resultado del problema de optimizacin).

Esquema General
Esquema:

Algoritmo Voraz (C: <conjunto_candidatos>; var S: <conjunto_solucion>);

Var x: <tipo_elemento>;
Inicio
S:= ;
Mientras (C ) and not Solucin (S) hacer
Inicio
x:= Seleccionar (C);
C:= C - {x};
Si Factible (S {x}) entonces
S:= S {x};
Fin
Si Solucin (S) entonces
Escribir (Objetivo(S))
Sino Escribir ( No se puede encontrar una solucin);
Fin;

Esquema General en Java


import java.util.*;
public static TSolucion voraz(TProblema p){
private List<TSolucion > lista;
boolean factible=true;
private TSolucion sol;
sol = solucionVacia(p);
while (!completa(sol,P) && factible){
lista = generarSoluciones(sol);
if (lista.isEmpty()) factible = false;
else{
sol = extender(sol,p,seleccionar(lista,p));
}
}
if (!factible) return null;
else return sol;
}

primera solucin
caso base
funcin de
terminacin
funcin de
generacin
funcin de
seleccin
construccin
de la siguiente
solucin ptima

Ejemplo
Problema del Cambio de Monedas. Se dispone de un
nmero ilimitado de monedas con valores 1, 2, 5, 25, 50 y
100 coronas de oro y una cantidad P. Se desea disear un
algoritmo que devuelva la cantidad P con el mnimo
nmero de monedas anteriores. Por ejemplo para
devolver 289 cononas, se necesitaran 2 monedas de 100,
1 moneda de 50, 1 moneda de 25, 2 moneda de 5 y 2
monedas de 2 coronas.

Formulacin del Problema del Cambio


Funciones:
Candidatos iniciales. Todos los tipos de monedas disponibles.

P. Una
solucin ser de la forma (x1, x2, x3, ..., xn-1, xn), donde xi es el
nmero de monedas de tipo i.

Solucin. Conjunto de monedas que suman la cantidad

Objetivo del problema.


Seleccionar. cul ser nuestra estrategia? Elegir en cada paso

la moneda de valor ms alto posible menor que el valor que


queda por devolver.
Factible. Siempre true, porque est integrada en Seleccionar.

Algoritmo Cambio
import java.util.*;
public static int [] Cambio(int cantidad, int C[], int Sol[]){
boolean salir=false;
int act=0, i, j;
for (i=0;i<Sol.length;i++) Sol[i]=0; //Inicializamos nuestra estructura Solucin.
while (act!=cantidad && !salir) {
j= Seleccionar(C,cantidad,act);
//Selecciona el mayor elemento de C tal que C[j] (cantidad - act);
if (j!=-1){ //Si existe
Sol[j]=(cantidad-act)/C[j];
act+=C[j]*Sol[j];
}
else salir=true;
}
if (act==cantidad) return Sol;
else return null;
}

Anlisis del Algoritmo


Complejidad. El tiempo depende del nmero de monedas.
Encuentra siempre una solucin ptima ?
No. Ejemplo. Supongamos que se dispone de monedas de
100, 90 y 1 coronas. Y que se quiere devolver una
cantidad de 180 coronas.
Algoritmo voraz: 1 moneda de 100 y 80 monedas de 1: total 81

monedas.
Solucin ptima: 2 monedas de 90: total 2 monedas.

Encuentra siempre una solucin?

Anlisis del Tiempo de Ejecucin


El orden de complejidad de los algoritmos voraces depende del
nmero de candidatos, de las funciones bsicas a utilizar, y del
nmero de elementos de la solucin. A continuacin se analiza este
tiempo en base a dichas funciones.

N el nmero de elementos de C.
M el nmero de elementos de una solucin (<=N)
Seleccin de un elemento entre los candidatos: g(N). Entre O(1) y O(N).
La funcin factible es h(M).
La unin de un nuevo elemento a la solucin puede requerir otras
operaciones de clculo j(N, M).
Comprobar si el valor actual es solucin: f(M). Normalmente O(1) O(M).

Anlisis del Tiempo de Ejecucin


Estas operaciones se ejecutarn como mximo N veces y
como mnimo M.

Anlisis del Tiempo de Ejecucin


Estas operaciones se ejecutarn como mximo N veces y
como mnimo M.
Solucin
Factible M elementos soluc

N Candidatos

Seleccin

Unin

Anlisis del Tiempo de Ejecucin


Estas operaciones se ejecutarn como mximo N veces y
como mnimo M.

En la prctica este orden de complejidad (generalmente)


es de tipo polinmico.
Las implementaciones pueden ser ms eficientes cuanto
menos generales queramos hacerlas

El problema de la mochila (0-1)


Supongamos que tenemos una mochila de capacidad W
(por ejm. en kgs), y n objetos de peso y valor (pi,vi).
Queremos maximizar el valor que cargamos.
Podemos utilizar dos estrategias para seleccionar los
objetos a introducir en la mochila:
Seleccionar siempre el objeto de mayor valor
Seleccionar siempre el objeto de menor peso

El problema de la mochila (0-1)


5
3

2
mochila

20

15

mochila

12

10

1
20

15

Estrategia 2
1

12

Estrategia 1

15

1 10

10

solucin ptima

mochila

2
12

12

15

10
20

mochila

1
20

El problema de la mochila (0-1)


5
2
mochila

12

1
10

1
20

15

Existe alguna estrategia de seleccin ptima para este


problema?

El problema de la mochila. Versin continua


Consideremos la variante del problema de la
mochila en la que se puede introducir una
fraccin de cada objeto, es decir, las
soluciones son vectores <x1,,xn> donde xi
[0,1] y es real.
Esta versin satisface el principio de
subestructura.

El problema de la mochila. Versin continua


El algoritmo voraz que ordena decrecientemente
los objetos en funcin de la razn valor/peso y los
incluye en orden hasta llenar la mochila es ptimo.
Por ejemplo, suponiendo una mochila de capacidad W = 5
kg
Objeto

Peso

Valor

Razn

6/kg

10

5/kg

12

4/kg

1. Se incluye o1, V = 6, W = 4
2. Se incluye o2, V = 16, W = 2
3. Se incluyen 2/3 de o3, V = 24, W = 0

El problema de la mochila. Versin continua


Si resolvemos el problema suponiendo que los
objetos son discretos, y utilizamos la heurstica,
nos saldra una solucin de valor 16, cuando la
solucin ptima tiene valor 22

Objeto

Peso

Valor

Razn

6/kg

10

5/kg

12

4/kg

El problema de la mochila. Versin continua


Heurstica voraz no proporciona la solucin
ptima a la versin discreta del problema.
Adems, no hay ninguna garanta de que la
solucin obtenida est dentro de un margen de
error.

Algoritmo de la Mochila
Realizar en Java y entregar en una tarea

Algoritmo Voraces sobre Grafos


Los grafos son unas estructuras que son utilizadas en
multitud de entornos de la vida real por su capacidad de
modelado. Un ejemplo lo encontramos cuando
disponemos de n computadoras que intentamos conectar
mediante una red de manera que todas estn
comunicadas y deseamos minimizar el coste de conexin.
Este problema se puede modelar mediante un grafo en el
que las computadoras estarn representadas mediante los
vrtices y el coste de conexin entre dos computadoras
cualesquiera, ser el valor del arco que la une. En la
siguiente figura se muestra un grafo no dirigido que
modela dicho problema.

Grafo No Dirigido
10
2

3
55

40

20

45
25

35

4
30

50

15

Definicin de Grafo

Sea G=<V,E> un grafo no dirigido (o


dirigido) donde V son los vrtices y E
las aristas.

rbol de recubrimiento mnimo (MST). Minimun spanning


tree

Ejemplo de MST
a

1
2

w(T1) = 6

GW

w(T2) = 9

w(T3) = 8

Bsqueda de un MST
Si intentamos utilizar una estrategia exhaustiva
para construir un MST nos encontramos con dos
problemas:
El nmero de rboles de recubrimiento de un grafo
crece exponencialmente con el tamao del grafo.
Generar todos los rboles de recubrimiento de un
grafo es ms difcil que encontrar un MST.

Veremos dos algoritmos:


El algoritmo de Prim (1957)
El algoritmo de Kruskal (1956)

Algoritmo de Prim
Construye un MST de forma incremental, empezando
con un rbol mnimo (un solo vrtice) y
expandindolo hasta que contenga todos los vrtices
del grafo.
Escogemos un vrtice de forma aleatoria
El rbol actual se expande de manera voraz aadindole el
vrtice ms cercano de entre los no incluidos. El vrtice
ms cercano es el que se une a uno de los del grafo con
una arista de peso mnimo
El proceso se repite hasta que el rbol contiene todos los
vrtices del grafo.

Algoritmo de Prim
Se dispone de un conjunto V con todos los vrtices del grafo, un
conjunto E con las aristas y un conjunto U que contendr los vrtices
segn se vayan incorporando.

Funciones:
Candidatos. Cada una de las aristas de E.
Seleccin. Seleccionamos la arista con menor peso del conjunto

ordenado de forma creciente tal que une un nodo de V con otro


de U.
Funcin solucin. Se tendr una solucin si todos los vrtices
del grafo pertenecen a U.
Aadir a la solucin. Aadir la arista (u, v).

Grafo No Dirigido
10
2

3
55

40

20

45
25

35

4
30

50

15

Grafo No Dirigido
10
2

55
40

45

20

25
1
1

35

4
30

50
5

15

Algoritmmo de Prim
10
2

55

40

45

20

25
1

25
35

4
30

50

15
5

Algoritmmo de Prim
10
2

10
2

55
40

45

20

25
1

25
35

4
30

50
5

15
5

Algoritmmo de Prim
10
2

55

10
2

40

45

20
20

25
1

25
35

4
1
30

50

15

5
5

Algoritmmo de Prim
10
2

55

40

45

20

20

25
1

10

25
35

4
30

50
5

4
15

15
5

Esquema del Algoritmo de Prim


Esquema:

Algoritmo Prim (G: grafo; Var T: <conjunto de aristas>);


Var U: <conjunto de vrtices>; u, v: <vrtice>;
Inicio
T:= ;
U:={1};
Mientras U <> G.V hacer
Inicio
Sea (u,v) una arista de costo mnimo tal que u est en U y
v en (G.V)-U;
T:= T {(u,v)};
U:= U {v};
Fin;
Fin;
//U y T forman el MST

Algoritmo:

1.
2.

Prim: una implementacin sencilla


asume que los nodos de G estn
numerados del 1 al n, i.e., N = {1,
,n} y contamos con una matriz
asimtrica L de tamao nxn donde L
[i,j] proporciona la longitud de la
arista que une los nodos i y j si existe,
y L[i,j]= si la arista no existe en el
grafo.
Se usan otros dos vectores de forma
que, para todo i N
ms_prximo[i] devuelve el nodo de U
ms prximo al nodo i;
distmin[i] devuelve la distancia desde i
hasta ese nodo ms prximo (nota;
dist_min[i] = -1 si i U).
Inicialmente, y de forma arbitraria, U
= {1}.
ms_prximo[1] y dist_min[1] nunca
se utilizan.

funcin Prim(L[1..n,1..n]): conjunto_aristas


T // y adems U = {1}
para i 2 hasta n hacer
ms_prximo[i] 1;
distmin[i] L [i,1];
finpara
\\ Bucle voraz
repetir n-1 veces
min
para j 2 hasta n hacer
si 0 distmin[j] < min entonces
min distmin[j]
kj
finsi
finpara
T T {{ms_prximo[k],k}}
distmin[k] -1 // se aade k a U
para j 2 hasta n hacer
si L[j,k] < distmin[j] entonces
distmin[j] L[j,k]
ms_prximo[j] k
finsi
finpara
finrepetir
devolver T
finfuncin

Complejidad: O(n2)

b 1 c
3
6
4
a
f 4
d

Ejemplo de Ejecucin

6
Vr%ces del rbol Vr%ces que faltan por
aadir
a

b(a,3),c(-,),d(-,), e(a,6),f
(a,5)

e 8

Ilustracin

b 1 c
3
6
4
a
f 4
d
6

a,
b(a,3)

c(b,1),d(-,), e(a,6),f(b,4)

e 8

1
4f

2 5
e 8

Ejemplo de Ejecucin
Vr%ces del rbol Vr%ces que faltan por
aadir
a,
b(a,3)
c(b,1)

Ilustracin

d(c,6), e(a,6),f(b,4)

3
6

a,
b(a,3)
c(b,1)
f(b,4)

d(f,5), e(f,2)

3
6

b
5

f 4

2 5
e 8

1
4

f 4
2

Ejemplo de Ejecucin
Vr%ces del rbol Vr%ces que faltan por
aadir
a,
b(a,3)
c(b,1)
f(b,4)
e(f,2)

a,
b(a,3)
c(b,1)
f(b,4)
e(f,2)
d(f,5)

Ilustracin

d(f,5)

3
6

f 4
2

e
1
4

f
e2

d
5

Algoritmo de Prim. Correccin.

Algoritmo de Prim. Correccin.

Algoritmo de Prim. Correccin.


v

v
Ti-1

Algoritmo de Kruskal
Filosofa del algoritmo.
Funciones:
Candidatos. Cada una de las aristas de E.
Funcin Seleccin. Selecciona aquella arista de mnimo coste.
Funcin factible. Ser factible aquella arista que une dos

componentes conexas distintas.


Funcin solucin. Se tendr una solucin si queda una sola
componente conexa.
Aadir a la solucin. Aadir la arista seleccionada.

Algoritmo de Kruskal
10
2

3
55

40

20

45
25

35

4
30

50

15

Algoritmo de Kruskal
10

55
40

45

20

25
1

35
30

50
5

15
5

Algoritmo de Kruskal
10

55
40

45

10
3

20

25
1

35
30

50
5

15
5

Algoritmo de Kruskal
10

55

40

45

10
3

20

25
1

35
30

50
5

15

15
5

Algoritmo de Kruskal
10

55

40

45

10

20

20

25
1

35
30

50
5

15

15
5

Algoritmo de Kruskal
10

55
40

45

20

20

25
1

10

25
4

35
30

50
5

15

15
5

Esquema del Algoritmo de Kruskal


funcin Kruskall(G=<N,E>:grafo; peso: E *): conjunto_aristas
// inicializacin
ordenar E segn peso creciente
n #N
// n es el nmero de elementos (vrtices) de N
T
// T mantiene las aristas del rbol de recubrimiento mnimo
iniciarparticin (P); // crea n particiones en P, cada uno con un elemento distinto de N
// bucle voraz
repetir
{u,v} la arista mas corta an no considerada
uconj obtenerparticinP(u)
vconj obtenerparticinP (v)
si uconj vconj entonces
fusionar(uconj,vconj)
T T {{u,v}}
endsi
hasta #T = n 1;
devolver T
finfuncin

Detalles de implementacin
*Complejidad (en un grafo con n nodos y e aristas):
-Seleccionar es de orden O(1) una vez ordenadas las aristas, e
iniciarparticion de orden O(n).
-Fusionar es de orden O(1).
-La ordenacin de los arcos puede realizarse en un tiempo del
orden de O(e*log e), siendo e el nmero de arcos del grafo. Como
se verifica que (n1) e n(n1)/2 por tratarse de un grafo
conexo, su orden es O(e*log n).

Detalles de implementacin

Representacn de conjuntos: podemos representar cada conjunto como un


rbol con raz, en el cual cada nodo contiene un nico puntero que apunta a su
padre
Se puede usar un vector de n posibles nodos donde conjunto[i]=i si el nodo i es
la raz y la particin del rbol. Si conjunto[i] = j, y j i, entonces j es el padre de
i en algn rbol.
1

10

Las operaciones bsicas son


ahora
muy
fciles
de
implementar !!

4
7

6
10

Detalles de implementacin

funcin obtenerparticin(x: vertice)

Proc fusionar(a,b: conjunto)

// Busca la particin que contiene al elemento x

// fusiona los conjuntos cuyas


particiones son a y b, asumimos a b

rx
mientras conjunto[r] r hacer r conjunto[r]
finmientras
devolver r
finproc

Si a < b entonces conjunto[b] a


Enotrocaso conjunto[a] b
Finsi
finproc

Ejemplo del Kruskal


1

3
5

8
7

Las particiones iniciales son {1},{2},{3},{4}.{5},{6},{7}


Peso total = 17

Etapa

Arista

Particiones formadas

{1,2}

{1,2}{3}{4} {5}{6}
{7}

{2,3}

{1,2,3}{4} {5}{6}
{7}

{4,5}

{1,2,3}{4,5}
{6}{7}

{6,7}

{1,2,3}{4,5}
{6,7}

{1,4}

{1,2,3,4,5} {6,7}

{2,5}

Arista Rechazada

{4,7}

{1,2,3,4,5,6,7}

Prim vs. Kruskal


Las implementaciones ms tipicas de Prim tienen un O(E + V log V)
y Kruskal de O(E log V).

Viajante de Comercio (Travelling


Salesman Problem TSP)
El problema del viajante de comercio consiste en dado un
determinado nmero de ciudades y las distancias que
existen entre ellas, encontrar el camino mnimo que
partiendo de una ciudad visite el resto de ciudades, una
sola vez, y vuelva a la ciudad de partida.
Todos los algoritmos para este problema requieren un
tiempo:
, es decir, es un problema NPCompleto. Una manera de encontrar una solucin
aceptable es mediante una heurstica voraz.

Viajante de Comercio
El problema puede representarse usando un grafo
completo no dirigido con n nodos. Un algoritmo voraz
obvio consiste en elegir en cada etapa la arista ms corta
de las restantes teniendo en cuenta que no forme un
ciclo con las aristas ya escogidas (excepto para la ltima
arista elegida, que completar el recorrido del viajante).
Problema: Dado un grafo no dirigido, completo y
ponderado G = (V, E), encontrar un ciclo simple de costo
mnimo que pase por todos los nodos.

Funciones del Algoritmo Voraz


Funciones:
Candidatos. Cada una de las aristas de E.
Funcin factible. Una arista ser factible si une la ciudad en la

que estamos con una de las ciudades que no hayamos visitado, o


bien en caso de que estemos en la ltima ciudad, esta se una con
la ciudad de partida.
Funcin solucin. Se tendr una solucin si se han recorrido
todas las ciudades una sola vez y nos encontramos en el punto de
partida.
Aadir a la solucin. Aadiremos la arista a la solucin.

Heursticas Voraces TSP


Para resolver el problema disponemos de dos algoritmos
voraces bsicamente.
Los nodos son los candidatos. Empezar en un nodo cualquiera. En

cada paso moverse al nodo no visitado ms prximo al ltimo


nodo seleccionado.
Las aristas son los candidatos. Hacer igual que en el algoritmo de
Kruskal, pero garantizando que se forme un ciclo (cada vrtice
debe estar conectado por dos aristas (Y NO MAS) en un ciclo
hamiltoniano.

Viajante de Comercio (TSP)


1. seleccionar siempre el vecino ms cercano: se comienza en una
ciudad cualquiera, y nos desplazamos sucesivamente a la ciudad
no visitada ms cercana en cada momento.

a
1

5
3

En este ejemplo, empezando por a, obtendramos la secuencia


<a,c,b,d,a> con una distancia de 16, y la pNma es <a,d,c,b,a>
que mide 14,

Viajante de Comercio (TSP)


2. seleccionar siempre el camino ms corto: Se ordenan los
caminos por orden y se van aadiendo mientras que no
se violen las restricciones.

a
1

5
3

En este ejemplo, se aadira (a,c), (c,b), (d,a) y nalmente (d,b)


que da el camino ms corto (en este caso)

Planificacin de Tareas
Se dispone de un nico procesador, que debe ejecutar n
tareas de forma secuencial. Para cada tarea i se conoce
de antemano el tiempo que tardar en ejecutarse ti.
Suponemos que todas las tareas estn disponibles en el
instante inicial.
El objetivo es dar un orden de ejecucin de las tareas
donde el tiempo total de espera de las tareas sea mnimo.

Ejemplo
Supongamos que tenemos 3 tareas con: t1= 4, t2=8, t3= 2
T1

T2
T1

T3

T3

T2

T2

T3
T3

Etotal = 4+6+14=24

T1

T2

T3

T3
T1

T1
T2

T2

Etotal = 4+12+14=30

Etotal = 8+12+14=34
Etotal = 8+10+14=32
Etotal = 2+6+14=22

T1

Etotal = 2+10+14=26

Funciones
Funciones:
n tareas.
La solucin coincide con el conjunto de candidatos pero ordenados
segn el orden de ejecucin.
Aadir un nuevo candidato consiste en insertar un nuevo
elemento a una lista.
Funcin de seleccin: ejecutar primero la tarea ms corta de entre
los candidatos restantes.
Los candidatos son las

Planificacin de Tareas con Plazo Fijo


En la planificacin con plazo fijo tenemos n tareas cuyo tiempo de
ejecucin es unitario. En cualquier instante T = 1, 2, ...i, ... n, se
puede estar ejecutando una nica tarea, lo que provocar un
beneficio gi . Una tarea slo puede ejecutarse si se hace antes de un
plazo di. Adems, puede que no sea posible ejecutar todas las tareas.
Dar una planificacin S, donde S(i)=1 si la tarea se ejecuta y S(i)=0
en caso contrario, de las tareas a ejecutar (1, ..., n) de forma que se
maximice el beneficio obtenido:

Ejemplo
Sean el nmero de tareas igual a 4, con beneficios y
plazos respectivos g = (100, 10, 15, 27), d = ( 2, 1, 2, 1).
Comprobar todas las posibilidades tendra una
complejidad n!. A continuacin se muestran algunas
posibles soluciones:
(1)
(2, 1)
(4, 3)
(4, 1)

GTOTAL = 100
GTOTAL = 110
GTOTAL = 42
GTOTAL = 127

Funciones
Funciones:
Una solucin estar formada por un conjunto de candidatos, junto

con un orden de ejecucin de los mismos, S = (s1, s2, ..., sn).


Funcin de seleccin. De los candidatos restantes elegir el que
tenga mayor valor de beneficio (o bien otra heurstica distinta).
Funcin factible. Dada una planificacin (s1, s2, ..., sk) en un paso
del algoritmo y un nuevo candidato j:
Cundo ser factible la solucin parcial que incluye a j?
Dnde debera ser colocado j dentro de la planificacin?

Funcin solucin. Tendremos la solucin cuando se hayan

considerado todos los candidatos.

Factible
Al insertar ordenado con respecto a dj, ste aparecer al
final de todos los elementos con d similar:
Si la posicin i (con 1<=i<=k) en la que queda es mayor

que dj FALSO. No es factible.


En otro caso VERDADERO. Es factible.

Programacin dinmica vs algoritmos voraces:


planificacin de actividades

Planificacin de actividades
i

10

11

si
fi

12

10

11

12

14

16

10

11

si
fi

12

10

11

12

14

16

10

11

si
fi

12

10

11

12

14

16

Planificacin de actividades
utilizando una estrategia voraz

10

11

si

12

fi

10

11

12

14

16

Planificacin de actividades
utilizando una estrategia voraz

10

11

si
fi

12

10

11

12

14

16

Planificacin de actividades
algoritmo voraz iterativo
public
//
//
//

static List<Integer> planActividades(int[] s,int[] f){


s y f son los arrays con el inicio y final
de cada actividad. Ordenado inicialmente con respecto a
la finalizacin.

int n = s.length-1;
List<Integer> lista = new ArrayList<Integer>();
lista.add(1);
int k = 1;
for(int m=2; m<=n; m++){
if (s[m] >= f[k]){
lista.add(m);
k = m;
}
}
return lista;
}

Orden?

Planificacin de actividades
algoritmo voraz iterativo
0
k

sk

fk

10

11

12

10

14

11

12

16

3 4

9 10 11 12 13 14 15 16

a0
a1
a2
a3
a1

a4
a5
a6
a7

a1

a4

a8

Planificacin de actividades
algoritmo voraz iterativo
0
k

sk

fk

11

12

10

14

11

12

16

3 4
a1

6
a4

9 10 11 12 13 14 15 16
a8
a9
a10
a11

a1

a4

a8

a11