Documentos de Académico
Documentos de Profesional
Documentos de Cultura
v Esquema genérico:
función
función voraz(C:conjunto)
voraz(C:conjunto)
devuelve
devuelve conjunto
conjunto
{C
{C es
es el
el conjunto
conjunto de
de todos
todos los
los candidatos}
candidatos}
principio
principio
S:=Ø;
S:=Ø; {S
{S es
es el
el conjunto
conjunto en
en el
el que
que se
se
construye
construye la
la solución}
solución}
mq ¬solución(S) ∧∧ CC≠≠ØØ hacer
mq ¬solución(S) hacer
x:=elemento
x:=elemento de
de CC que
que
maximiza
maximiza seleccionar(x);
seleccionar(x);
C:=C-{x};
C:=C-{x};
si completable(S∪∪{x})
si completable(S {x})
entonces S:=S∪∪{x}
entonces S:=S {x}
fsi
fsi
fmq;
fmq;
si
si solución(S)
solución(S)
entonces
entonces devuelve
devuelve SS
sino
sino devuelve
devuelve no
no hay
hay solución
solución
fsi
fsi
fin
fin
v Solución:
tipo
tipo moneda=(M25,M10,M5,M1)
moneda=(M25,M10,M5,M1) {por
{por ejemplo}
ejemplo}
función
función cambia(importe:nat;
cambia(importe:nat;
valor:vector[moneda]
valor:vector[moneda] de de nat)
nat)
devuelve
devuelve vector[moneda]
vector[moneda] de de nat
nat
variable
variable mon:moneda;
mon:moneda;
cambio:vector[moneda]
cambio:vector[moneda] de de nat
nat
principio
principio
para
para todo
todo mon
mon en
en moneda
moneda hacer
hacer
cambio[mon]:=0
cambio[mon]:=0
fpara;
fpara;
para
para mon:=M25
mon:=M25 hasta
hasta M1
M1 hacer
hacer
mq valor[mon]≤≤importe
mq valor[mon] importe hacer
hacer
cambio[mon]:=cambio[mon]+1;
cambio[mon]:=cambio[mon]+1;
importe:=importe-valor[mon]
importe:=importe-valor[mon]
fmq
fmq
fpara;
fpara;
devuelve
devuelve cambio
cambio
fin
fin
v Formalmente:
maximizar Σ
1≤i≤n
b ixi (1)
sujeto a Σ
1≤i≤n
pixi ≤ C (2)
v Ejemplo:
n=3 C=17
(b1,b2,b3)=(40,36,22)
(p1,p2,p3)=(15,12,8)
(x1,x2,x3) Σ
1≤i≤3
bixi
(i) (1,1/6,0) 46
(ii) (0,3/4,1) 49
(iii) (0,1,5/8) 49’75
v Solución voraz:
– El conjunto de candidatos son los objetos,
tomándose de ellos cierta fracción.
– Un conjunto de candidatos es completable si la
suma de sus pesos no supera la capacidad de la
mochila, y es una solución si iguala dicha
capacidad.
– La función objetivo a maximizar es Σ bixi.
1≤i≤n
constante
constante n=...
n=... {número
{número de
de objetos}
objetos}
tipo
tipo vectReal=vector[1..n]
vectReal=vector[1..n] de de real
real
{Pre: ∀i∈1..n:peso[i]>0
{Pre: ∀i∈1..n:peso[i]>0 ∧∧
∀i∈1..n-1:benef[i]/peso[i]≥benef[i+1]/peso[i+1]}
∀i∈1..n-1:benef[i]/peso[i]≥benef[i+1]/peso[i+1]}
función
función mochila(benef,peso:vectReal;
mochila(benef,peso:vectReal;
cap:real)
cap:real) devuelve
devuelve vectReal
vectReal
variables
variables resto:real;
resto:real; i:entero;
i:entero;
sol:vectReal
sol:vectReal
principio
principio
para
para todo
todo ii en
en 1..n
1..n hacer
hacer
sol[i]:=0.0
sol[i]:=0.0 {inicializar
{inicializar solución}
solución}
fpara;
fpara;
resto:=cap;
resto:=cap; {capacidad
{capacidad restante}
restante}
i:=1;
i:=1;
mq (i≤≤n)
mq (i n) and (peso[i]≤≤resto)
and (peso[i] resto) hacer
hacer
sol[i]:=1;
sol[i]:=1;
resto:=resto-peso[i];
resto:=resto-peso[i];
i:=i+1
i:=i+1
fmq;
fmq;
si ii≤≤nn entonces
si entonces sol[i]:=resto/peso[i]
sol[i]:=resto/peso[i] fsi;
fsi;
devuelve
devuelve sol sol
fin
fin
{Post:
{Post: sol
sol es
es solución
solución óptima
óptima del
del problema
problema de
de
la mochila}
la mochila}
v Representaciones de grafos:
Matriz de adyacencia
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipo
tipo grafo
grafo ==
== vector[1..n,1..n]de
vector[1..n,1..n]de booleano
booleano
1
falso verdad falso
v Listas de adyacencia
– Esta representación sirve para mejorar la
eficiencia de los algoritmos sobre grafos que
necesitan acceder a los vértices sucesores a uno
dado.
– Consiste en almacenar n listas enlazadas
mediante punteros de forma que la lista i-ésima
contiene los vértices sucesores del vértice i.
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos ptNodo == ↑nodo;
tipos ptNodo ↑nodo;
nodo
nodo == registro
registro
vértice:1..n;
vértice:1..n;
sig:ptNodo
sig:ptNodo
freg
freg
grafo
grafo == vector[1..n]
vector[1..n] de de ptNodo
ptNodo
2 nil
1
2
2 1 3 nil
3 nil
3
Vector de listas de adyacencia
Grafo
dirigido
2 nil
2 1
2 1 nil
3
2 nil
3
1 2 nil nil
3
1
Grafo dirigido 2 2 1 nil 2 3 nil nil
3 nil
Listas de adyacencia
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos ptNodo == ↑nodo;
tipos ptNodo ↑nodo;
nodo
nodo == registro
registro
origen,destino:
origen,destino: 1..n;1..n;
sigInvAdy,sigAdy:ptNodo
sigInvAdy,sigAdy:ptNodo
freg
freg
grafoDirigido
grafoDirigido ==
== registro
registro
adyacentes,
adyacentes, invAdyacentes:
invAdyacentes:
vector[1..n]
vector[1..n] de de ptNodo
ptNodo
freg
freg
2 3 4 nil
1
1
2 1 3 4 nil
2 3
3
1 2 4 nil
4
4
1 2 3 nil
1 2
1
2 1 3 2 3
3
4
1 4 2 4 3 4
constante
constante nn == ...
... {cardinal
{cardinal de
de V}
V}
tipos ptNodo == ↑nodo;
tipos ptNodo ↑nodo;
nodo
nodo == registro
registro
v1,v2:1..n;
v1,v2:1..n;
sig1,sig2:ptNodo
sig1,sig2:ptNodo
freg
freg
grafoNoDirigido
grafoNoDirigido ==
== vector[1..n]
vector[1..n] de de ptNodo
ptNodo
v Utilidad:
el grafo representa una distribución geográfica,
donde las aristas dan el coste (precio, distancia...)
de la conexión entre dos lugares y se desea
averiguar el camino más corto (barato...) para
llegar a un punto partiendo de otro
E.W. Dijkstra:
“A note on two problems in connexion with graphs”,
Numerical Mathematica, 1, pp. 269-271, 1959.
{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado no
no neg.}
neg.}
función
función Dijkstra(g:grafo;
Dijkstra(g:grafo; v:vért)
v:vért)
devuelve
devuelve vector[vért] de
vector[vért] de etiq
etiq
variables
variables S:cjtVért;
S:cjtVért;
D:vector[vért]
D:vector[vért] dede etiq
etiq
principio
principio
∀w∈vért:D[w]:=etiqueta(g,v,w);
∀w∈vért:D[w]:=etiqueta(g,v,w);
D[v]:=0;
D[v]:=0; S:={v};
S:={v};
mq
mq SS no
no contenga
contenga todos
todos los
los vértices
vértices hacer
hacer
{D
{D contiene
contiene caminos
caminos mínimos
mínimos formados
formados íntegra-
íntegra-
mente
mente por
por nodos
nodos dede SS (excepto
(excepto el
el último),
último), yy
los
los nodos
nodos de
de SS corresponden
corresponden aa los
los caminos
caminos mí-
mí-
nimos más cortos calculados hasta el momento}
nimos más cortos calculados hasta el momento}
elegir
elegir w∉S
w∉S t.q.
t.q. D[w]
D[w] eses mínimo;
mínimo;
S:=S∪{w};
S:=S∪{w};
∀u∉S:actualizar
∀u∉S:actualizar dist.mín.
dist.mín. comprobando
comprobando
si
si por
por ww hay
hay un
un atajo
atajo
fmq;
fmq;
devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMínimos(g,v)}
D=caminosMínimos(g,v)}
v Corrección:
Apuntes de la asignatura de Matemática Discreta
o buscar en bibliografía.
{Pre:
{Pre: gg es
es un
un grafo
grafo dirigido
dirigido etiquetado
etiquetado no
no neg.}
neg.}
función
función Dijkstra(g:grafo;
Dijkstra(g:grafo; v:vért)
v:vért)
devuelve
devuelve vector[vért]
vector[vért] de de etiq
etiq
variables
variables T:cjtVért;
T:cjtVért;
D:vector[vért]
D:vector[vért] de de etiq;
etiq;
u,w:vért;
u,w:vért; val:etiq
val:etiq
principio
principio
T:=∅;
T:=∅;
para
para todo
todo ww en
en vért
vért hacer
hacer
D[w]:=etiqueta(g,v,w);
D[w]:=etiqueta(g,v,w); T:=T∪{w}
T:=T∪{w}
fpara;
fpara;
D[v]:=0;
D[v]:=0; T:=T-{v};
T:=T-{v};
repetir
repetir n-2 veces
n-2 veces {quedan
{quedan n-1
n-1 caminos
caminos por
por
determinar}
determinar}
{selección
{selección del mín.w: ww∈∈TT ∧∧ ∀∀uu∈∈T:D[w]≤D[u]}
del mín.w: T:D[w]≤D[u]}
val:=∞;
val:=∞;
para
para todo
todo uu en
en TT hacer
hacer
si D[u]≤≤val
si D[u] val ent
ent w:=u;
w:=u; val:=D[u]
val:=D[u] fsi
fsi
{siempre
{siempre hay
hay un
un nodo
nodo que
que cumple
cumple la
la condic}
condic}
fpara;
fpara;
...
...
...
...
{se
{se marca
marca ww como
como vértice
vértice tratado}
tratado}
T:=T-{w};
T:=T-{w};
{se
{se recalculan
recalculan las
las nuevas
nuevas dist.
dist. mínimas}
mínimas}
para
para todo
todo uu en
en TT hacer
hacer
si
si D[w]+etiqueta(g,w,u)<D[u]
D[w]+etiqueta(g,w,u)<D[u]
ent
ent D[u]:=D[w]+etiqueta(g,w,u)
D[u]:=D[w]+etiqueta(g,w,u)
fsi
fsi
fpara
fpara
frepetir;
frepetir;
devuelve
devuelve DD
fin
fin
{Post:
{Post: D=caminosMínimos(g,v)
D=caminosMínimos(g,v)
v Tiempo de ejecución:
– se supone que las operaciones sobre cjtos. están
implementadas en tiempo constante, excepto la
creación (p.ej., mediante un vector de booleanos)
– fase de inicialización:
u creación del cjto. y ejecución n veces de
diversas operaciones constantes: Θ(n)
– fase de selección:
u las instrucciones del interior del bucle son
Θ(1)
u nº de ejecuciones del bucle:
1ª vuelta: se consultan n-1 vértices,
2ª vuelta: n-2, etc.
(el cardinal de T decrece en 1 en cada paso)
nº de ejecuciones: n(n-1)/2-1 ⇒ Θ(n2)
– fase de “marcaje”:
u n supresiones a lo largo del algoritmo: Θ(n)
género
género cpa
cpa {colaPriAristas}
{colaPriAristas}
operaciones
operaciones
creaVacía: →
creaVacía: → cpa
cpa Θ(1)
Θ(1)
inserta:
inserta: cpa
cpa vért etiq →
vért etiq → cpa
cpa Θ(log
Θ(logn)
n)
primero: cpa →
primero: cpa → (vért,etiq)
(vért,etiq) Θ(1)
Θ(1)
borra: cpa →
borra: cpa → cpa
cpa Θ(log
Θ(logn)
n)
sustit:
sustit: cpa
cpa vért etiq →
vért etiq → cpa
cpa Θ(log
Θ(logn)
n)
valor: cpa vért →
valor: cpa vért → etiqetiq Θ(1)
Θ(1)
está?:
está?: cpa vért →
cpa vért → bool
bool Θ(1)
Θ(1)
vacía?: cpa →
vacía?: cpa → bool
bool Θ(1)
Θ(1)
<4,20>
1
2
el valor ∞ de la etiqueta
3 <3,75> <5,60> significa que el vértice
4 no está en la cola
5 <2,∞>
v Eficiencia temporal:
– inicialización: Θ(nlog n)
– selección y supresión: Θ(nlog n)
– bucle interno: examina todas las aristas del grafo
y en el caso peor efectúa una sustitución por
arista, por tanto: Θ(alog n)
• El coste total es:Θ((a+n)log n), luego es mejor
que la versión anterior si el grafo es disperso.
• Si el grafo es denso, el algoritmo original es
mejor.
v Terminología:
– árbol libre:
es un grafo no dirigido conexo acíclico
u todo árbol libre con n vértices tiene n-1 aristas
u si se añade una arista se introduce un ciclo
u si se borra una arista quedan vértices no
conectados
u cualquier par de vértices está unido por un único
camino simple
u un árbol libre con un vértice distinguido es un
árbol con raíz
– árbol de recubrimiento de un grafo no dirigido y
etiquetado no negativamente:
es cualquier subgrafo que contenga todos los
vértices y que sea un árbol libre
– árbol de recubrimiento de coste mínimo:
es un árbol de recubrimiento y
no hay ningún otro árbol de recubrimiento cuya
suma de aristas sea menor
– notación: arm(g)={árboles de recubrimiento
de coste mínimo de g}
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado no negativamente}
etiquetado no negativamente}
función
función Prim(g:grafo)
Prim(g:grafo) devuelve
devuelve grafo
grafo
variables
variables U:cjtVért;
U:cjtVért; gsol:grafo;
gsol:grafo;
u,v:vért;
u,v:vért; x:etiq
x:etiq
principio
principio
creaVacío(gsol);
creaVacío(gsol); U:={cualquier
U:={cualquier vértice};
vértice};
mq
mq UU no
no contenga
contenga todos
todos los
los vért.
vért. hacer
hacer
seleccionar
seleccionar <u,v,x>
<u,v,x> mínima t.q. uu∈∈U;v
mínima t.q. U;v∉∉UU
añade(gsol,u,v,x); U:=U∪∪{v}
añade(gsol,u,v,x); U:=U {v}
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsol∈arm(g)}
gsol∈arm(g)}
Coste: Θ(na)
(es decir, Θ(n3) si el grafo es denso)
si v∈U: arisMín[v]=<v,∞>
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado no negativamente}
etiquetado no negativamente}
función
función Prim(g:grafo)
Prim(g:grafo) devuelve
devuelve grafo
grafo
variables
variables
arisMín:vector[vért]
arisMín:vector[vért] dede <vért,etiq>;
<vért,etiq>;
gsol:grafo;
gsol:grafo; prim,mín,v,w:vért;
prim,mín,v,w:vért; x:etiq
x:etiq
principio
principio
{inicialización
{inicialización del
del resultado}
resultado}
prim:=unVérticeCualquiera;
prim:=unVérticeCualquiera;
arisMín[prim]:=<prim,∞∞>;
arisMín[prim]:=<prim, >;
para
para todo
todo vv en
en vért
vért hacer
hacer
arisMín[v]:=<prim,etiqueta(g,prim,v)>
arisMín[v]:=<prim,etiqueta(g,prim,v)>
fpara;
fpara;
{a
{a continuación
continuación se
se aplica
aplica el
el método}
método}
creaVacío(gsol);
creaVacío(gsol);
hacer
hacer n-1
n-1 veces
veces
mín:=prim;
mín:=prim; {centinela:
{centinela: arisMín[mín].et=∞}
arisMín[mín].et=∞}
para
para todo
todo vv en
en vért
vért hacer
hacer
<w,x>:=arisMín[v];
<w,x>:=arisMín[v];
si
si x<arisMín[mín].et
x<arisMín[mín].et
ent
ent mín:=v
mín:=v {como
{como mínimo
mínimo habrá
habrá uno}
uno}
fsi;
fsi;
fpara;
fpara;
...
...
v Eficiencia temporal:
– inicialización: lineal en caso de matriz de
adyacencia y cuadrática en caso de listas
– bucle principal:
u el bucle de selección: Θ(n)
v Algoritmo de Kruskal:
– Se basa también en la propiedad de los árboles
de recubrimiento de coste mínimo:
Partiendo del árbol vacío, se selecciona en cada
paso la arista de menor etiqueta que no
provoque ciclo sin requerir ninguna otra
condición sobre sus extremos.
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado no negativamente}
etiquetado no negativamente}
función
función Kruskal(g:grafo)
Kruskal(g:grafo) devuelve
devuelve grafo
grafo
variables
variables gsol:grafo;
gsol:grafo;
u,v:vért;
u,v:vért; x:etiq
x:etiq
principio
principio
creaVacío(gsol);
creaVacío(gsol);
mq
mq gsol
gsol nono sea
sea conexo
conexo hacer
hacer(∗)
seleccionar
seleccionar <u,v,x>
<u,v,x> mínima
mínima nono examinada;
examinada;
si
si no
no provoca
provoca ciclo
ciclo
entonces
entonces añade(gsol,u,v,x)
añade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsol∈arm(g)}
gsol∈arm(g)}
v Implementación eficiente:
– En cada momento, los vértices que están dentro
de una componente conexa en la solución
forman una clase de equivalencia, y el algoritmo
se puede considerar como la fusión continuada
de clases hasta obtener una única componente
con todos los vértices del grafo.
30 3
A B A B
40 40 4
50 C 60 C
10 20 1 2
D E D E
50
{[A],[B],[C],[D],[E]} → {[A],[B],[C,D],[E]} →
→ {[A],[B],[C,D,E]} → {[A,B],[C,D,E]} →
→ {[A,B,C,D,E]}
género
género rev
rev {relac.
{relac. de
de equiv.
equiv. sobre
sobre vért.}
vért.}
operaciones
operaciones
creaREV: →
creaREV: → rev
rev {cada
{cada vért.
vért. una
una clase}
clase}
clase: rev vért →
clase: rev vért → nat nat
fusiona:
fusiona: rev
rev nat nat →
nat nat → rev
rev
numClases:
numClases: revrev →
→ nat
nat
{Pre:
{Pre: gg es
es un
un grafo
grafo no
no dirigido
dirigido conexo
conexo
etiquetado no negativamente}
etiquetado no negativamente}
función
función Kruskal(g:grafo)
Kruskal(g:grafo) devuelve
devuelve grafo
grafo
variables
variables T:cpa;
T:cpa; gsol:grafo;
gsol:grafo;
u,v:vért;
u,v:vért; x:etiq;
x:etiq;
C:rev;
C:rev; ucomp,vcomp:nat
ucomp,vcomp:nat
principio
principio
creaREV(C);
creaREV(C); {cada
{cada vért.
vért. forma
forma una
una clase}
clase}
creaVacío(gsol);
creaVacío(gsol); creaVacía(T);
creaVacía(T);
{se
{se colocan
colocan todas
todas las
las aristas
aristas en
en la
la cola}
cola}
para
para todo
todo vv en
en vért
vért hacer
hacer
para
para todo
todo <u,x>
<u,x> en
en adyacentes(g,v)
adyacentes(g,v) hacer
hacer
inserta(T,v,u,x)
inserta(T,v,u,x)
fpara
fpara
fpara;
fpara;
...
...
...
...
mq
mq numClases(C)>1
numClases(C)>1 hacer
hacer
{obtener
{obtener yy elim.
elim. la
la arista
arista mín.de
mín.de la
la cola}
cola}
<u,v,x>:=primero(T);
<u,v,x>:=primero(T); borra(T);
borra(T);
{si
{si la
la arista
arista no
no provoca
provoca ciclo
ciclo se
se añade
añade aa la
la
solución
solución yy se
se fusionan
fusionan las
las clases
clases corresp.}
corresp.}
ucomp:=clase(C,u);
ucomp:=clase(C,u); vcomp:=clase(C,v);
vcomp:=clase(C,v);
si ucomp≠≠vcomp
si ucomp vcomp entonces
entonces
fusiona(C,ucomp,vcomp);
fusiona(C,ucomp,vcomp);
añade(gsol,u,v,x)
añade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelve
devuelve gsol
gsol
fin
fin
{Post:
{Post: gsol∈arm(g)}
gsol∈arm(g)}
v Subestructura óptima:
– Un problema posee una subestructura óptima si
una solución óptima de ese problema incluye
soluciones óptimas de subproblemas.
a b c d e f
cód.long.var. 0 101 100 111 1101 1100
86 14 a:45 55
0 1 0 0 1
58 28 14 25 30
0 1 0 1 0 1 0 1 0 1
a:45 b:13 c:12 d:16 e:9 f:5 c:12 b:13 14 d:16
0 1
f:5 e:9
{Pre:
{Pre: CC es
es un
un conjunto
conjunto de
de caracteres
caracteres yy ff es
es el
el
vector de frecuencias de esos caracteres}
vector de frecuencias de esos caracteres}
función
función Huffman(C:conjunto;f:vectFrec)
Huffman(C:conjunto;f:vectFrec)
devuelve
devuelve árbol
árbol
variables
variables Q:colaPri;
Q:colaPri; i,fx,fy,fz:entero;
i,fx,fy,fz:entero;
z,x,y:árbol
z,x,y:árbol
principio
principio
creaVacía(Q);
creaVacía(Q);
para
para todo
todo xx en
en CC hacer
hacer
inserta(Q,<x,f[x]>)
inserta(Q,<x,f[x]>)
fpara;
fpara;
para
para i:=1
i:=1 hasta
hasta |C|-1
|C|-1 hacer
hacer
<x,fx>:=primero(Q);
<x,fx>:=primero(Q); borra(Q);
borra(Q);
<y,fy>:=primero(Q);
<y,fy>:=primero(Q); borra(Q);
borra(Q);
fz:=fx+fy;
fz:=fx+fy;
z:=creaÁrbol(raíz=>fz,
z:=creaÁrbol(raíz=>fz,
hijoIzq=>x;
hijoIzq=>x;
hijoDer=>y);
hijoDer=>y);
inserta(Q,<z,fz>)
inserta(Q,<z,fz>)
fpara;
fpara;
<z,fz>:=primero(Q);
<z,fz>:=primero(Q); borra(Q)
borra(Q)
devuelve
devuelve zz
fin
fin
{Post:
{Post: zz es
es el
el árbol
árbol de
de un
un código
código libre
libre de
de
prefijos óptimo para (C,f)}
prefijos óptimo para (C,f)}
f:5 e:9 c:12 b:13 d:16 a:45 c:12 b:13 14 d:16 a:45
0 1
(1º) (2º) f:5 e:9
a:45 55 100
0 1 0 1
(5º)
25 30 a:45 55
0 1 0 1 0 1
c:12 b:13 14 d:16 (6º) 25 30
0 1 0 1 0 1
f:5 e:9 c:12 b:13 14 d:16
0 1
f:5 e:9
v Coste temporal:
– inicialización de Q: Θ(|C|) (ejercicio)
– el interior del bucle: Θ(log |C|)
Coste total: Θ(|C|log |C|)
v Corrección: ver que se verifican las
propiedades de la selección voraz y de
la subestructura óptima.
v Propiedad de la selección voraz:
– Sea C un alfabeto en el que cada carácter c tiene
frecuencia f[c]. Sean x e y dos caracteres de C con
frecuencias mínimas. Entonces existe un código
libre de prefijos óptimo para C en el que las
codificaciones de x e y tienen igual longitud y se
diferencian sólo en el último bit.
La idea de la demostración consiste en tomar un
árbol que represente un código libre de prefijos
óptimo arbitrario y modificarlo hasta convertirlo
en otro árbol que represente otro código libre de
prefijos óptimo y tal que los caracteres x e y
aparezcan como hojas hermanas de máxima
profundidad.
Detalles en [CLR90, pp. 342-343].
v Es un problema de planificación de
tareas (en inglés, scheduling).
v Se tiene un conjunto S={1,2,…,n} de
actividades (por ej., clases) que deben
usar un recurso (por ej., un aula) que
sólo puede ser usado por una actividad
en cada instante.
v Cada actividad i tiene asociado un
instante de comienzo ci y un instante de
finalización fi, tales que ci≤fi, de forma
que la actividad i, si se realiza, debe
hacerse durante [ci,fi).
v Dos actividades i, j se dicen compati-
bles si los intervalos [ci,fi) y [cj,fj) no se
superponen (i.e., (ci≥fj)∨(cj≥fi)).
v El problema de selección de actividades
consiste en seleccionar un conjunto de
actividades mutuamente compatibles
que tenga cardinal máximo.
constante
constante n=...
n=... {número
{número de
de actividades}
actividades}
tipo
tipo vectReal=vector[1..n]
vectReal=vector[1..n] de de real
real
{Pre: ∀i∈1..n:c[i]≤f[i]
{Pre: ∀i∈1..n:c[i]≤f[i] ∧∧ ∀i∈1..n-1:f[i]≤f[i+1]}
∀i∈1..n-1:f[i]≤f[i+1]}
función
función selec(c,f:vectReal)devuelve
selec(c,f:vectReal)devuelve conjuntoconjunto
variables
variables i,j:entero;
i,j:entero; A:conjunto
A:conjunto
principio
principio
A:={1};
A:={1};
j:=1;
j:=1; {j{j es
es la
la última
última actividad
actividad seleccionada}
seleccionada}
para i:=2 hasta n
para i:=2 hasta n hacer hacer
si c[i]≥≥f[j]
si c[i] f[j]
entonces
entonces A:=AA:=A∪∪{i};
{i}; j:=i
j:=i
fsi
fsi
fpara;
fpara;
devuelve
devuelve AA
fin
fin
{Post:
{Post: AA es
es solución
solución óptima
óptima del
del problema
problema de
de
la
la selección
selección dede actividades.}
actividades.}
v Ejemplo:
orden T
1 2 3: 5+ (5+10) + (5+10+3) = 38
1 3 2: 5+ (5+3) + (5+3+10) = 31
2 1 3: 10 + (10+5) + (10+5+3) = 43
2 3 1: 10 + (10+3) + (10+3+5) = 41
3 1 2: 3+ (3+5) + (3+5+10) = 29 óptimo
3 2 1: 3+ (3+10) + (3+10+5) = 34
v Estrategia voraz:
Atender en cada paso al cliente no
atendido con menor tiempo de servicio.
v Demostración de la corrección:
Sea I=(i1,i2,…,in) una permutación cualquiera de
los naturales {1,2,…,n}.
Si se atiende a los clientes según la secuencia I, el
tiempo total que los clientes están en el sistema
es:
Entonces:
n
T(I’) = (n-a+1)tib + (n-b+1)tia + Σ
k=1
(n-k+1)t ik
k≠a,b
v Ejemplos de matroides:
– Dada una matriz de números reales, sea S el
conjunto de sus vectores fila, y considerese que
un subconjunto de S es independiente si los
vectores que lo componen son linealmente inde-
pendientes (en el sentido habitual).
v Voracidad y matroides.
v Eficiencia temporal:
Denotando |S| como n,
u fase de ordenación: Θ(nlog n)
v Corrección:
Teorema 17.10 en [CLR90, pp. 348-350]
(un par de páginas; sin gran dificultad).
v Utilidad fundamental:
v Resumen:
– La investigación continúa…
1 2 5
1 2 5
1 2 5
v Ejemplo:
Cinco cabinas de teléfonos, b, c, d, e, f, para las
que se conocen sus coordenadas relativas a la
central telefónica, a, desde la que parten los
recolectores y a donde deben regresar al
terminar, y se supone que la distancia entre cada
dos viene dada por la línea recta.
c (1,7) d (15,7)
e (15,4)
b (4,3)
a (0,0) f (18,0)
a
b 5
c 7,07 5
d 16,55 11,70 14
e 15,52 11,05 14,32 3
f 18 14,32 18,38 7,6 5
distan. a b c d e f
v Heurística voraz:
Ir seleccionando parejas de puntos que serán
visitados de forma consecutiva:
– se seleccionará primero aquella pareja de puntos
entre los que la distancia sea mínima;
– a continuación, se selecciona la siguiente pareja
separada con una distancia mínima siempre que
esta nueva elección no haga que:
u se visite un punto dos veces o más (es decir,
que el punto aparezca tres o más veces en
las parejas de puntos seleccionadas), o
u se cierre un recorrido antes de haber
visitado todos los puntos.
v En el ejemplo anterior:
– Las parejas ordenadas por distancia entre sus
puntos son: (d,e), (a,b), (b,c), (e,f), (a,c), (d,f),
(b,e), (b,d), (c,d), (b,f), (c,e), (a,e), (a,d), (a,f) y (c,f).
– Se selecciona primero la pareja (d,e) pues la
distancia entre ambos puntos es mínima
(3 unidades).
(d,e)
– Después se seleccionan las parejas (a,b), (b,c) y
(e,f). La distancia es para todas ellas igual
(5 unidades).
(d,e), (a,b), (b,c), (e,f)
– La siguiente pareja de distancia mínima es (a,c),
con longitud 7,07.
Sin embargo, esta pareja cierra un recorrido junto
con otras dos ya seleccionadas, (b,c) y (a,b), por lo
que se descarta.
– La siguiente pareja es (d,f) y se descarta también
por motivos similares.
c d
b e
f
a