Documentos de Académico
Documentos de Profesional
Documentos de Cultura
AB Algoritmia =
Algoritmia = tratamiento sistemático de
técnicas fundamentales para
el diseño y análisis de
algoritmos eficientes
G. Brassard y P. Bratley
Fundamentos de Algoritmia (Prólogo)
¿qué herramientas?:
Σ bixi
(x1,x2,x3) 1≤i≤3
(i) (1,1/6,0) 46
(ii) (0,3/4,1) 49
(iii) (0,1,5/8) 49’75
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 11
El problema de la mochila
• 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.
Σ bixi.
– La función objetivo a maximizar es 1≤i≤n
{Pre:∀i∈1..n:peso[i]>0 ∧
∀i∈1..n-1:benef[i]/peso[i]≥benef[i+1]/peso[i+1]}
función mochila(benef,peso:vectReal; cap:real) devuelve vectReal
variables resto:real; i:entero; sol:vectReal
principio
para todo i en 1..n hacer
sol[i]:=0.0 {inicializar solución}
fpara;
resto:=cap; {capacidad restante}
i:=1;
mq (i≤n) and (peso[i]≤resto) hacer
sol[i]:=1; resto:=resto-peso[i]; i:=i+1
fmq;
si i≤n entonces sol[i]:=resto/peso[i] fsi;
devuelve sol
fin
{Post: sol es solución óptima del problema de la mochila}
12 3 3 12
3 3
5 5
1 2 5 1 2 5
21 4 21 4
4 4
• Búsqueda de caminos de longitud mínima
– longitud o coste de un camino: suma de los pesos de las aristas que lo componen
– cálculo de la longitud mínima de los caminos existentes entre dos vértices dados
• Características del tipo de dato de las etiquetas (o pesos):
– dominio ordenado (<, =, ≤)
– operación suma (+):
• conmutativa
• con elemento neutro (0), que es además el peso más pequeño posible
• con elemento idempotente (∞), que es además el peso más grande posible
1
falso verdad falso
2 nil
2 1
2 1 nil
3
2 nil
3
3 1 2 nil nil
1
Grafo dirigido 2 2 1 nil 2 3 nil nil
3 nil
Listas de adyacencia
1 2 3 nil
representación basada en listas
Grafo no dirigido Listas de adyacencia
“ simples” de adyacencia), puede
representarse cada arista con un 1 2
1 4 2 4 3 4
• 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.
...
{se marca w como vértice tratado}
T:=T-{w};
{se recalculan las nuevas dist. mínimas}
para todo u en T hacer
si D[w]+etiqueta(g,w,u)<D[u]
ent D[u]:=D[w]+etiqueta(g,w,u)
fsi
fpara
frepetir;
devuelve D
fin
{Post: D=caminosMínimos(g,v)
Nota: el bucle principal se ejecuta n-2 veces porque el último camino queda
calculado después del último paso (no quedan vértices para hallar atajos)
Solución: nuevo tipo de cola con prioridades que permita el acceso directo
a cualquier elemento.
asegurar que todos los computadores pueden comunicar entre sí, minimizando el
precio total de la red
R.C. Prim:
“Shortest connection networks and some generalizations”,
Bell System Technical Journal, 36, pp. 1389-1401, 1957.
Coste: Θ(na)
(es decir, Θ(n3) si el grafo es denso)
si v∈U: arisMín[v]=<v,∞>
...
{a continuación se añade a la solución}
añade(gsol,mín,arisMín[mín].v,arisMín[mín].et);
{se añade mín al conjunto de vértices tratados}
arisMín[mín]:=<mín,∞>;
{se reorganiza el vector comprobando si la arista mínima de los
vértices todavía no tratados los conecta a mín}
para todo <v,x> en adyacentes(g,mín) hacer
si (arisMín[v].v≠v)and(x<arisMín[v].et)
entonces arisMín[v]:=<mín,x>
fsi
fpara
frepetir;
devuelve gsol
fin
{Post: gsol∈arm(g)}
• Algoritmo de Kruskal:
– Se basa también en la propiedad de los árboles de
recubrimiento de coste mínimo:
30 3
A B A B
40 40 4
50 C 60 C
10 20 1 2
D 50
E D E
→ {[A,B],[C,D,E]} → {[A,B,C,D,E]}
...
mq numClases(C)>1 hacer
{obtener y elim. la arista mín.de la cola}
<u,v,x>:=primero(T); borra(T);
{si la arista no provoca ciclo se añade a la
solución y se fusionan las clases corresp.}
ucomp:=clase(C,u); vcomp:=clase(C,v);
si ucomp≠vcomp entonces
fusiona(C,ucomp,vcomp);
añade(gsol,u,v,x)
fsi
fmq;
devuelve gsol
fin
{Post: gsol∈arm(g)}
• 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
aparic. (en miles) 45 13 12 16 9 5
– Puede usarse un código de longitud fija (de 3 bits). El fichero requeriría 300.000 bits.
a b c d e f
cód.long.fija 000 001 010 011 100 101
a b c d e f
cód.long.var. 0 101 100 111 1101 1100
Este código ahorra algo más del 25% (requiere 224.000 bits en lugar de 300.000).
• Se precisa un código libre de prefijos:
– Ninguna codificación puede ser prefijo de otra.
– De esta forma, la decodificación es inmediata pues no hay ambigüedades.
– Por ejemplo: ‘001011101’ sólo puede ser ‘aabe’.
• El código se representa mediante un trie (árbol lexicográfico):
– árbol binario cuyas hojas son los caracteres codificados;
– el código de cada carácter es el camino desde la raíz hasta la hoja, donde ir al hijo
izquierdo significa ‘0’ e ir hacia el derecho significa ‘1’.
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
– Cada hoja está etiquetada con un carácter y su frecuencia.
– Cada nodo interno está etiquetado con la suma de los pesos de las hojas de
su subárbol.
– Un código óptimo siempre está representado por un árbol lleno: cada
nodo interno tiene dos hijos.
• Si el alfabeto que se quiere codificar es C, entonces el árbol del código
óptimo tiene |C| hojas y |C| – 1 nodos internos.
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 60
Códigos de Huffman
• El algoritmo voraz de Huffman construye el árbol A de
un código óptimo de abajo hacia arriba.
• Utiliza una cola Q de árboles con prioridades (las
frecuencias hacen de prioridades).
• Empieza con un conjunto de |C| hojas en Q y realiza
una secuencia de |C| – 1 “mezclas” hasta crear el árbol
final.
• En cada paso, se “mezclan” los dos objetos (árboles) de
Q que tienen menos frecuencia y el resultado es un
nuevo objeto (árbol) cuya frecuencia es la suma de las
frecuencias de los dos objetos mezclados.
f:5 e:9 c:12 b:13 d:16 a:45 c:12 b:13 14 d:16 a:45 (3º) 14 d:16 25 a:45
0 1 0 1 0 1
(1º) (2º) f:5 e:9 f:5 e:9 c:12 b:13
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
k≠a,b
• Corrección:
Teorema 16.11 en [CLRS09, pp. 441-442]
(un par de páginas; sin gran dificultad).
1 2 5
1 2 5
1 2 5
• En términos matemáticos es el
problema del cálculo del hamiltoniano
de longitud mínima.
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
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 95
Heurísticas voraces: El problema del viajante de comercio
tA(n)≤cn2
– La solución de la ecuación
• Además:
La fusión de T[1..k] y T[k+1..n] (ya ordenados) en el mismo T[1..n] puede
hacerse en tiempo lineal utilizando sólo una cantidad fija de variables
auxiliares (independiente de n).
(Ejercicio 18 de la sección 5.2.4 de [Knu87] D.E. Knuth. El arte de programar
ordenadores. Volumen III: Clasificación y búsqueda. Editorial Reverté, 1987,
“nivel [40]” => “realmente difícil o largo”… ver artículo en “material adicional”.)
(nótese que la definición formal es más general: n puede ser par y además
puede haber elementos repetidos, incluida la mediana)
Primera solución:
– Ordenar T y extraer el elemento n/2-ésimo.
– Tiempo Θ(n log n).
{i ∈[1..n]| }
T[i ]< m < k , y
{i ∈[1..n]| T[i ]≤ m ≥ k }
Es decir, el elemento en posición k si T estuviese ordenado crecientemente.
– El producto es:
uv = 102s wy + 10s (wz+ xy) + xz
( ) ( )
t (n) = 3t n 2 + t n 2 + Θ (n)
Si n se supone potencia de 2,
( )
t (n) = 4t n 2 + Θ(n)
t (n) ∈O (n 2)
( ) ( ) ( )
t 2 (n) ∈t2 n 2 + t2 n 2 + t2 1+ n 2 + Θ(n)
Y por tanto,
( ) (
t 2 (n) ∈Θ nlog 3 ∈O n 1,59 )
– Debido a la constante multiplicativa, el algoritmo sólo es interesante en la
práctica para n grande.
– Una buena implementación no debe usar la base 10 sino la base más
grande posible que permita multiplicar dos “cifras” (de esa base)
directamente en hardware.
( );
2
En otras palabras, x 25 = x24x ; x24 = x12 etc
c
(∗∗) z, n, c…
a: a=cs
mod z
m: mensaje (ASCII)
Yo también…
(∗∗) ¿Por qué?
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 40
Introducción a la criptografía
• Cálculo de n:
egcd(n,φ,d,s,t);
si d=1
entonces s es el buscado
sino n no es ‘bueno’
fsi
ns+tφ=1⇒ns=1–tφ
n s mod φ = (1 – t φ) mod φ = 1 – 0 = 1
– Roberto calcula
cs mod z = (an mod z)s mod z = ans mod z = a
(porque ns mod φ = 1).
– Conoce z, n y c.
• Coste:
– Una suma de matrices n×n está en Θ(n2).
– Suponer que n es potencia de 2; se obtiene la recurrencia:
( )
T (n) = 7T n 2 + Θ(n2)
• ¿Y si n no es potencia de 2?
– Supongamos que está resuelto para n par.
– Si n es impar (mayor que 1), no bastan con n-1 días para la competición,
sino que se necesitan n.
Basta con resolver el problema resultante de añadir un participante
(ficticio) más: el n+1.
Como n+1 es par, podemos calcular el calendario, que consta de n días.
Una vez resuelto, si al participante i-ésimo le toca jugar el día j-ésimo
contra el participante n+1 (ficticio), eso significa que j es el día de
descanso para el participante i.
con xi ∈{0,1}, k ≤ i ≤ l
j
mochila 1, j , ∑ pi xi
i =1
j
mochila j + 1,n,C − ∑ pi xi
i=1
{
gj (c) = max gj + 1(c), g j+ 1(c − pj ) + bj }
dependiendo de que el objeto j-ésimo entre o no en la solución
(nótese que sólo puede entrar si c-pj≥0).
– Además,
gn+ 1 (c) = 0, para cualquier capacidad c
{
gj (c) = max gj − 1(c) , gj − 1(c − pj ) + bj }
dependiendo de que el objeto j-ésimo entre o no en la solución
(nótese que sólo puede entrar si c-pj≥0).
– Además,
g0(c ) = 0, para cualquier capacidad c
c=…
j=0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
j=1
j=2
j=3
{
g j (c ) = max g j − 1(c) , g j − 1(c − p j ) + b j }
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 14
El problema de la mochila 0-1
algoritmo mochila(ent p,b:vect[1..n]de nat; ent Cap:nat;
sal g:vect[0..n,0..Cap]de nat)
variables c,j:nat
principio
para c:=0 hasta Cap hacer g[0,c]:=0 fpara;
para j:=1 hasta n hacer g[j,0]:=0 fpara;
para j:=1 hasta n hacer
para c:=1 hasta Cap hacer
si c<p[j] entonces
g[j,c]:=g[j-1,c]
sino
si g[j-1,c]≥g[j-1,c-p[j]]+b[j] entonces
g[j,c]:=g[j-1,c]
sino
g[j,c]:=g[j-1,c-p[j]]+b[j]
fsi
fsi
fpara
fpara
fin
2 5 6 4
12
4 9 9
V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
N max {N 3,i }
N 2,1 N 2,2 2,3 i= 0,1
N 1,3 N 2,2
v2,3 v3,3
N 2,0
N 2,1 N 3,0
N 1,4 N 2,4
v2,4 v3,4
N 2,0
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 22
Camino de coste mínimo en un grafo multietapa
• Solución de programación dinámica:
V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
C∗ (i , j ) = min
l ∈V i+ 1
{c( j ,l )+ C∗ (i + 1,l )}, para 1≤ i ≤ k − 2
( j ,l )∈A
V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
C∗ (i , j ) = min
l ∈V i+ 1
{c( j ,l )+ C∗ (i + 1,l )}, para 1≤ i ≤ k − 2
( j ,l )∈A
V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
C∗ (3,5)= min {8+ C ∗(4,7),11+ C ∗ (4,8),6+ C ∗(4,9)}= 13
C ∗ (3,6)= 4+ C ∗(4,8) = 13
C ∗ (2,2)= min {3+ C ∗(3,5),1+ C ∗ (3,6)}= 14
C ∗ (2,3)= 4+ C ∗(3,5) = 17
C ∗ (2,4)= min {5+ C ∗(3,5),9+ C ∗ (3,6)}= 18
C ∗ (1,1)= min {5+ C ∗(2,2),7+ C ∗ (2,3),2+ C ∗(2,4)}= 19
C∗ (i , j ) = min
l ∈V i− 1
{c(l , j )+ C∗ (i − 1,l )}, para 3≤ i ≤ k
(l , j )∈A
V1 V2 V3 V4 V5
2 3
8
7 5
5 1 5 11
7 9
o 1 3 4 6 8 10 d
2 5 6 4
12
4 9 9
¡El caso más eficiente es casi 19 veces más rápido que el más lento!
n −1
T (n) = ∑ T (i )T (n − i ), para n > 1
i =1
T (1) = 1 Números de Catalan
1 2n − 2
T (n) =
n n− 1
Por ejemplo:
n 1 2 3 4 5 10 15
T (n) 1 1 2 5 14 4862 2674440
deberán ser realizados de forma óptima para que el total también sea
óptimo.
• Método:
– Construir la matriz [mij], 1≤i≤j≤n, donde mij da el óptimo (i.e., el número
de multiplicaciones escalares requeridas) para la parte
del producto total.
– La solución final vendrá dada por m1n.
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 34
Multiplicación de una secuencia de matrices
– Construcción de [mij], 1≤i≤j≤n:
• Guardar las dimensiones de las Mi, 1≤i≤n, en un vector d, de
0..n componentes, de forma que Mi tiene dimensiones di-1×di.
• La diagonal s de [mij] contiene los mij tales que j-i=s:
– Para s=3:
– La matriz es:
(s = j – i,
es decir,
j = i + s)
– Θ(n3)
• Coste en memoria:
– Θ(n2)
i ?
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 46
Comparaciones de secuencias
algoritmo compSec(ent A:cad[n]; ent B:cad[m];
sal C:vect[0..n,0..m]de nat; sal T:vect[1..n,1..m]de Transf)
{Transf=(borrar,insert,sustit,nada); i.e. posibles transformaciones}
variables i,j,x,y,z:nat
principio
para i:=0 hasta n hacer C[i,0]:=i fpara;
para j:=0 hasta m hacer C[0,j]:=j fpara;
para i:=1 hasta n hacer
para j:=1 hasta m hacer
x:=C[i-1,j]+1; y:=C[i,j-1]+1;
si A[i]=B[j] entonces z:=C[i-1,j-1]
sino z:=C[i-1,j-1]+1
fsi;
C[i,j]:=min(x,y,z);
T[i,j]:= (min=x) => borrar; {último cambio de A[i] a B[j]}
(min=y) => insert;
(min=z) & A[i]=B[j]) => nada;
(min=z) & A[i]≠B[j]) => sustit;
fpara
fpara
Fin
– En tiempo: Θ(nm)
– En espacio: Θ(nm)
• En resumen:
– Se tiene la siguiente ecuación recurrente que define el método
de programación dinámica.
{ }
Dk (i , j) = min Dk − 1(i , j ), Dk − 1(i , k) + Dk − 1(k , j ) ,
k ≥1
D0 (i , j) = C (i , j ), 1≤ i ≤ n, 1≤ j ≤ n
...
para todo k en vért hacer
para todo i en vért hacer
para todo j en vért hacer
si D[i,k]+D[k,j]<D[i,j] entonces
D[i,j]:=D[i,k]+D[k,j]
fsi
fpara
fpara
fpara;
devuelve D
fin
{Post: D=caminosMínimos(g)}
Palabra Probabilidad
• Ejemplo: a 0, 22
qi = 0, 0≤ i ≤ 7 al 0,18
ama 0, 20
eso 0,05
si 0, 25
sin 0,02
Algoritmia básica - Javier Campos (Universidad de Zaragoza) su 0,08 57
Árboles binarios de búsqueda óptimos
si
• Solución 1:
eso • Solución 2:
a su
Creada con
estrategia voraz. Árbol perfectamente
ama sin al sin equilibrado.
C=2,43
al eso a ama si su C=2,70
ama
• Solución 3:
a si
Es óptima.
C=2,15 al eso su
sin
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 58
Árboles binarios de búsqueda óptimos
E.N. Gilbert y E.F. Moore: “Variable length encodings”,
Bell System Technical Journal, 38(4), pp. 933-968, 1959.
{ }
Cij = mij + min Ci , k − 1 + Ckj , si 0≤ i < j ≤ n
i < k≤ j
Cii = 0, si 0≤ i ≤ n
Palabra Probabilidad
a 0, 22
al 0,18
ama
eso
0, 20
0,05 { }
Cij = mij + min Ci , k− 1 + Ckj , si 0≤ i < j ≤ n
i < k≤ j
si 0, 25
sin 0,02 Cii = 0, si 0≤ i ≤ n
su 0,08
0 1 2 3 4 5 6 7
0 0 0,22 0,58 1,02 1,17 1,83 1,89 2,15
7º
1 0 0,18 0,56 0,66 1,21 1,27 1,53
6º
2 0 0,20 0,30 0,80 0,84 1,02
5º
3 0 0,05 0,35 0,39 0,57
C= 4º
4 0 0,25 0,29 0,47
3º
5 0 0,02 0,12
2º
6 0 0,08
1º
7 0
...
para d:=2 hasta n hacer
para j:=d hasta n hacer
i:=j-d;
min:=maxEntero;
para k:=i+1 hasta j hacer
aux:=C[i,k-1]+C[k,j];
si aux<min entonces
min:=aux;
r[i,j]:=k
fsi
fpara;
C[i,j]:=m[i,j]+min
fpara
fpara
fin
∑ (r[i + 1, j ]− r [i , j − 1]+ 1)
d ≤ j ≤n
i = j−d
= r [n − d + 1, n ]− r [0, d − 1]+ n − d + 1< 2n
D1 D2 D3 ••• Dn
– Denotemos:
fi (x) = máximo ∏ φ j (mj )
1≤ j ≤i
sujeto a ∑ cj m j ≤ x
1≤ j ≤i
1≤ mj ≤ u j , 1≤ j ≤ i
f n (c) = max
1 ≤mn ≤u
{
n
φn ( mn ) f n − 1 (c − cn m n ) }
f i (x ) = max
1 ≤ m i ≤ ui
{φ i ( m i ) f i − 1 (x − ci m i ) }
f 0 (x) = 1, para todox , 0≤ x ≤ c
{ }
= min L1j + g( j ,V \ {1, j })
2≤ j ≤n
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 73
El problema del viajante de comercio
– Más en general, si i≠1, S≠Ø e i∉S:
{ }
g (i ,S) = min Lij + g( j ,S \ { j })
j ∈S
(*)
Además:
g (i ,∅) = Li 1, i = 2,3,…, n
– Método de resolución:
• Usar (*) y calcular g para todos los conjunto S con un solo vértice (distinto
del 1).
• Volver a usar (*) y calcular g para todos los conjuntos S de dos vértices
(distintos del 1) y así sucesivamente.
• Cuando se conoce el valor de g para todos los conjuntos S a los que sólo les
falta un vértice (distinto del 1) basta calcular g(1,V \ {1}).
Usar
j ∈S
{
g (i ,S) = min Lij + g( j ,S \ { j }) } para obtener:
{
g (3,{ 2, 4}) = min L32+ g(2,{4}), L24+ g(4,{2}) = }
= min{31,25} = 25;
{
g (4 ,{ 2, 3}) = min L42+ g(2,{3}), L43+ g(3,{2}) =}
= min{23,27} = 23.
– Finalmente:
g (1,{ 2, 3, 4}) = min{ L12+ g(2,{3,4}),
L13+ g(3,{2,4}),
L14 + g(4,{2,3}) } =
= min{ 35,40,43 } = 35.
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 76
El problema del viajante de comercio
• Si además se quiere saber cómo se construye el circuito óptimo:
Utilizar una función adicional
J(i,S) es el valor de j que minimiza g(i,S) al aplicar la fórmula (*).
• En el ejemplo:
J(2,{3,4}) = 4; J(3,{2,4}) = 4;
J(4,{2,3}) = 2; J(1,{2,3,4}) = 2.
n− 2
Tiempo de cálculo:
k= 1
k (
Θ 2(n − 1) + ∑ (n − 1)k n − 2 = Θ n22n )
r
puesto que ∑ k rk = r 2r − 1
k= 1
20 2, 43 × 10 18 419.430.400 20.971.520
más de 77.000 años
25 1, 55 × 10 25 20.971.520.000 838.860.800
30 2, 65 × 10 32 966.367.641.600 32.212.254.720
50 3, 04 × 10 64 2, 81 × 10 18 5, 62 × 10 16
(a)
(b)
{
F (S) = max fi (S)
1≤i ≤n
}
– El tiempo medio de terminación, MFT(S), se define como:
1
MFT(S) = ∑ fi (S)
n 1≤i ≤n
– Principio de optimalidad:
0 t+bi-ai
ai aj, j∈S\{i}
bi bj, j∈S\{i}
0 bi
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 88
Planificación de trabajos
– La ecuación recursiva resultante podría resolverse de forma análoga a la
del problema del viajante de comercio, pero existe una solución mejor…
– Supongamos que i y j son los dos primeros trabajos (y en ese orden) en la
planificación óptima del subconjunto S; entonces:
= bj + bi − aj + max{max{t − ai ,0}, aj − bi } =
= bj + bi − aj + max{t − ai , aj − bi ,0} =
= bj + bi − aj − ai + max{t, ai + aj − bi , ai }
Es decir:
ai + aj + max{− bi ,− aj } ≤ aj + ai + max{− bj ,−ai }
O sea:
min{bi ,a j } ≥ min{bj , ai } (*)
– Luego existe una planificación óptima en la que cada par (i,j) de trabajos
adyacentes verifica (*).
– Puede demostrarse que todas las planificaciones que verifican (*) tienen la
misma longitud.
Por tanto, basta generar una permutación para la que se cumpla (*) para
todo par de trabajos adyacentes.
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 90
Planificación de trabajos
– Ahora, si
n
– Por tanto, el tiempo para calcular P(n,n) es Ω( 2 )
n
y puede demostrarse que 2n 2n
≥2 (2n + 1)
n
1 2 21 32 13 16 15 16 1 4
11 32 1 2 11 16 7 8 1 3 P(i,j) = pP(i-1,j) + qP(i,j-1)
3 16 5 16 1 2 3 4 1 2
j
1 16 1 8 1 4 1 2 1 1
0 0 0 0 0
4 3 2 1 0
i
la matriz se completa, por ejemplo,
por filas (de abajo a arriba, j=0, 1, …, n)
y en cada fila por columnas (de dch. a izq., i=0, 1, …, n)
– En tiempo: Θ(n2)
v2 v3
v1 v4
S65
v5
v0
v6
v2 v3
3. Para algún k entre 2 y s-3, S13
tomar el vértice vi+k y formar v1
un triángulo con lados
(vi,vi+k), (vi+k,vi+s-1) y (vi,vi+s-1), S65
S63
y después resolver los
subproblemas Si,k+1 y Si+k,s-k. v0
v6
Algoritmia básica - Javier Campos (Universidad de Zaragoza) 103
Triangulación de polígonos
– Por tanto, si denotamos por Cis el coste de la triangulación Sis,
se obtiene la siguiente relación recursiva:
Cis = min
1≤k ≤s −2
{
Ci , k + 1 + Ci + k , s − k + D(vi ,vi + k ) +
+ D(vi + k ,vi + s − 1 ) }
para 0≤i≤n-1, 4≤s≤n;
donde:
D(vp,vq) es la longitud de la cuerda entre los vértices vp y vq si
vp y vq no son vértices adyacentes en el polígono;
y D(vp,vq) es 0 si vp y vq son adyacentes.
• Solución eficiente:
– Utilización de una tabla para almacenar los costes de las soluciones de los
subproblemas
v6
– El valor de C06 procede de k=2. Por tanto, el problema se divide en S03 y S24.
S03 es un triángulo con vértices v0, v1 y v2, luego no precisa ser resuelto, mientras
que S24 es un cuadrilátero, definido por v2, v3, v4 y v5, y debe ser resuelto.
Además, hay que incluir los costes de las cuerdas (v0,v2) y (v2,v5), que son 17’89 y
19’80.
– El valor de C24 se obtiene con k=1, dando los subproblemas S22 y S33, que tienen
tamaño menor o igual que tres y, por tanto, coste 0.
Se introduce la cuerda (v3,v5), con coste 15’65.
Simona Bernardi
Universidad de Zaragoza
Este documento está sujeto a una licencia de uso Creative Commons. No se permite
un uso comercial de la obra original ni de las posibles obras derivadas, la distribución
de las cuales se debe hacer con una licencia igual a la que regula la obra original.
Búsqueda con retroceso
Resumen
Método general
Aplicación
Problema de las reinas
Ciclos hamiltonianos
Atravesar un laberinto
El problema de la mochila 0-1
Problema de búsqueda
Búsqueda de la mejor solución o todas las soluciones
que satisfacen a ciertas condiciones
Problema de búsqueda
Búsqueda de la mejor solución o todas las soluciones
que satisfacen a ciertas condiciones
Problema de búsqueda
Búsqueda de la mejor solución o todas las soluciones
que satisfacen a ciertas condiciones
Tipos de problemas
Se conoce un criterio óptimo de selección en cada decisión
⇒ Técnica voraz
Se cumple el principio de optimalidad de Bellman
⇒ Técnica de la programación dinámica
Otros en lo que no hay más remedio que buscar
Métodos de búsqueda
Fuerza bruta: examinar todas las t tuplas y seleccionar las que
safisfacen P
Retroceso (backtracking, en inglés): formar cada tupla de manera
progresiva, elemento a elemento, comprobando para cada elemento xi
añadido a la tupla que (x1 , . . . , xi ) puede conducir a una tupla
completa satisfactoria
64
Fuerza bruta: 8 = 4.426.165.368
64
Fuerza bruta: 8 = 4.426.165.368
64
Fuerza bruta: 8 = 4.426.165.368
Restricciones
Explı́citas: Ci = {1, 2, 3, 4, 5, 6, 7, 8}, 1 ≤ i ≤ 8
El espacio de soluciones consta de 88 (16.777.216) 8-tuplas
Restricciones
Explı́citas: Ci = {1, 2, 3, 4, 5, 6, 7, 8}, 1 ≤ i ≤ 8
El espacio de soluciones consta de 88 (16.777.216) 8-tuplas
Implı́citas: No puede haber dos reinas en la misma columna o en la
misma diagonal
Se deduce que todas las soluciones son permutaciones de la 8-tupla
(1, 2, 3, 4, 5, 6, 7, 8)
El espacio de soluciones se reduce de 88 a 8! (40.320) 8-tuplas
Restricciones
Explı́citas: Ci = {1, 2, 3, 4, 5, 6, 7, 8}, 1 ≤ i ≤ 8
El espacio de soluciones consta de 88 (16.777.216) 8-tuplas
Implı́citas: No puede haber dos reinas en la misma columna o en la
misma diagonal
Se deduce que todas las soluciones son permutaciones de la 8-tupla
(1, 2, 3, 4, 5, 6, 7, 8)
El espacio de soluciones se reduce de 88 a 8! (40.320) 8-tuplas
Árbol de
permutaciones
El espacio de
soluciones está
definido por todos los
caminos desde la raı́z
a cada hoja (hay 4!
hojas)
Esquema algorı́tmico
Sean
(x1 , . . . , xi ) un camino de la raı́z hasta un nodo del árbol del espacio de
estados
G (x1 , . . . , xi ) el conjunto de los valores posibles de xi+1 tales que
(x1 , . . . , xi+1 ) es un camino hasta un nodo del árbol
Esquema algorı́tmico
Sean
(x1 , . . . , xi ) un camino de la raı́z hasta un nodo del árbol del espacio de
estados
G (x1 , . . . , xi ) el conjunto de los valores posibles de xi+1 tales que
(x1 , . . . , xi+1 ) es un camino hasta un nodo del árbol
Suponemos que existe algún predicado acotador A tal que
A(x1 , . . . , xi+1 ) = falso ⇒ el camino (x1 , . . . , xi+1 ) no puede extenderse
para alcanzar una solución
Por tanto, los candidatos xi+1 son los valores de G (x1 , . . . , xi ) tales
que A(x1 , . . . , xi+1 ) = verdadero
Esquema algorı́tmico
Sean
(x1 , . . . , xi ) un camino de la raı́z hasta un nodo del árbol del espacio de
estados
G (x1 , . . . , xi ) el conjunto de los valores posibles de xi+1 tales que
(x1 , . . . , xi+1 ) es un camino hasta un nodo del árbol
Suponemos que existe algún predicado acotador A tal que
A(x1 , . . . , xi+1 ) = falso ⇒ el camino (x1 , . . . , xi+1 ) no puede extenderse
para alcanzar una solución
Por tanto, los candidatos xi+1 son los valores de G (x1 , . . . , xi ) tales
que A(x1 , . . . , xi+1 ) = verdadero
Supongamos finalmente, que existe un predicado R que determina si
un camino (x1 , . . . , xi+1 ) es una solución.
Esquema algorı́tmico
Observaciones
m = 1 + m1 + m1 m2 + m1 m2 m3 + . . .
Algoritmo de estimación
funcion estimación devuelve entero
variables k,m,r,card: entero; nodo: elmto; sol: vector[1..n] de elmto
principio
k:=1; m:=1; r:=1;
repetir
card:=0;
para todo nodo en G(sol,1,k-1) hacer
sol[k]:= nodo;
si A(sol,1,k) entonces card:=card+1 fsi
fpara
si card <> 0 entonces
r=r*card;
m:=m+r;
sol[k] := elegirAleatorio(G(sol,1,k-1));
k:=k+1;
fsi
hastaQue R(sol,1,k) or (card=0);
devuelve m
fin
¿Coste de la función?
Algoritmo de búsqueda
Versión recursiva
Ciclos hamiltonianos
Definición
Sea G = (V , A) un grafo conexo con n vértices
Un ciclo hamiltoniano es un camino que visita una vez cada vértice
y vuelve al vértice inicial
Es decir, (v1 v2 . . . vn+1 ) tal que:
vi ∈ V , i = 1, . . . n + 1
(vi , vi+1 ) ∈ A, i = 1, . . . n
v1 = vn+1
vi 6= vj , ∀i, j = 1, . . . , n : i 6= j
Ejemplos
Grafo a la izda
Hamiltoniano: 1-2-8-7-6-5-4-3-1
Grafo a la dcha
No contiene ningún hamiltoniano
Observaciones
Estructura de datos
El grafo
tipo grafo = vector[1..n,1..n] de bool
La solución
tipo sol = vector[1..n] de 1..n
Algoritmo (restricciones)
algoritmo siguienteValor(entsal x:sol; ent k:entero; ent g: grafo)
variables encontrado:bool; j:entero
principio
repetir
x[k]:=(x[k]+1) mod (n+1); {vértice prometedor}
si x[k]<>0 entonces {no se ha asignado ningún vértice todavı́a}
encontrado:=falso;
si g[x[k-1],x[k]] entonces {el vértice está conectado con el previo}
j:=1; encontrado:=verdadero; {tiene que ser distinto de los previos}
mientrasQue (j<=k-1) and encontrado hacer
si x[j]=x[k] entonces encontrado:=falso sino j:=j+1 fsi
fmientrasQue;
si encontrado entonces
{caso último vértice: tiene que estar conectado con el primero}
si (k=n) and not g[x[n],1] entonces encontrado:=falso fsi
fsi
fsi
fsi
hastaQue (x[k]=0) or encontrado
fin
Simona Bernardi Búsqueda con retroceso 28 / 44
Búsqueda con retroceso
Aplicación (ciclos hamiltonianos)
Algoritmo de búsqueda
algoritmo hamiltoniano(ent k:entero; entsal x:sol; ent g: grafo)
{En x se tiene la parte de la solución ya calculada, es decir hasta x[k-1]}
principio
repetir
siguienteValor(x,k,g);
si x[k]<>0 entonces
si k=n entonces escribir(x)
sino hamiltoniano(k+1,x,g) fsi
fsi
hastaQue x[k]=0
fin
Llamada inicial
{g contiene la matriz de adyacencia del grafo y el vector solución está
inicializado a x=[1,0,...,0]}
hamiltoniano(2,x,g);
Atravesar un laberinto
(a) Camino encontrado (b) Caso retroceso (c) Búsqueda otro camino
Simona Bernardi Búsqueda con retroceso 31 / 44
Búsqueda con retroceso
Aplicación (atravesar un laberinto)
{Estructura de datos}
tipos
casilla = (libre,pared,camino,imposible)
laberinto = vector[1..N,1..M] de casilla
{Funciones auxiliares}
funcion fueraLaberinto(fila,columna: entero) devuelve bool
principio
devuelve (fila < 2) or (fila > N-1) or (columna < 2) or (columna > M-1)
fin
funcion esLibre(lab: laberinto; fila,columna: entero) devuelve bool
principio
devuelve lab[fila][columna] = libre
fin
funcion esSalida(fila,columna: entero) devuelve bool
principio
devuelve (fila = N-1) and (columna = M-1)
fin
Espacio de soluciones
2n modos de asignar los valores 0 ó 1 a las xi
Dos formas de representar la solución
Espacio de soluciones
Tuplas de tamaño fijo
Algoritmo solución
Ejemplo
benef=(11,21,31,33,43,53,55,65)
peso =(1,11,21,23,33,43,45,55)
cap=110
N=8
Observaciones
Simona Bernardi
Universidad de Zaragoza
Este documento está sujeto a una licencia de uso Creative Commons. No se permite
un uso comercial de la obra original ni de las posibles obras derivadas, la distribución
de las cuales se debe hacer con una licencia igual a la que regula la obra original.
Ramificación y poda
Resumen
Método general
Aplicación
El juego del 15
Problemas de optimización
Un problema de planificación de tareas a plazo fijo
El problema de la mochila 0-1
El problema del viajante de comercio
Ramificación
Al igual que los métodos de búsqueda con retroceso:
Se aplica a problemas de optimización con restricciones
Se genera el espacio de soluciones, organizandólo en un árbol (en
general en un grafo)
No se genera el espacio de soluciones completo, sino que se podan
bastantes estados
Ramificación
Al igual que los métodos de búsqueda con retroceso:
Se aplica a problemas de optimización con restricciones
Se genera el espacio de soluciones, organizandólo en un árbol (en
general en un grafo)
No se genera el espacio de soluciones completo, sino que se podan
bastantes estados
Terminologı́a
Nodo vivo: nodo del espacio de soluciones del que no se han
generado aún todos sus hijos
Nodo muerto: nodo del que no se van a generar más hijos porque
no hay más
no es completable, es decir viola las restricciones
no producirá una solución mejor que la solución actual
Nodo en expansión: nodo del que se están generando hijos
Simona Bernardi Ramificación y poda 3 / 73
Ramificación y poda
Método general
Búsqueda con retroceso: tan pronto como se genera un nuevo hijo del
nodo en expansión, este hijo pasa a ser el nodo en curso
Ramificación y poda: se generan todos los hijos del nodo en expansión
antes de que cualquier otro nodo vivo pase a ser el nuevo nodo en
expansión
Búsqueda con retroceso: tan pronto como se genera un nuevo hijo del
nodo en expansión, este hijo pasa a ser el nodo en curso
Ramificación y poda: se generan todos los hijos del nodo en expansión
antes de que cualquier otro nodo vivo pase a ser el nuevo nodo en
expansión
Consecuencia
Búsqueda con retroceso: los únicos nodos vivos son los que están en
el camino de la raı́z al nodo en expansión
Ramificación y poda: puede haber más nodos vivos. Se necesita una
estructura de datos auxiliar para almacenar la lista de nodos vivos
FIFO: la lista de nodos vivos es una cola ⇒ recorrido por niveles (en
anchura)
LIFO: la lista de nodos vivos es una pila ⇒ ≈ recorrido en
profundidad (depth first)
FIFO: la lista de nodos vivos es una cola ⇒ recorrido por niveles (en
anchura)
LIFO: la lista de nodos vivos es una pila ⇒ ≈ recorrido en
profundidad (depth first)
Definir una buena función de prioridad de los nodos vivos, para que las
soluciones buenas se encuentren rápidamente
Esquema algorı́tmico
repetir
elegir el nodo más prometedor como nodo_E;
generar todos sus hijos;
matar el nodo_E;
para cada hijo hacer
si coste(hijo) > coste(mejor_solución_en_curso) entonces se mata
sino
si no es solución entonces se pasa a la lista_de_nodos_vivos
sino {es solución: el coste no es estimado sino real}
es la mejor_solución_en_curso y se revisa la lista_de_nodos_vivos,
eliminando los que prometen algo peor
fsi
fsi
fpara
hasta que la lista está vacı́a
El juego del 15
El problema original
El juego del 15
El problema original
Configuraciones alcanzables
Numeremos las casillas de 1 a 16
Configuraciones alcanzables
Numeremos las casillas de 1 a 16
Dada una configuración:
Sea pos(i) la posición (entre 1 y 15) de la ficha con número i, y sea
pos(16) la posición de la casilla vacı́a
Para cada ficha i, sea m(i) el número de fichas j < i tales que
pos(j) > pos(i)
Configuraciones alcanzables
Numeremos las casillas de 1 a 16
Dada una configuración:
Sea pos(i) la posición (entre 1 y 15) de la ficha con número i, y sea
pos(16) la posición de la casilla vacı́a
Para cada ficha i, sea m(i) el número de fichas j < i tales que
pos(j) > pos(i)
Configuraciones alcanzables
Teorema
La configuración objetivo es alcanzable desde una cierta configuración
inicial si para esta configuración:
16
X
m(i) + x es par .
i=1
Configuraciones alcanzables
Teorema
La configuración objetivo es alcanzable desde una cierta configuración
inicial si para esta configuración:
16
X
m(i) + x es par .
i=1
Búsqueda en anchura
Hijos de cada nodo = movimientos de la casilla vacı́a
(arriba,dcha,abajo,izda)
Búsqueda en profundidad
Estrategias de búsqueda
Estrategias a ciegas:
FIFO: recorrido en anchura o por niveles
Relativamente útil si el nodo solución está cerca de la raı́z
LIFO: ≈ recorrido en profundidad (también llamado D-search en el
libro de Horowitz et al.)
Puede no encontrar la solución (problemas con los ciclos)
Estrategias de búsqueda
Estrategias a ciegas:
FIFO: recorrido en anchura o por niveles
Relativamente útil si el nodo solución está cerca de la raı́z
LIFO: ≈ recorrido en profundidad (también llamado D-search en el
libro de Horowitz et al.)
Puede no encontrar la solución (problemas con los ciclos)
Estrategias no ciegas (informadas, en inteligencia artificial)
Buscan la solución adaptando el camino de búsqueda en el árbol de
soluciones a la instancia del problema a solucionar
Se necesita definir una función de coste para los nodos del árbol
Función de estimación
Problema: el cálculo de la función c
Un ejemplo de problemas en los que es posible: aquéllos en los que hay
soluciones voraces
Función de estimación
Problema: el cálculo de la función c
Un ejemplo de problemas en los que es posible: aquéllos en los que hay
soluciones voraces
Función de estimación
Problema: el cálculo de la función c
Un ejemplo de problemas en los que es posible: aquéllos en los que hay
soluciones voraces
ĝ (x) = número de casillas no vacı́as que no están en su sitio objetivo (ĉ(x) ≤ c(x), ∀x)
ĝ (x) = número de casillas no vacı́as que no están en su sitio objetivo (ĉ(x) ≤ c(x), ∀x)
Nodo inicial
ĝ (x) = número de casillas no vacı́as que no están en su sitio objetivo (ĉ(x) ≤ c(x), ∀x)
Nodo inicial
Se generan sus
hijos y se añaden
a la cola
Se elige el
mı́nimo (4), se
elimina de la cola
y se generan sus
hijos
Se elige el
mı́nimo (4), se
elimina de la cola
y se generan sus
hijos
Se elige el
mı́nimo (10), se
elimina de la cola
y se generan sus
hijos
Algoritmo de búsqueda
algoritmo mı́nimoCoste(ent x0: nodo)
variables c:cola; {cola con prioridades <x,coste(x)>}
éxito: bool; xcurso,x:nodo
principio
si esSolución(x0) entonces escribir(x0)
sino
crearColaVacı́a(c); {cola de nodos vivos}
a~
nadir(c,<x0,coste(x0)>); éxito:=falso;
mientrasQue not éxito and not esVacı́a(c) hacer
xcurso:=min(c); {nodo en expansión}
eliminar(c,xcurso);
mientrasQue not éxito and hay_otro_hijo_x_de_xcurso hacer
si esSolución(x) entonces escribir(x); éxito:=verdadero
sino a~nadir(c,<x,coste(x)>) fsi
fmientrasQue
fmientrasQue
si not éxito entonces escribir("No hay solución") fsi
fsi
fin
Observaciones
Observaciones
Observaciones
Observaciones
Problemas de optimización
La función o coste a minimizar ya no es la distancia de la raı́z a la
solución, sino una función objetivo dada
¿Qué ocurre si interesa buscar una solución óptima (es decir de coste
mı́nimo)?
¿Encuentra el algoritmo minimoCoste esa solución?
Problemas de optimización
La función o coste a minimizar ya no es la distancia de la raı́z a la
solución, sino una función objetivo dada
¿Qué ocurre si interesa buscar una solución óptima (es decir de coste
mı́nimo)?
¿Encuentra el algoritmo minimoCoste esa solución? No
Problemas de optimización
La función o coste a minimizar ya no es la distancia de la raı́z a la
solución, sino una función objetivo dada
¿Qué ocurre si interesa buscar una solución óptima (es decir de coste
mı́nimo)?
¿Encuentra el algoritmo minimoCoste esa solución? No
Problemas de optimización
Teorema
Si para cada nodo x del árbol del espacio de estados ĉ(x) es una
estimación de c(x) tal que para todo par de nodos y , z:
Problemas de optimización
Teorema
Si para cada nodo x del árbol del espacio de estados ĉ(x) es una
estimación de c(x) tal que para todo par de nodos y , z:
Teorema
Si para cada nodo x del árbol del espacio de estados ĉ(x) es una función
de estimación tal que:
ĉ(x) ≤ c(x)
y para cada nodo solución x se verifica: ĉ(x) = c(x), entonces si el
algoritmo mı́nimoCoste2 encuentra una solución, ésta es óptima.
Demostración teorema
Poda
Dado el problema de minimización de una función objetivo c(x)
Se utiliza una función de estimación ĉ(x) tal que ĉ(x) ≤ c(x)
Suponer que se conoce una cota superior del valor mı́nimo de c:
Poda
Dado el problema de minimización de una función objetivo c(x)
Se utiliza una función de estimación ĉ(x) tal que ĉ(x) ≤ c(x)
Suponer que se conoce una cota superior del valor mı́nimo de c:
Regla de poda
Poda
Valor inicial de U:
Utilizar alguna heurı́stica (basada en información extra sobre el
problema)
∞
Poda
Valor inicial de U:
Utilizar alguna heurı́stica (basada en información extra sobre el
problema)
∞
Si al alcanzar solución factible x: c(x) < U, se actualiza el valor de U
Poda
Valor inicial de U:
Utilizar alguna heurı́stica (basada en información extra sobre el
problema)
∞
Si al alcanzar solución factible x: c(x) < U, se actualiza el valor de U
Todos los nodos vivos de coste estimado mayor que U también se
pueden podar
Poda
Valor inicial de U:
Utilizar alguna heurı́stica (basada en información extra sobre el
problema)
∞
Si al alcanzar solución factible x: c(x) < U, se actualiza el valor de U
Todos los nodos vivos de coste estimado mayor que U también se
pueden podar
Si el valor inicial de U es mayor o igual que el coste de una solución
de mı́nimo coste, la regla de poda no elimina ningún nodo ascendente
de una solución de coste mı́nimo
Observaciones
Ejemplo
n=4
(t1 , d1 , w1 ) = (1, 1, 5)
(t2 , d2 , w2 ) = (2, 3, 10)
(t3 , d3 , w3 ) = (1, 2, 6)
(t4 , d4 , w4 ) = (1, 1, 3)
n
X
min − bi xi
i=1
n
X
s.t. pi xi ≤ C
i=1
xi ∈ {0, 1}, bi , pi > 0, 1 ≤ i ≤ n
P
n
− i=1 bi xi , si x nodo solución factible
c(x) = ∞ si x nodo solución no factible
min c(xizdo ), c(xdcho )
si x nodo no hoja
Simona Bernardi Ramificación y poda 47 / 73
Ramificación y poda
Aplicación (problema de la mochila 0-1)
ĉ(x) ≤ c(x) ≤ U
Definición sencilla de U
Si x es un nodo de nivel j, con 1 ≤ j ≤ n, se han asignado ya valores
a xi , 1 ≤ i ≤ j, por tanto:
j
X
c(x) ≤ − bi xi = U
i=1
Ejemplo ../..
n=4
(b1 , b2 , b3 , b4 ) = (10, 10, 12, 18)
(p1 , p2 , p3 , p4 ) = (2, 4, 6, 9)
C = 15
Nodo en expansión: 1 (raı́z, nivel 0, ninguna xi asignada)
ĉ(1)=−cota(15, 0, 1)
=−cota(13, 10, 2)
=−cota(9, 20, 3)
== −cota(3, 32, 4)
=−(32 + 3/9 ∗ 18) = −38
U =−32
Simona Bernardi Ramificación y poda 52 / 73
Ramificación y poda
Aplicación (problema de la mochila 0-1)
Ejemplo ../..
n=4
(b1 , b2 , b3 , b4 ) = (10, 10, 12, 18)
(p1 , p2 , p3 , p4 ) = (2, 4, 6, 9)
C = 15
Ejemplo
Si se elige 6 : el hijo izquierdo n=4
se elimina por no ser factible, el
(b1 , b2 , b3 , b4 ) = (10, 10, 12, 18)
derecho se añade a la cola de
nodos vivos, con coste -32, (p1 , p2 , p3 , p4 ) = (2, 4, 6, 9)
mayor que el nodo 7 C = 15
Observaciones
Para poder imprimir la solución (además del valor óptimo) hay que:
Guardar con cada nodo una identificación de su padre (identificador,
puntero, curso,. . . )
Mantener una variable auxiliar con el valor del último nodo solución
que ha permitido actualizar U
Asociar con cada nodo un booleano que diga si es un hijo izquierdo o
derecho (es decir, si se mete en la mochila el objeto correspondiente o
no)
Observaciones
Para poder imprimir la solución (además del valor óptimo) hay que:
Guardar con cada nodo una identificación de su padre (identificador,
puntero, curso,. . . )
Mantener una variable auxiliar con el valor del último nodo solución
que ha permitido actualizar U
Asociar con cada nodo un booleano que diga si es un hijo izquierdo o
derecho (es decir, si se mete en la mochila el objeto correspondiente o
no)
Cabe pensar en una versión con estrategia ciega de ramificación (FIFO,
por ejemplo):
Por un lado la intuición nos dice que la estrategia de mı́nimo coste se
acerca más de prisa a la solución óptima
Por otra parte, la inserción y borrado en la cola con prioridades de
nodos vivos tiene coste logarı́timico, mientras que con una cola FIFO,
el coste es constante . . .
Simona Bernardi Ramificación y poda 55 / 73
Ramificación y poda
Aplicación (problema del viajante de comercio)
Soluciones propuestas
El problema del viajante de comercio es probablemente el problema
NP-completo más estudiado en términos de soluciones propuestasa
a
U. Manber: Introduction to Algorithms. A Creative Approach. Addison Wesley, 1989.
Soluciones propuestas
El problema del viajante de comercio es probablemente el problema
NP-completo más estudiado en términos de soluciones propuestasa
a
U. Manber: Introduction to Algorithms. A Creative Approach. Addison Wesley, 1989.
La función c debe ser tal que el nodo solución x con valor mı́nimo de
c(x) corresponda a un recorrido de longitud mı́nima
Por ejemplo:
Si x es una hoja, entonces c(x) es la longitud del hamiltoniano definido
por el camino desde la raı́z hasta x
Si x no es una hoja, entonces c(x) es el coste de una hoja de coste
mı́nimo del subárbol con raı́z x
Ejemplo
∞ 20 30 10 11 ∞ 10 17 0 1
15 ∞ 16 4 2 12 ∞ 11 2 0
3 5 ∞ 2 4 Grafo original 0 3 ∞ 0 2 Reducción: L = 25
19 6 18 ∞ 3 15 3 12 ∞ 0
16 4 7 16 ∞ 11 0 0 12 ∞
Ejemplo
Otras soluciones
∞ 20 30 10 11
15 ∞ 16 4 2
3 5 ∞ 2 4
19 6 18 ∞ 3
16 4 7 16 ∞
Grafo original
Observaciones
Simona Bernardi
Universidad de Zaragoza
Curso 2018/19
Grado en Ingenierı́a Informática
Aula A.12
Presentación adaptada de la original de J. Julvez
Este documento está sujeto a una licencia de uso Creative Commons. No se permite
un uso comercial de la obra original ni de las posibles obras derivadas, la distribución
de las cuales se debe hacer con una licencia igual a la que regula la obra original.
Programación lineal
Resumen
Introducción
Método general
Formulación del problema general
Interpretación geométrica
Algoritmo sı́mplex
Dualidad
Reducciones
Aplicación
El problema de la fábrica de cerveza
El problema de flujo máximo/mı́nimo corte
El problema de emparejamiento bipartido
Introducción
Técnica para la resolución de problemas de asignación óptima de un
número limitado de recursos entre un conjunto de tareas que
compiten entre sı́.
Aplicaciones
Sean
A número de barriles del tipo Ale
B número de barriles del tipo Lambic
cebada
(0;32) 14A+8B=476
(12;28)
Lambic
trigo
(26;14) 4A+12B=384
(0;0)
Ale (34;0)
mayor beneficio?
(0;32)
(12;28)
12A+20B=1200euro
Lambic
(26;14)
12A+20B=704euro
(0;0)
Ale (34;0)
12A+20B=408euro
Formas estándar
Se añaden las restricciones de signo
Algunos autores llaman estándar a la canónica otros a la slack
Se añade
Una variable Z y la ecuación correspondiente a la función objetivo
Una variable slack para transformar una desigualdad en igualdad
Restricciones de signo
Problema en R6
Simona Bernardi Programación lineal 11 / 67
Programación lineal
Interpretación geométrica
Resolución en el espacio Rn
Dado un problema LP:
Un punto x ∈ Rn es factible si satisface a todas restricciones lineales
El conjunto de los puntos factibles se llama región factible
Las restricciones de igualdad definen hiperplanos en Rn
Las restricciones de desigualdad definen semiespacios Rn
La región factible es la intersección de los hiperplanos y semiespacios
⇒ poliedro convexo
No convexo Convexo
Ejemplo en R2
Simona Bernardi Programación lineal 12 / 67
Programación lineal
Interpretación geométrica
Idea básica
Inicialización
max Z
12A +20B −Z = 0
Base={Sc,Sd,Se}
A=B=0 (0;0)
Z=0
t.q. 4A +12B+Sc = 384 Sc=384
0,1A+0,1B +Sd = 4 Sd=4
Lambic Se=476
14A +8B +Se = 476
A, B, Sc , Sd , Se , Z ≥ 0
(0;0)
Ale
1
Sustituir B = 12 (384 − 4A − Sc ) Base={B,Sd,Se}
(0;32) A=Sc=0 (0;32)
Z=640
Añadir B a la base B=32
Sd=8/10
Volver a escribir la ecuación (2) Lambic Se=220
Base={A,B,Se}
Sustituir A = 15( 54 + 1
120 Sc − Sd ) (0;32) (12;28)
Sc=Sd=0 (12;28)
Z=704
A=12
Añadir A a la base B=28
Lambic Se=84
Volver a escribir la ecuación (3)
Eliminar A en las ecuaciones (1,2,4)
(0;0)
Ale
Optimalidad
max Z
−Sc −80Sd −Z = −704 (1)
Base={A,B,Se}
1 (0;32) (12;28)
Sc=Sd=0 (12;28)
t.q. +B+ Sc −5Sd = 28 (2) Z=704
8 A=12
1 B=28
A − Sc +15Sd = 12 (3) Lambic Se=84
8
1
+ Sc −170Sd +Se = 84 (4)
3
A, B, Sc , Sd , Se , Z ≥ 0 (0;0)
Ale
¿Cuándo se termina?
Optimalidad
max Z
−Sc −80Sd −Z = −704 (1)
Base={A,B,Se}
1 (0;32) (12;28)
Sc=Sd=0 (12;28)
t.q. +B+ Sc −5Sd = 28 (2) Z=704
8 A=12
1 B=28
A − Sc +15Sd = 12 (3) Lambic Se=84
8
1
+ Sc −170Sd +Se = 84 (4)
3
A, B, Sc , Sd , Se , Z ≥ 0 (0;0)
Ale
¿Cuándo se termina?
Cuando no hay coeficientes positivos en la función objetivo
Optimalidad
max Z
−Sc −80Sd −Z = −704 (1)
Base={A,B,Se}
1 (0;32) (12;28)
Sc=Sd=0 (12;28)
t.q. +B+ Sc −5Sd = 28 (2) Z=704
8 A=12
1 B=28
A − Sc +15Sd = 12 (3) Lambic Se=84
8
1
+ Sc −170Sd +Se = 84 (4)
3
A, B, Sc , Sd , Se , Z ≥ 0 (0;0)
Ale
¿Cuándo se termina?
Cuando no hay coeficientes positivos en la función objetivo
¿Porqué la última SFB es óptima?
Optimalidad
max Z
−Sc −80Sd −Z = −704 (1)
Base={A,B,Se}
1 (0;32) (12;28)
Sc=Sd=0 (12;28)
t.q. +B+ Sc −5Sd = 28 (2) Z=704
8 A=12
1 B=28
A − Sc +15Sd = 12 (3) Lambic Se=84
8
1
+ Sc −170Sd +Se = 84 (4)
3
A, B, Sc , Sd , Se , Z ≥ 0 (0;0)
Ale
¿Cuándo se termina?
Cuando no hay coeficientes positivos en la función objetivo
¿Porqué la última SFB es óptima?
Cualquier SFB satisface el sistema de ecuaciones en curso
En particular la (1): Z = 704 − Sc − 80Sd
El valor óptimo z ∗ ≤ 704 porque Sc , Sd ≥ 0
La SFB en curso tiene valor 704 ⇒ es óptima
Simona Bernardi Programación lineal 20 / 67
Programación lineal
Algoritmo sı́mplex
Excepciones
El problema LP no es factible
No es posible satisfacer todas las restricciones (región factible = ∅)
El problema LP no es acotado
max x max x+y
t.q. x <=1; t.q. x >=1;
x >=2 y >=2
x=1 x=2 x=1
y
x+y=k
y=2
x x
Ejemplos en R2
Simona Bernardi Programación lineal 21 / 67
Programación lineal
Algoritmo sı́mplex
N = {i | xi fuera de la base}
(|N| = n)
B = {i | xi en base} (|B| = m)
v término constante en la
función objetivo
Simona Bernardi Programación lineal 22 / 67
Programación lineal
Algoritmo sı́mplex
Cuestiones
⇒ inicializaciónSı́mplex
3 ¿Cómo sabemos si un problema no está acotado?
⇒ hayPositivos
4 ¿Cómo elegimos las variables que entran en la base y las que salen?
⇒ eligePositivo y filaPivote
n
P 0 : max − x0
X
P : max c i xi
i=1
n n
X
X
t.q. aij xj ≤ bi ,i = 1, . . . , m t.q. aij xj − x0 ≤ bi ,i = 1, . . . , m
j=1 j=1
xi ≥ 0 i = 1, . . . , n xi ≥ 0 i = 0, . . . , n
Lemma
P es factible si y solo si el valor óptimo de P 0 es 0 (cero).
Enfoque inicializaciónSimplex
Si b ≥ 0
La solución que corresponde al vertex origen es factible
Devuelve la forma slack del problema P (cuadro inicial)
Sino crea un problema auxiliar P 0
Soluciona P 0 con el algoritmo sı́mplex (lı́neas 7–17)
Dependiendo del valor de la solución de P 0 decide si el problema
inicial P es factible . . .
Si x0 = 0 entonces P es factible y devuelve la forma slack final de P 0
borrando x0 y recuperando la función objetivo original de P
Sino el problema P no es factible
Caso no acotado
Cuestión 3
La función hayPositivos(A,B,colP) determina si hay elementos
A[i][colP], i ∈ B positivos: si no hay entonces el problema no está
acotado
Ninguna restricción del problema limita la cantidad a incrementar
para la variable que entra en la base (colP ∈ N)
Ejemplo
x1 x2 x3 x4 b
P 0 : max x1 + x2 c1: -1 0 1 0 1
t.q. x1 ≥ −1 c2: 0 -1 0 1 2
x2 ≥ −2 z: 1 1 0 0 0
x1 , x2 ≥ 0
B = {3, 4}, N = {1, 2}
Función eligePositivo(c,N)
Función eligePositivo(c,N)
Función eligePositivo(c,N)
Función eligePositivo(c,N)
Función filaPivote(A,b,B,q)
Función filaPivote(A,b,B,q)
b[p] b[i]
= min : i ∈ B, A[i][q] > 0
A[p][q] A[i][q]
Función filaPivote(A,b,B,q)
b[p] b[i]
= min : i ∈ B, A[i][q] > 0
A[p][q] A[i][q]
Función filaPivote(A,b,B,q)
b[p] b[i]
= min : i ∈ B, A[i][q] > 0
A[p][q] A[i][q]
Caso de degeneración
El vértice B es degenerado
Es la intersección de más de n = 3 caras del
poliedro: 2 3 4 5
Si se elige uno de los siguientes conjuntos de
desigualdades
2 3 4 – 2 3 5 – 2 4 5 – 3 4 5
y se soluciona el sistema de 3 ecuaciones en 3
variables de obtiene la misma solución en todo
los casos
Fuente: S. Dasgupta et al. Algorithms
Caso de degeneración
El vértice B es degenerado
Es la intersección de más de n = 3 caras del
poliedro: 2 3 4 5
Si se elige uno de los siguientes conjuntos de
desigualdades
2 3 4 – 2 3 5 – 2 4 5 – 3 4 5
y se soluciona el sistema de 3 ecuaciones en 3
variables de obtiene la misma solución en todo
los casos
Fuente: S. Dasgupta et al. Algorithms
Problema! El sı́mplex puede pasar en ciclo por la diferentes bases
que corresponden al mismo vértex
Es importante el criterio de elección del pivote
P.ej. la regla de Bland asegura la selección de un número finito de
pivotes
Simona Bernardi Programación lineal 31 / 67
Programación lineal
Algoritmo sı́mplex
Observaciones
Problemas de implementación
No factibilidad
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Mantener la dispersión
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Mantener la dispersión ⇒ estructuras de datos ad hoc
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Mantener la dispersión ⇒ estructuras de datos ad hoc
Caso de degeneración
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Mantener la dispersión ⇒ estructuras de datos ad hoc
Caso de degeneración
Estabilidad numérica
Observaciones
Problemas de implementación
No factibilidad ⇒ fase 1 del sı́mplex
Caso no acotados ⇒ regla bien definida
Mantener la dispersión ⇒ estructuras de datos ad hoc
Caso de degeneración
Estabilidad numérica
Fuente: https://www.eia.gov/beta/international/analysis.php?iso=SAU
Definición de flujo
La red es un grafo dirigido G = (V , E ) con dos nodos especiales
s, t ∈ V (fuente y destino)
Un flujo-(s, t) es una función f : E → R que satisface a la siguiente
restricción de conservación en cada nodo v ∈ V (excepto
posiblemente s y t):
X X
f (u → v ) = f (v → w )
u w
Definición de flujo
La red es un grafo dirigido G = (V , E ) con dos nodos especiales
s, t ∈ V (fuente y destino)
Un flujo-(s, t) es una función f : E → R que satisface a la siguiente
restricción de conservación en cada nodo v ∈ V (excepto
posiblemente s y t):
X X
f (u → v ) = f (v → w )
u w
Problema LP
max |f |
X X
t.q. f (u → v ) = f (v → w ), ∀v ∈ V \ {s, t}
u w
0 ≤ f (e) ≤ c(e), ∀e ∈ E
Definición de corte
Un corte-(s, t) es una partición de los nodos del grafo G en dos
subconjuntos S, T (S ∪ T = V , S ∩ T = ∅) tales que s ∈ S y t ∈ T
Sea c la función de capacidad de los arcos, la capacidad del corte, se
define como: XX
||S, T || = c(v → w )
v ∈S w ∈T
Definición de corte
Un corte-(s, t) es una partición de los nodos del grafo G en dos
subconjuntos S, T (S ∪ T = V , S ∩ T = ∅) tales que s ∈ S y t ∈ T
Sea c la función de capacidad de los arcos, la capacidad del corte, se
define como: XX
||S, T || = c(v → w )
v ∈S w ∈T
Capacidad residual
Grafo residual
F = minu→v ∈P cf (u → v )
Eficiencia
En cada iteración se puede utilizar una búsqueda en profundidad o
amplitud para encontrar un camino de s a t
Complejidad en tiempo: O(|E |)
Eficiencia
En cada iteración se puede utilizar una búsqueda en profundidad o
amplitud para encontrar un camino de s a t
Complejidad en tiempo: O(|E |)
¿Cuántas iteraciones hay?
Asumimos todos los arcos con capacidad entera N
El algoritmo de Ford-Fulkerson termina después como mucho |f ∗ |
iteraciones, donde |f ∗ | es el flujo máximo
Complejidad en tiempo (caso peor): O(|E ||f ∗ |)
Eficiencia
En cada iteración se puede utilizar una búsqueda en profundidad o
amplitud para encontrar un camino de s a t
Complejidad en tiempo: O(|E |)
¿Cuántas iteraciones hay?
Asumimos todos los arcos con capacidad entera N
El algoritmo de Ford-Fulkerson termina después como mucho |f ∗ |
iteraciones, donde |f ∗ | es el flujo máximo
Complejidad en tiempo (caso peor): O(|E ||f ∗ |)
Fuente: jeffe.cs.illinois.edu/teaching/
algorithms/book/
Eficiencia
En cada iteración se puede utilizar una búsqueda en profundidad o
amplitud para encontrar un camino de s a t
Complejidad en tiempo: O(|E |)
¿Cuántas iteraciones hay?
Asumimos todos los arcos con capacidad entera N
El algoritmo de Ford-Fulkerson termina después como mucho |f ∗ |
iteraciones, donde |f ∗ | es el flujo máximo
Complejidad en tiempo (caso peor): O(|E ||f ∗ |)
Dualidad
Dualidad
Dualidad
¿De dónde vienen los multiplicadores (1, 80, 0)?
Mult. Desigualdades
y1 4A + 12B ≤ 384 Sean yi ≥ 0 (preservamos las desigualdades ≤)
y2 0,1A + 0,1B ≤ 4 Después haber multiplicado y sumado . . .
y3 14A + 8B ≤ 476
Dualidad
y1 , y2 , y3 ≥ 0
4y1 + 0,1y2 + 14y3 ≥ 12
12y1 + 0,1y2 + 8y3 ≥ 20
Dualidad
Relación entre soluciones primal-dual
Problema dual
Dualidad
Primal en forma canónica
max cT x min yT b
t.q. Ax ≤ b ⇐⇒ t.q. AT y ≥ c
x≥0 y≥0
Dualidad
Primal y dual en forma canónica
Dualidad
Teorema de dualidad
max cT x min yT b
t.q. Ax ≤ b ⇐⇒ t.q. AT y ≥ c
x≥0 y≥0
c · x ∗ = y ∗T Ax ∗ = y ∗T · b.
Dualidad
Visualización del dual
Dualidad
Visualización del dual
Dualidad
Visualización del dual
Dualidad
Visualización del dual
Variantes de problemas LP
Variantes de problemas LP
Reducción de una restricción de desigualdad a una de igualdad
Añadir una nueva variable slack s
n
X n
X
ai xi ≤bi ⇒ ai xi + s =bi
i=1 i=1
s≥0
Variantes de problemas LP
Reducción de una variable x sin restricciones de signo a dos variables
x + , x − no negativas
Añadir las dos variables x1 , x2 ≥ 0
Sustituir x por x1 − x2 (en las restricciones y función objetivo)
Reducción de un problema primal a un problema dual
Ejemplo
Problema de máximo flujo (primal) / problema de mı́nimo corte (dual)
Simona Bernardi Programación lineal 60 / 67
Programación lineal
Reducciones
Problemas ILP
Ejemplo
Máquina Espacio Precio Beneficio (por unidad y dı́a)
prensa 15m2 8.000e 100e
torno 30m 2 4.000e 150e
Espacio disponible: 200m2 , Presupuesto: 40.000e
Problemas ILP
Ejemplo
Máquina Espacio Precio Beneficio (por unidad y dı́a)
prensa 15m2 8.000e 100e
torno 30m 2 4.000e 150e
Espacio disponible: 200m2 , Presupuesto: 40.000e
Criterio de ramificación
Dado el nodo X del árbol y la solución óptima asociada al problema
QX , elegir la variable con la mayor parte decimal
x1 = 2, 22 y x2 = 5, 56
Crear dos nuevas restricciones que definen una partición en el
conjunto de soluciones de Q
Problema P2 : P+ la restricción x2 ≤ 5 asociado al hijo izquierdo de X
Problema P3 : P+ la restricción x2 ≥ 6 asociado al hijo derecho de X
Resolver los problemas relajados correspondientes: Q2 , Q3
Referencias