Академический Документы
Профессиональный Документы
Культура Документы
Lenguajes y Ciencias
de la Computacin
E.T.S.I. Informtica
Captulo 4
Algoritmos
Voraces
Introduccin
Tcnica conocida con diferentes nombres:
Avance rpido.
Algoritmo Greedy.
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.
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.
Esquema General
Esquema:
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;
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.
P. Una
solucin ser de la forma (x1, x2, x3, ..., xn-1, xn), donde xi es el
nmero de monedas de tipo i.
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;
}
monedas.
Solucin ptima: 2 monedas de 90: total 2 monedas.
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).
N Candidatos
Seleccin
Unin
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
12
1
10
1
20
15
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
Objeto
Peso
Valor
Razn
6/kg
10
5/kg
12
4/kg
Algoritmo de la Mochila
Realizar en Java y entregar en una tarea
Grafo No Dirigido
10
2
3
55
40
20
45
25
35
4
30
50
15
Definicin de Grafo
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.
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
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
Algoritmo:
1.
2.
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
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
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
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
10
4
7
6
10
Detalles de implementacin
rx
mientras conjunto[r] r hacer r conjunto[r]
finmientras
devolver r
finproc
3
5
8
7
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}
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.
a
1
5
3
a
1
5
3
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
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
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
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
//
//
//
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