Professional Documents
Culture Documents
Optimizacin
Ej. 1: n-reinas
1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8
Ej. 1: n-reinas
Formulacin 1:
Variables: X={xij}
xij {0,1}
Restricciones:
ij
(i, j ), (k , l )
( xij xkl 1)
(i j ) ( j l ) (| i k || j l |)
Formulacin 2:
Variables: X={xi}
xij {1,..,n}
columna j
Restricciones:
(| i j || xi x j |)
Ej. 2: k-coloreado
Formulacin:
Variables: X={x1, x2,..., xn}
xi {1,2,...,k}
Restricciones:
(i, j ) E
xi x j
Formulacin:
Variables: X={x1, x2,..., xn}
xi {1,2,...,n}
Restricciones:
Problemas de Decisin y
Optimizacin
Formulacin:
Variables: X={x1, x2,..., xn}
xi {0,1}
Escojo o no la arista i
Formulacin:
Variables: X={x1, x2,..., xn}
xi {1,2,...,n}
Restricciones:
1 i n ( xi , x(i 1)%2 ) E
Funcin Objetivo: F(X)= etiq(xi, x(i+1)%2)
Algoritmos voraces
El esquema voraz:
Introduccin
Formulacin:
Variables: X=(x1,x2,...,xn),
xi {0,1,..,C}
Restricciones: xi vi = C
Funcin objetivo: xi
Criterio voraz:
Tomar el mximo de monedas (sin sobrepasar C)
en orden decreciente de valor
Cambio de monedas
tipomoneda=(M25,M10,M5,M1)
tipomoneda=(M25,M10,M5,M1)
funcincambia(importe:nat;
funcincambia(importe:nat;
valor:vector[moneda]denat)
valor:vector[moneda]denat)
devuelvevector[moneda]denat
devuelvevector[moneda]denat
variablemon:moneda;
variablemon:moneda;
cambio:vector[moneda]denat
cambio:vector[moneda]denat
principio
principio
paratodomonenmonedahacer
paratodomonenmonedahacer
cambio[mon]:=0
cambio[mon]:=0
fpara;
fpara;
paramon:=M25hastaM1hacer
paramon:=M25hastaM1hacer
mqvalor[mon]?importehacer
mqvalor[mon]?importehacer
cambio[mon]:=cambio[mon]+1;
cambio[mon]:=cambio[mon]+1;
importe:=importevalor[mon]
importe:=importevalor[mon]
fmq
fmq
fpara;
fpara;
devuelvecambio
devuelvecambio
fin
fin
Cambio de monedas
Ejercicios :
Demostrar la correccin del algoritmo.
Demostrar, buscando contraejemplos, que el
algoritmo no es ptimo si se aade un nuevo tipo
de moneda de 12 pesetas o si se elimina alguno
de los tipos existentes.
Demostrar que, en esas condiciones, el
algoritmo puede incluso no encontrar solucin
alguna aunque sta exista.
Es el mtodo de ordenacin por seleccin
directa un algoritmo voraz?
El problema de la mochila
Sean:
n objetos fraccionables.
(p1,...,pn), pesos.
(b1,...,bn), beneficios.
mochila con capacidad C.
Restricciones:
xi
Funcin objetivo:
F(X) = xi bi
pi C
Observaciones:
Podemos suponer p1++pn>C.
Podemos poner un = en la restriccin
El problema de la mochila
Ejemplo:
n=3
C=17
(b1,b2,b3)=(40,36,22)
(p1,p2,p3)=(15,12,8)
bixi
(x1,x2,x3) 1i3
(i) (1,1/6,0)
(ii) (0,3/4,1)
(iii) (0,1,5/8)
46
49
4975
El problema de la mochila
Cul es un criterio voraz correcto?
Volvamos al ejemplo:
1 estrategia: elegir el objeto con mayor
beneficio total (el primero).
Sin embargo, la mochila se llena muy
rpidamente con poco beneficio total.
2 estrategia: elegir el objeto que llene
menos la mochila, para acumular beneficios
de un nmero mayor de objetos. Sin
embargo, es posible que se elija un objeto
con poco beneficio simplemente porque
pesa poco.
3 estrategia, que es la ptima, es tomar
siempre el objeto que proporcione mayor
beneficio por unidad de peso.
Los algoritmos resultantes de aplicar cualquiera
de las dos primeras estrategias tambin son
voraces, pero no calculan la solucin ptima.
El problema de la mochila
constanten=...
constanten=...{nmerodeobjetos}
{nmerodeobjetos}
tipovectReal=vector[1..n]dereal
tipovectReal=vector[1..n]dereal
{Pre:i1..n:peso[i]>0,
{Pre:i1..n:peso[i]>0,
i1..n1:
i1..n1:
benef[i]/peso[i]?benef[i+1]/peso[i+1]}
benef[i]/peso[i]?benef[i+1]/peso[i+1]}
funcinmochila(benef,peso:vectReal;
funcinmochila(benef,peso:vectReal;
cap:real)devuelvevectReal
cap:real)devuelvevectReal
variablesresto:real;i:entero;
variablesresto:real;i:entero;
sol:vectReal
sol:vectReal
principio
principio
paratodoien1..nhacer
paratodoien1..nhacer
sol[i]:=0.0
sol[i]:=0.0{inicializarsolucin}
{inicializarsolucin}
fpara;
fpara;
resto:=cap;
resto:=cap;{capacidadrestante}
{capacidadrestante}
i:=1;
i:=1;
mq(i?n)and(peso[i]?resto)hacer
mq(i?n)and(peso[i]?resto)hacer
sol[i]:=1;
sol[i]:=1;
resto:=restopeso[i];
resto:=restopeso[i];
i:=i+1
i:=i+1
fmq;
fmq;
sii?nentoncessol[i]:=resto/peso[i]fsi;
sii?nentoncessol[i]:=resto/peso[i]fsi;
devuelvesol
devuelvesol
Caminos mnimos
E.W. Dijkstra:
A note on two problems in connexion with graphs,
Numerical Mathematica, 1, pp. 269-271, 1959.
Caminos mnimos
Caminos mnimos
{Pre:gesungrafodirigidoetiquetadononeg.}
{Pre:gesungrafodirigidoetiquetadononeg.}
funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesS:cjtVrt;
variablesS:cjtVrt;
D:vector[vrt]deetiq
D:vector[vrt]deetiq
principio
principio
wvrt:D[w]:=etiqueta(g,v,w);
wvrt:D[w]:=etiqueta(g,v,w);
D[v]:=0;S:={v};
D[v]:=0;S:={v};
mqSnocontengatodoslosvrticeshacer
mqSnocontengatodoslosvrticeshacer
elegirwSt.q.D[w]esmnimo;
elegirwSt.q.D[w]esmnimo;
S:=S{w};
S:=S{w};
uS:actualizardist.mn.comprobando
uS:actualizardist.mn.comprobando
siporwhayunatajo
siporwhayunatajo
fmq;
fmq;
devuelveD
devuelveD
fin
fin
Caminos mnimos
Implementacin ms detallada
Se utiliza en lugar de S su complementario T
Se supone que n es el nmero de vrtices
funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesT:cjtVrt;
variablesT:cjtVrt;
D:vector[vrt]deetiq;
D:vector[vrt]deetiq;
u,w:vrt;val:etiq
u,w:vrt;val:etiq
principio
principio
T:=;
T:=;
paratodowenvrthacer
paratodowenvrthacer
D[w]:=etiqueta(g,v,w);T:=T{w}
D[w]:=etiqueta(g,v,w);T:=T{w}
fpara;
fpara;
D[v]:=0;T:=T{v};
D[v]:=0;T:=T{v};
repetirn2veces
repetirn2veces{quedann1caminospor
{quedann1caminospor
determinar}
determinar}
{seleccindelmn.w:w
{seleccindelmn.w:wT,
T,uuT:D[w]?D[u]}
T:D[w]?D[u]}
val:=?;
val:=?;
paratodouenThacer
paratodouenThacer
siD[u]?valentw:=u;val:=D[u]fsi
siD[u]?valentw:=u;val:=D[u]fsi
fpara;
fpara;
...
...
Caminos mnimos
...
...
T:=T{w};
T:=T{w};
{serecalculanlasnuevasdist.mnimas}
{serecalculanlasnuevasdist.mnimas}
paratodouenThacer
paratodouenThacer
siD[w]+etiqueta(g,w,u)<D[u]
siD[w]+etiqueta(g,w,u)<D[u]
entD[u]:=D[w]+etiqueta(g,w,u)
entD[u]:=D[w]+etiqueta(g,w,u)
fsi
fsi
fpara
fpara
frepetir;
frepetir;
devuelveD
devuelveD
fin
fin
{Post:D=caminosMnimos(g,v)
{Post:D=caminosMnimos(g,v)
Caminos mnimos
Tiempo de ejecucin:
se supone que las operaciones sobre cjtos.
estn implementadas en tiempo constante,
excepto la creacin (p.ej., mediante un vector de
booleanos)
fase de inicializacin:
creacin del cjto. y ejecucin n veces de
diversas operaciones constantes: (n)
fase de seleccin:
las instrucciones del interior del bucle son
(1)
n de ejecuciones del bucle:
1 vuelta: se consultan n-1 vrtices,
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:
n supresiones a lo largo del algoritmo: (n)
fase de reclculo de las distancias mnimas:
queda (n2) por igual razn que la seleccin
Coste total: (n2)
Caminos mnimos
Caminos mnimos
TADcpa
TADcpa{colaPrior.DeAristas}
{colaPrior.DeAristas}
operaciones
operaciones
creaVaca:cpa
(1)
creaVaca:cpa
(1)
inserta:cpavrtetiqcpa
inserta:cpavrtetiqcpa (log
(log
n)
n)
primero:cpa(vrt,etiq)
(1)
primero:cpa(vrt,etiq)
(1)
borra:cpacpa
(log
borra:cpacpa
(log
n)
n)
sustit:cpavrtetiqcpa
sustit:cpavrtetiqcpa (log
(log
n)
n)
valor:cpavrtetiq
(1)
valor:cpavrtetiq
(1)
est?:cpavrtbool
(1)
est?:cpavrtbool
(1)
Implementacin:
heap
junto
con
un
vector
vaca?:cpabool
(1)
vaca?:cpabool
(1)
indexado por vrtices
1
2
3
4
5
<4,20>
<3,75>
<2,?>
<5,60>
el valor de la etiqueta
significa que el vrtice
no est en la cola
Caminos mnimos
funcinDijkstra(g:grafo;v:vrt)
funcinDijkstra(g:grafo;v:vrt)
devuelvevector[vrt]deetiq
devuelvevector[vrt]deetiq
variablesA:cpa;
variablesA:cpa;{coladearistasconprior.}
{coladearistasconprior.}
D:vector[vrt]deetiq;
D:vector[vrt]deetiq;
u,w:vrt;et,val:etiq
u,w:vrt;et,val:etiq
principio
principio
creaVaca(A);
creaVaca(A);
paratodowenvrthacer
paratodowenvrthacer
inserta(A,w,etiqueta(g,v,w))
inserta(A,w,etiqueta(g,v,w))
fpara;
fpara;
mqnoesVaca(A)hacer
mqnoesVaca(A)hacer
<w,val>:=primero(A);
<w,val>:=primero(A);
D[w]:=val;borra(A);
D[w]:=val;borra(A);
paratodo<u,et>ensuc(g,w)hacer
paratodo<u,et>ensuc(g,w)hacer
siest(A,u)entonces
siest(A,u)entonces
sival+et<valor(A,u)
sival+et<valor(A,u)
entsustituye(A,u,val+et)
entsustituye(A,u,val+et)
fsi
fsi
fsi
fsi
fpara
fpara
fmq;
fmq;
D[v]:=0;devuelveD
D[v]:=0;devuelveD
fin
fin
Caminos mnimos
Coste temporal:
inicializacin: (nlog n)
seleccin y supresin: (nlog n)
bucle interno: examina todas las aristas del grafo
y en el caso peor efecta una sustitucin por
arista, por tanto: (alog n)
Caminos mnimos
rboles de recubrimiento de
coste mnimo (minimum
spanning trees, MST)
MSTs
Terminologa:
rbol libre (spanning tree):
es un grafo no dirigido conexo acclico
MSTs
V. Jarnk: O jistm problmu minimlnm,
Prca Moravsk Prrodovedeck Spolecnosti,
6, pp. 57-63, 1930.
R.C. Prim:
Shortest connection networks and some generalization
Bell System Technical Journal, 36, pp. 1389-1401, 1957.
MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}
funcinPrim(g:grafo)devuelvegrafo
funcinPrim(g:grafo)devuelvegrafo
variablesU:cjtVrt;gsol:grafo;
variablesU:cjtVrt;gsol:grafo;
u,v:vrt;x:etiq
u,v:vrt;x:etiq
principio
principio
creaVaco(gsol);U:={cualquiervrtice};
creaVaco(gsol);U:={cualquiervrtice};
mqUnocontengatodoslosvrt.hacer
mqUnocontengatodoslosvrt.hacer
seleccionar<u,v,x>mnimat.q.u
seleccionar<u,v,x>mnimat.q.uU;v
U;vUU
aade(gsol,u,v,x);U:=U
aade(gsol,u,v,x);U:=U{v}
{v}
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}
Coste: (na)
(es decir, (n3) si el grafo es denso)
MSTs
MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}
funcinPrim(g:grafo)devuelvegrafo
funcinPrim(g:grafo)devuelvegrafo
variables
variables
arisMn:vector[vrt]de<vrt,etiq>;
arisMn:vector[vrt]de<vrt,etiq>;
gsol:grafo;prim,mn,v,w:vrt;x:etiq
gsol:grafo;prim,mn,v,w:vrt;x:etiq
principio
principio
prim:=unVrticeCualquiera;
prim:=unVrticeCualquiera;
arisMn[prim]:=<prim,?>;
arisMn[prim]:=<prim,?>;
paratodovenvrthacer
paratodovenvrthacer
arisMn[v]:=<prim,etiqueta(g,prim,v)>
arisMn[v]:=<prim,etiqueta(g,prim,v)>
fpara;
fpara;
creaVaco(gsol);
creaVaco(gsol);
hacern1veces
hacern1veces
mn:=prim;
mn:=prim;{centinela:arisMn[mn].et=?}
{centinela:arisMn[mn].et=?}
paratodovenvrthacer
paratodovenvrthacer
<w,x>:=arisMn[v];
<w,x>:=arisMn[v];
six<arisMn[mn].et
six<arisMn[mn].et
entmn:=v
entmn:=v
fsi;
fsi;
fpara;
fpara;
...
...
MSTs
...
...
aade(gsol,mn,arisMn[mn].v,
aade(gsol,mn,arisMn[mn].v,
arisMn[mn].et);
arisMn[mn].et);
arisMn[mn]:=<mn,?>;
arisMn[mn]:=<mn,?>;
paratodo<v,x>enadyacentes(g,mn)hacer
paratodo<v,x>enadyacentes(g,mn)hacer
si(arisMn[v].v?v)y(x<arisMn[v].et)
si(arisMn[v].v?v)y(x<arisMn[v].et)
entoncesarisMn[v]:=<mn,x>fsi
entoncesarisMn[v]:=<mn,x>fsi
fpara
fpara
frepetir;
frepetir;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}
MSTs
Eficiencia temporal:
inicializacin: lineal en caso de matriz de
adyacencia y cuadrtica en caso de listas
bucle principal:
el bucle de seleccin: (n)
el aadido de una arista al grafo: constante
usando matriz, lineal usando listas
el bucle de reorganizacin:
con matriz de adyacencia: el clculo de los
adyacentes es (n) y el coste total queda
(n2)
con listas: el coste total es (a+n)
MSTs
Algoritmo de Kruskal:
Partiendo del rbol vaco, se selecciona en cada
paso la arista de menor etiqueta que no
provoque ciclo sin requerir ninguna otra
condicin sobre sus extremos.
MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}
funcinKruskal(g:grafo)devuelvegrafo
funcinKruskal(g:grafo)devuelvegrafo
variablesgsol:grafo;
variablesgsol:grafo;
u,v:vrt;x:etiq
u,v:vrt;x:etiq
principio
principio
creaVaco(gsol);
creaVaco(gsol);
mqgsolnoseaconexohacer
mqgsolnoseaconexohacer ()
seleccionar<u,v,x>mnimanoexaminada;
seleccionar<u,v,x>mnimanoexaminada;
sinoprovocaciclo
sinoprovocaciclo
entoncesaade(gsol,u,v,x)
entoncesaade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}
MSTs
Implementacin eficiente:
En cada momento, los vrtices que estn dentro
de una componente conexa en la solucin
forman una clase de equivalencia, y el algoritmo
se puede considerar como la fusin continuada
de clases hasta obtener una nica componente
con todos los vrtices del grafo.
A
50
30
40 40
C
10 20
50
60
{[A],[B],[C,D],[E]}
{[A,B],[C,D,E]}
MSTs
gnerorev
gnerorev{relac.deequiv.sobrevrt.}
{relac.deequiv.sobrevrt.}
operaciones
operaciones
creaREV:
creaREV:
rev
rev{cadavrt.unaclase}
{cadavrt.unaclase}
clase:revvrt
clase:revvrt
nat
nat
fusiona:revnatnat
fusiona:revnatnat
rev
rev
numClases:rev
numClases:rev
nat
nat
Implementacin asintticamente
ptima:
MF sets
el coste de creaREV es lineal
el coste de numClases es constante
el coste de k ejecuciones combinadas de
fusiona y clase es (k(k,n)), lo cual es
prcticamente constante, porque
es una funcin inversa de la
funcin de Ackerman que crece MUY
despacio ((k,n)4, para todos los valores
de k y n imaginables)
MSTs
{Pre:gesungrafonodirigidoconexo
{Pre:gesungrafonodirigidoconexo
etiquetadononegativamente}
etiquetadononegativamente}
funcinKruskal(g:grafo)devuelvegrafo
funcinKruskal(g:grafo)devuelvegrafo
variablesT:cpa;gsol:grafo;
variablesT:cpa;gsol:grafo;
u,v:vrt;x:etiq;
u,v:vrt;x:etiq;
C:rev;ucomp,vcomp:nat
C:rev;ucomp,vcomp:nat
principio
principio
creaREV(C);
creaREV(C);{cadavrt.formaunaclase}
{cadavrt.formaunaclase}
creaVaco(gsol);creaVaca(T);
creaVaco(gsol);creaVaca(T);
{secolocantodaslasaristasenlacola}
{secolocantodaslasaristasenlacola}
paratodovenvrthacer
paratodovenvrthacer
paratodo<u,x>enadyacentes(g,v)hacer
paratodo<u,x>enadyacentes(g,v)hacer
inserta(T,v,u,x)
inserta(T,v,u,x)
fpara
fpara
fpara;
fpara;
...
...
MSTs
...
...
mqnumClases(C)>1hacer
mqnumClases(C)>1hacer
{obteneryeliminarlaaristamn.delacola}
{obteneryeliminarlaaristamn.delacola}
<u,v,x>:=primero(T);borra(T);
<u,v,x>:=primero(T);borra(T);
{silaaristanoprovocacicloseaadeala
{silaaristanoprovocacicloseaadeala
solucinysefusionanlasclasescorresp.}
solucinysefusionanlasclasescorresp.}
ucomp:=clase(C,u);vcomp:=clase(C,v);
ucomp:=clase(C,u);vcomp:=clase(C,v);
siucomp?vcompentonces
siucomp?vcompentonces
fusiona(C,ucomp,vcomp);
fusiona(C,ucomp,vcomp);
aade(gsol,u,v,x)
aade(gsol,u,v,x)
fsi
fsi
fmq;
fmq;
devuelvegsol
devuelvegsol
fin
fin
{Post:gsolarm(g)}
{Post:gsolarm(g)}
MSTs
Cdigos de Huffman
D.A. Huffman: A method for the construction of
minimum-redundancy codes,
Proceedings of the IRE, 40(9), pp. 1098-1101, 1952.
Los cdigos de Huffman son una tcnica muy til para comprimir ficheros.
El algoritmo voraz de Huffman utiliza
una tabla de frecuencias de aparicin
de cada carcter para construir una
forma ptima de representar los
caracteres con cdigos binarios.
Ejemplo:
Se tiene un fichero con 100.000 caracteres que
se desea compactar. Las frecuencias de
aparicin de caracteres en el fichero son las
siguientes:
a
b
c
d
e
f
frec. en miles
45 13 12 16 9
5
Puede usarse un cdigo de longitud fija (de 3
bits). El fichero requerira 300.000 bits.
a
b
c
d
e
f
cd.long.fija 000 001 010 011 100
101
Cdigos de Huffman
Puede hacerse mejor con un cdigo de
longitud variable, dando codificaciones cortas a
los caracteres ms frecuentes y ms largas a los
menos frecuentes.
a
b
cd.long.var.
0
1101
1100
c
d
e
f
101 100 111
Cdigos de Huffman
10
0
86
14
58
0
28
0
a:45 b:13
10
0
a:45
55
0
14
1
c:12 d:16
e:9
f:5
25
0
30
1
c:12 b:13
d:16
14
0
f:5
e:9
Cdigos de Huffman
Cdigos de Huffman
{Pre:Ceselconjuntodecaracteresyfesel
{Pre:Ceselconjuntodecaracteresyfesel
vectordefrecuencias}
vectordefrecuencias}
funcinHuffman(C:conjunto;f:vectFrec)
funcinHuffman(C:conjunto;f:vectFrec)
devuelverbol
devuelverbol
variablesQ:colaPri;i,fx,fy,fz:entero;
variablesQ:colaPri;i,fx,fy,fz:entero;
z,x,y:rbol
z,x,y:rbol
principio
principio
creaVaca(Q);
creaVaca(Q);
paratodoxenChacer
paratodoxenChacer
inserta(Q,<x,f[x]>)
inserta(Q,<x,f[x]>)
fpara;
fpara;
parai:=1hasta|C|1hacer
parai:=1hasta|C|1hacer
<x,fx>:=primero(Q);borra(Q);
<x,fx>:=primero(Q);borra(Q);
<y,fy>:=primero(Q);borra(Q);
<y,fy>:=primero(Q);borra(Q);
fz:=fx+fy;
fz:=fx+fy;
z:=crearbol(raz=>fz,
z:=crearbol(raz=>fz,
hijoIzq=>x;
hijoIzq=>x;
hijoDer=>y);
hijoDer=>y);
inserta(Q,<z,fz>)
inserta(Q,<z,fz>)
fpara;
fpara;
<z,fz>:=primero(Q);borra(Q)
<z,fz>:=primero(Q);borra(Q)
devuelvez
devuelvez
fin
fin
{Post:zeselrboldeuncdigolibrede
{Post:zeselrboldeuncdigolibrede
prefijosptimopara(C,f)}
prefijosptimopara(C,f)}
Cdigos de Huffman
f:5
(1)
(2)
d:16 25 a:45
0
1
1
f:5
e:9
(3) 14
c:12 b:13
f:5
55
0
(5)
25
0
30
1
c:12 b:13
d:16
14
f:5
e:9
c:12 b:13
a:45
30
25
(4)
a:45
e:9
d:16
14
0
f:5
e:9
10
0
a:45
55
0
(6)
25
0
30
1
c:12 b:13
d:16
14
f:5
e:9
El problema de la seleccin
de actividades
Es un problema de planificacin de
tareas (en ingls, scheduling).
Se tienen n actividades (por ej., clases)
que deben usar un recurso (por ej., un
aula) que slo puede ser usado por una
actividad en cada instante.
Cada actividad i:
ci instante de comienzo
fi instante de finalizacin fi
debe hacerse durante [ci,fi).
El problema de seleccin de
actividades consiste en seleccionar un
conjunto de actividades mutuamente
compatibles que tenga cardinal
mximo.
Seleccin de Actividades
Formulacin:
Variables: X={x1, x2,..., xn}
xi {0,1}
Escojo o no la actividad i
Restricciones:
i, j
( xi x j 1) ci f j c j f i
seleccin de actividades
constanten=...
constanten=...{nmerodeactividades}
{nmerodeactividades}
tipovectReal=vector[1..n]dereal
tipovectReal=vector[1..n]dereal
{Pre:i1..n:c[i]?f[i],i1..n1:f[i]?f[i+1]}
{Pre:i1..n:c[i]?f[i],i1..n1:f[i]?f[i+1]}
funcinselec(c,f:vectReal)devuelveconjunto
funcinselec(c,f:vectReal)devuelveconjunto
variablesi,j:entero;A:conjunto
variablesi,j:entero;A:conjunto
principio
principio
A:={1};
A:={1};
j:=1;
j:=1;{jeslaltimaactividadseleccionada}
{jeslaltimaactividadseleccionada}
parai:=2hastanhacer
parai:=2hastanhacer
sic[i]?f[j]
sic[i]?f[j]
entoncesA:=A{i};j:=i
entoncesA:=A{i};j:=i
fsi
fsi
fpara;
fpara;
devuelveA
devuelveA
fin
fin
{Post:Aessolucinptimadelproblemade
{Post:Aessolucinptimadelproblemade
laseleccindeactividades.}
laseleccindeactividades.}
Coste
temporal: (n)
xi {1,..,n}
Restricciones: X Permut(1,2,...,n)
Funcin Objetivo:
n
i 1
j 1
T[x ]
Ejemplo:
3 clientes con t1=5, t2=10, t3=3.
orden
1 2 3:
1 3 2:
2 1 3:
2 3 1:
3 1 2:
3 2 1:
T
5 + (5+10) +
(5+10+3)
=
5 + (5+3) + (5+3+10) = 31
10 +(10+5) +
(10+5+3)
=
10 +(10+3) +
(10+3+5)
=
ptimo
3 + (3+5) + (3+5+10) = 29
3 + (3+10) +
(3+10+5)
=
38
43
41
34
Heursticas voraces:
Coloreado de grafos
3
1
5
4
Heursticas voraces:
Coloreado de grafos
Algoritmo voraz de coloreado de un grafo:
3
1
5
4
Heursticas voraces:
Coloreado de grafos
Sin embargo, tomando el mismo grafo pero
ordenando los vrtices de otra forma, 1,5,2,3,4,
el algoritmo voraz coloreara 1 y 5 de un color, 2
en otro, y necesitara un tercer color para 3 y 4.
3
1
4
Por tanto es un algoritmo heurstico que tiene
la posibilidad, pero no la certeza, de
encontrar la solucin ptima.
Todos los algoritmos exactos conocidos para el
problema del coloreado de un grafo emplean un
tiempo exponencial, de ah la utilidad de la
heurstica voraz.
Heursticas voraces: El
problema del viajante de
comercio
Ejemplo:
Cinco cabinas de telfonos, b, c, d, e, f, para las
que se conocen sus coordenadas relativas a la
central telefnica, 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 lnea recta.
(1,7)
b
(4,3)
(0,0)
d
e
a
b
5
c 7,07
5
d 16,55 11,70
14
e 15,52 11,05 14,32
f
18 14,32 18,38
distan. a
b
c
(15,7)
(15,4)
f
(18,0)
3
7,6
d
5
e
Heursticas voraces:TSP
d
f
Heursticas voraces:TSP
Heurstica voraz:
Ir seleccionando parejas de puntos que sern
visitados de forma consecutiva:
se seleccionar primero aquella pareja de puntos
entre los que la distancia sea mnima;
a continuacin, se selecciona la siguiente pareja
separada con una distancia mnima siempre que
esta nueva eleccin no haga que:
se visite un punto dos veces o ms (es decir,
que el punto aparezca tres o ms veces en
las parejas de puntos seleccionadas), o
se cierre un recorrido antes de haber
visitado todos los puntos.
De esta forma, si hay que visitar n puntos
(incluido el origen), se selecciona un conjunto de
n parejas de puntos (que sern visitados de
forma consecutiva) y la solucin consiste en
reordenar todas esas parejas de forma que
constituyan un recorrido.
Heursticas voraces:TSP
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 mnima
(3 unidades).
(d,e)
Despus 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 mnima 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 tambin
por motivos similares.
d
b
e
f