Professional Documents
Culture Documents
Captulo 1
Programaci
on lineal
1. Introducci
on.
En general, un problema de programacion lineal consiste en maximizar o minimizar el valor de una funci on
lineal c.x = c1 x1 + + cn xn (a la que llamaremos el funcional) para (x1 , . . . , xn ) satisfaciendo un n
umero
finito de igualdades o desigualdades (a las que llamaremos restricciones) de alguno de los siguientes tipos:
a1 x1 + + an xn = b, a1 x1 + + an xn b o a1 x1 + + an xn b
Cuando todas las ecuaciones sean del tipo ai1 x1 + + ain xn = bi (1 i m) usaremos la notaci on
matricial Ax = b, donde A es la matriz de coeficientes aij (1 i m, 1 j n), x = (x1 , . . . , xn ),
b = (b1 , . . . , bm ) y por abuso de notaci on estamos identificando IRn con IRn1 . An alogamente, en lugar de
ai1 x1 + + ain xn bi 1 i m escribiremos Ax b, etc. De esta manera, x 0 significar a xj 0
1 j n.
Veamos algunos ejemplos.
i) El problema del transporte.
Una empresa tiene dos plantas elaboradoras de tubos de acero, y tres centros de distribuci
on. Una planta
elabora 100 toneladas por da y la otra 200. Cada centro demanda 75, 125 y 100 toneladas por da respec-
tivamente. Se estima que el costo cij de llevar una tonelada de la planta i al centro j esta dado por la
matriz
10 14 20
12 20 17
Queremos determinar la cantidad xij de toneladas a despachar por da de la planta i al centro j de manera
tal que el costo total del transporte sea mnimo. Es decir, queremos minimizar la funci
on lineal
a11 a12 a13 a14 b1
a21 a22 a23 a24 b2
a31 a32 a33 a34 b3
donde c = (c1 , c2 , c3 , c4 ), A = a41 a42 a43 a44 y b = b4 .
a51 a52 a53 a54 b5
a61 a62 a63 a64 b6
1 1 1 1 100
min cx
Ax b
x0
b1
b
donde c = (c1 , c2 , c3 , c4 , c5 , c6 ), A = ||aij || y b = 2 .
b3
b4
Programaci
on lineal 3
2. Forma standard.
Observemos que una desigualdad del tipo
ai1 x1 + + ain xn bi
es equivalente a
ai1 x1 + + ain xn + si = bi
si 0
La variable si introducida se llama variable de holgura. De la misma manera, una desigualdad del tipo
ai1 x1 + + ain xn bi
max 2x1 x2
x1 + 2x2 3
(x1 , x2 ) 0
2
grafiquemos el poliedro {(x1 , x2 ) IR / x1 + 2x2 3 x1 0 x2 0} y las distintas rectas
2x1 x2 = k
4 Optimizaci
on Combinatoria
2 x x =0 2 x 1 x 2 = 2
1 2 2 x1 x2 = 6
2 x 1 x 2 = 4
1 2 3
x +2x =3
1 2
2 x x2 = 1
1
2 x x =3
1 2 2 x1 x =5
2
En este caso, los puntos extremos del poliedro son (0, 0), (3, 0) y (0, 23 ). Como se observa en la figura, la
soluci
on optima (x1 , x2 ) = (3, 0) es un punto extremo del poliedro.
on 3.3. Un subconjunto K de IRn se dice convexo sii y + (1 )z K y, z K, 0 1.
Definici
Dejamos a cargo del lector demostrar que un poliedro en IRn es un conjunto convexo.
Definicion 3.4. Sea K un conjunto convexo en IRn . Diremos que x K es un punto extremo si y s olo si no
existen y, z K, IR, con y 6= z, 0 < < 1 tales que x = y + (1 )z. En otras palabras, un punto
de K es un punto extremo si, cualesquiera sean y, z K, y 6= z, la u
nica forma en que x puede estar en el
segmento que une y con z es que x sea alguno de los extremos del segmento, es decir, x = y o x = z.
Para lo que sigue necesitaremos definir los conceptos de soluci
on b
asica y de soluci
on factible de un problema
de programacion lineal que utilizaremos en las demostraciones.
Sea A IRmn una matriz de rango m y sea b IRm .
Definici on 3.5. Diremos que x IRn es una soluci asica de Ax = b sii Ax = b y existen m ndices
on b
i1 , . . . , im entre 1 y n tales que xj = 0 j 6= i1 , . . . , im y las columnas i1 , . . . , im de A (que llamaremos la
base) son linealmente independientes. Si Ax = b es el sistema lineal que aparece en las restricciones de un
problema de programacion lineal, diremos que x es una soluci on b
asica del problema si x es una soluci on
basica de Ax = b.
Observaci on 3.6. En la definici on anterior hemos utilizado la misma letra x para representar tanto a la
variable como a la soluci
on del sistema lineal Ax = b. El lector atento sabra distinguirlas en cada caso.
Observaci on 3.7. Si A IRmn es otra matriz de rango m, b IRm y los sistemas Ax = b y A x = b son
equivalentes entonces x es una soluci
on b
asica de Ax = b si y solo si es una soluci asica de A x = b .
on b
Proposicion 3.8. Dado x tal que Ax = b, si {j / xj 6= 0} = {j1 , . . . , jr } entonces se verifica:
x es una soluci
on b
asica de Ax = b sii el conjunto formado por las columnas j1 , . . . , jr de A es linealmente
independiente.
Demostraci on: (=) Sean i1 , . . . , im tales que xj = 0 para todo j 6= i1 , . . . , im y las columnas i1 , . . . , im
de A son linealmente independientes. Entonces {j1 , . . . , jr } {i1 , . . . , im } de donde el conjunto formado por
las columnas j1 , . . . , jr de A esta contenido en el conjunto formado por las columnas i1 , . . . , im de A y por
lo tanto es linealmente independiente.
(=) Si las columnas j1 , . . . , jr de A son linealmente independientes entonces r m.
Si r = m basta tomar {i1 , . . . , im } = {j1 , . . . , jm }.
Si fuese r < m, como A tiene rango m entonces existen jr+1 , . . . , jm tales que las columnas j1 , . . . , jm de
A son linealmente independientes y vale que xj = 0 para todo j 6= j1 , . . . , jm . Luego tambien en este caso
resulta que x es una solucion b asica.
Programaci
on lineal 5
n
on 3.11. El sistema lineal Ax = b tiene a lo sumo
Proposici m soluciones b
asicas.
Demostraci on: Para cada soluci on basica x de Ax = b, fijemos i1 , . . . , im tales que xj = 0 j 6= i1 , . . . , im
y las columnas i1 , . . . , im de A son linealmente independientes.
Sea B la matriz formada por las columnas i1 , . . . , im de A y sea b = B 1 b. Entonces, por la observaci on
3.10,
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
(x) = {i1 , . . . , im }
y tambien
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
Definici on 3.12. Dado un problema de programacion lineal diremos que x es una soluci
on factible sii x
satisface las restricciones del problema.
Notemos que no siempre existen soluciones factibles porque, por ejemplo, el sistema lineal podra no tener
soluci
on. Pero tambien porque aunque las tuviera, podra ocurrir que ninguna de estas soluciones verificara
el resto de las restricciones, situaci
on que por ejemplo se da en el problema
Por las observaciones hechas en la seccion 2. vamos a restringirnos al estudio de problemas planteados en
forma standard.
Sean A IRmn , b IRm y c IRn y consideremos el problema de programacion lineal en forma standard
6 Optimizaci
on Combinatoria
min cx
Ax = b (1)
x0
Probaremos que si (1) tiene una soluci on optima entonces tiene una soluci on optima en un punto extremo
del poliedro {x IRn / Ax = b x 0}.
Veamos que podemos suponer que rg A = m. En efecto, si (1) tiene una soluci on optima entonces el sistema
Ax = b debe ser compatible. Luego, el rango de A debe ser igual al rango de la matriz ampliada [A | b]. Si
rg A < m entonces rg [A | b] < m. Sean F1 , . . . , Fm las filas de [A | b]. Sea {Fj1 , . . . , Fjr } {F1 , . . . , Fm } una
base del subespacio generado por F1 , . . . , Fm y sea [A | b ] la matriz cuyas filas son Fj1 , . . . , Fjr . Entonces
los sistemas Ax = b y A x = b son equivalentes. Luego podemos reemplazar Ax = b por A x = b en (1)
donde ahora A IRrn tiene rango r. Por lo tanto, de ahora en adelante supondremos que A tiene rango
m.
Teorema 3.13. Sea K el poliedro K = {x IRn / Ax = b x 0}. Entonces x IRn es una soluci
on
b
asica y factible de (1) si y solo si x es un punto extremo de K.
Demostraci on:
(=) Sea x una soluci on basica y factible de (1) que es combinaci on convexa de dos soluciones factibles
(notemos que K es el conjunto de soluciones factibles de (1)), es decir, x = y + (1 )z, con y, z K y
0 < < 1 y probemos que entonces y = z.
Sean i1 , . . . , im tales que xj = 0 para todo j 6= i1 , . . . , im y las columnas i1 , . . . , im de A son linealmente
independientes.
Entonces la submatriz B formada por las columnas i1 , . . . , im de A es una matriz inversible.
Veamos que y = z, es decir que yj = zj para todo j.
Si j 6= i1 , . . . , im entonces 0 = xj = yj + (1 )zj y como y 0, z 0, > 0 y (1 ) > 0 entonces debe
ser yj = 0 = zj .
Ahora, como Ay = b = Az y como yj = 0 = zj para todo j 6= i1 , . . . , im entonces
y z
i1 i1
yi2 zi
B. = b = B. .2
.. .
. .
yim zim
min cx
Ax = b
x0
donde A IRmn tiene rango m, b IRm y c IRn .
Entonces se verifican las dos condiciones siguientes
i) si el problema tiene una soluci
on factible entonces tiene una soluci
on b
asica y factible.
ii) si el problema tiene una soluci
on optima entonces tiene una soluci
on optima que es b
asica.
Demostraci on:
i) Para cada x soluci on factible sea r(x) = #{j / xj 6= 0}. Sea r = min{r(x) / x es factible } y sea x una
soluci
on factible tal que r(x) = r. Probaremos que x es una soluci on b
asica. Si {j / xj 6= 0} = {i1 , . . . , ir }
se tiene que xj = 0 j 6= i1 , . . . , ir y xj > 0 si j = i1 , . . . , ir .
Por la proposicion 3.8., basta probar que las correspondientes columnas i1 , . . . , ir de A son linealmente
independientes. Supongamos que no. Sea B la submatriz de A formada por estas columnas y sea w IRr ,
w 6= 0 tal que Bw = 0.
Como xis > 0 (1 s r) podemos elegir IR tal que xis + .ws 0 para todo 1 s r y xis + .ws = 0
para al menos un valor de s = 1, . . . , r. En efecto, dado que cuando ws = 0 la desigualdad vale pues xis 0,
basta tomar verificando
xis
para todo s / ws > 0
ws
y
xis
para todo s / ws < 0
ws
de manera tal que para alg
un valor de s valga la igualdad. Luego basta tomar
n o
x
max wsis / ws > 0 si ws > 0
= n o
min xis / ws < 0
ws si ws 0 para todo s
4. Dualidad.
Consideremos los problemas de programacion lineal
min cx max yb
Ax b (P ) yA = c (D)
y0
(primal)
(dual)
Programaci
on lineal 9
donde A IRmn , c IRn y b IRm . En esta seccion probaremos que si (P) tiene una soluci on optima x0
entonces (D) tiene una soluci
on y0 optima y ademas se verifica que cx0 = y0 b. En este sentido, diremos que
(P) y (D) son problemas duales. Para poder probar esto necesitaremos antes algunos resultados.
Teorema 4.1. (Teorema del hiperplano separador) Sea Z un conjunto convexo y cerrado en IRn y sea
c IRn tal que c
/ Z. Entonces existe un hiperplano H = {x IRn / ax = b} (donde a IRn , b IR y ax
denota el producto escalar < a, x >= a1 x1 + + an xn ) que satisface
i) c H
ii) az > b para todo z Z
Demostraci on:
Sea z0 Z tal que d(z0 , c) = d(Z, c). Sea a = z0 c y sea b = a.c = a1 c1 + + an cn . Veremos que a.z 6= b
para todo z Z. Supongamos que no. Sea entonces z Z tal que a.z = b.
Notando que para x, y IRn el producto que hemos definido como x.y = x1 y1 xn yn no es otra cosa que
el producto escalar usual < x, y >, se tiene que
de donde < z0 c, z >=< z0 c, c >. Esto significa que < z0 c, z c >= 0, es decir z0 c y z c son
ortogonales.
Veremos ahora que entonces hay un punto en el segmento que une z y z0 que esta mas cerca de c que z0 , es
decir, mostraremos que existe , 0 < < 1 tal que z + (1 )z0 esta mas cerca de c que z0 .
La siguiente figura ilustra esta situaci
on.
z + (1 ) z 0
z0 z
||z0 c||2
Sea = . Como z0 c y z c son no nulos pues c
/ Z entonces 0 < < 1 y vale
||z c||2 + ||z0 c||2
2||z0 c||2
<
||z c||2 + ||z0 c||2
Entonces
(||z c||2 + ||z0 c||2 ) < 2||z0 c||2
de donde
2 (||z c||2 + ||z0 c||2 ) < 2||z0 c||2
lo que implica
2 (||z c||2 + ||z0 c||2 ) 2||z0 c||2 < 0
con lo cual
2 ||z c||2 2||z0 c||2 + 2 ||z0 c||2 < 0
10 Optimizaci
on Combinatoria
y as
2 ||z c||2 + (1 )2 ||z0 c||2 < ||z0 c||2
Como
||z + (1 )z0 c||2 = ||(z c) + (1 )(z0 c)||2 = 2 ||z c||2 + (1 )2 ||z0 c||2
pues z0 c y z c son ortogonales, entonces se tiene que ||z + (1 )z0 c||2 < ||z0 c||2 , de donde
d(z + (1 )z0 , c) < d(z, c).
Siendo Z convexo, z, z0 Z y 0 < < 1 entonces z = z + (1 )z0 Z y vale d(z, c) < d(z0 , c) = d(Z, c)
lo que es un absurdo. Luego debe ser a.z 6= b para todo z Z.
Veamos ahora que a.z > b para todo z Z o az < b para todo z Z. Supongamos que no. Sean z1 , z2 Z
tales que a.z1 > b y a.z2 < b. Probaremos que entonces existe z Z tal que a.z = b, cosa que vimos que no
puede ocurrir.
b a.z2
Sea = . (Notar que a.z1 6= a.z2 pues a.z1 > b y a.z2 < b).
a.z1 a.z2
Dejamos a cargo del lector verificar que 0 < < 1. Luego z = z1 + (1 )z2 Z y adem as vale
a.z = a.(z1 + (1 )z2 ) = (a.z1 a.z2 ) + a.z2 = b. Luego az > b para todo z Z o az < b para todo
z Z.
Si ocurre lo primero se obtiene el hiperplano buscado. Si ocurre lo segundo, entonces az > b para todo
z Z y el hiperplano buscado es H = {x IRn / (a)x = (b)}.
Ahora estamos en condiciones de probar el lema que necesitaremos para demostrar el teorema de dualidad.
Lema 4.2. (Lema de Farkas) Sean U IRkn , c IRn . Entonces son equivalentes:
i) U.x 0 = c.x 0
ii) y IRk , y 0 tal que c = y.U
Demostraci
on:
ii) = i) es trivial
i) = ii) Sea Z = {z IRn / z = y.U para alg
un y 0}.
Supongamos que ii) no vale. Entonces para todo y 0 vale y.U 6= c, es decir, c
/ Z.
n
Como el conjunto Z es convexo y cerrado en IR entonces por el teorema anterior existe un hiperplano
H = {x IRn / ax = b} tal que ac = b y az > b para todo z Z. Por lo tanto ac < az para todo z Z. En
particular, como 0 Z resulta que ca = ac < 0.
Por otra parte, para todo y 0, y.U Z. Luego, b < a.y.U = y.U.a para todo y 0.
Veamos que U.a 0:
si U.a = (d1 , . . . , dk ), para todo (y1 , . . . , yk ) 0 vale b < y1 d1 + + yk dk . Supongamos que dr < 0 para
b
alg
un r. Como b = a.c < 0 entonces > 0.
dr
Sea y definido por
0 si j 6= r
yj = b
si j=r
dr
Entonces y 0 y vale y.U.a = b, cosa que no puede ocurrir. Luego debe ser U.a 0. Por lo tanto a IRn
satisface c.a < 0 y U.a 0, lo que contradice i).
Antes de demostrar el teorema de dualidad necesitaremos un u
ltimo resultado que nos permitir
a dar una
caracterizacion de los puntos optimos de (P).
Consideremos el problema
Programaci
on lineal 11
min cx
Ax b (P )
Definicion 4.3. Dado x0 IRn tal que Ax0 b, definimos el conjunto de ndices de las restricciones activas
en el punto factible x0 como el conjunto I(x0 ) = {i / (Ax0 )i = bi } (donde (Ax0 )i denota la i-esima fila de la
matriz Ax0 ).
Definicion 4.4. Dado x0 IRn tal que Ax0 b, diremos que IRn es una direcci
on factible para x0 si
existe IR, > 0 tal que A(x0 + ) b.
Proposici on 4.5. Sea x0 IRn tal que Ax0 b (es decir, una soluci
on factible de (P)). Entonces se verifican
las condiciones siguientes:
i) cualquiera sea IRn existe > 0 tal que i / I(x0 ) vale (A(x0 + ))i bi
ii) si i I(x0 ), cualquiera sea > 0 se satisface
iii) es una direccion factible para x0 si y solo si (A)i 0 para todo i I(x0 )
iv) x0 es un optimo de (P) si y solo si c 0 para toda direccion factible
v) x0 es un optimo de (P) si y solo si vale la implicacion
Demostraci on:
i) Para cada i
/ I(x0 ) vale (Ax0 )i > bi , es decir (Ax0 )i bi > 0. Sea > 0 tal que
(Ax0 )i bi
(A)i
Teorema 4.6. (Teorema de dualidad). Consideremos los siguientes problemas de programacion lineal
min cx max yb
Ax b (P ) yA = c (D)
y0
(primal)
(dual)
mn n m
donde A IR , c IR y b IR . Supongamos que existe un x0 que es soluci on optima del problema
(P) (es decir, Ax0 b y el mnimo de cx sobre el poliedro {Ax b} es cx0 ). Entonces existe y0 0 tal que
y0 A = c y el maximo de yb sobre el poliedro {yA = c y 0} es igual a y0 b (es decir, y0 es una soluci on
optima del problema (D)) y ademas se verifica que cx0 = y0 b.
on: Sea x0 un punto optimo de (P). Entonces
Demostraci
min cx max yb
Ax = b (P ) yA c (D )
x0
on: Transformemos (P) de manera tal que tenga la forma de (P) y apliquemos el teorema de
Demostraci
dualidad
min cx min cx
Ax b
es decir, A b
(A)x (b) A x b
x0 I 0
cuyo dual es
b
max y b
0
A
y. A = c
I
y0
Programaci
on lineal 13
max ub vb
uA vA + Is = c
u, v, s 0
y tomando y = u v es
max yb
max yb
yA + Is = c es decir,
yA c
s0
tal como queramos probar.
min cx max yb
Ax = b (P ) yA c (D )
x0
Entonces x e y son soluciones optimas de (P) y (D) respectivamente si y solo si son factibles y para cada
1 j n se verifica !
Xm
cj yi aij .xj = 0
i=1
Demostraci on: Supongamos que x e y son soluciones optimas de (P) y (D) respectivamente. Entonces
son factibles y satisfacen cx = yb. Como Ax = b entonces yAx = yb = cx de donde (c yA)x = 0. Luego,
como (c yA)j 0, xj 0 y (c yA)1 x1 + + (c yA)n xn = (c yA).x = 0 entonces
m
!
X
0 = (c yA)j .xj = cj yi aij .xj (1 j n)
i=1
m
!
X
cj yi aij .xj = 0
i=1
entonces (c yA)j .xj = 0 para todo j, de donde (c yA).x = (c yA)1 x1 + + (c yA)n xn = 0. Luego
yAx = cx y Ax = b. Luego, cx = yAx = yb.
Falta ver que x es un mnimo y que y es un maximo. Para toda soluci on factible u de (P) es Au = b y
u 0. Luego, yAu cu pues yA c de donde cx = yb = yAu cu.
Analogamente, para toda solucion factible z de (D) se tiene que zAx cx para todo x 0 pues zA c.
Luego, como Ax = b resulta que yb = cx zAx = zb.
Observaci on 4.10. Hemos probado que si x0 e y0 son soluciones factibles de (P) y (D) respectivamente
y satisfacen cx0 = y0 b entonces x0 e y0 son optimos.
5. Transformaci
on pivote.
min z
z+cx = z0
Ax = b (2)
x0
min z
1 c z z0
. =
0 A x b
x0
min cx
Ax = b
x0
resolviendo el problema equivalente
min z
z+cx = 0
Ax = b
x0
que tiene la forma de (2) para z0 = 0.
Notar que (z, x) es una solucion factible del segundo problema si y solo si x es una soluci on factible del
primero y el valor del funcional en ella es z (es decir, cx = z). Luego, si (z, x) es una soluci
on optima del
segundo problema entonces x es una soluci on optima del primero y el valor del funcional en ella es cx = z.
El algoritmo realizara, en cada iteracion, una transformacion en el tableau
1 c | z0
( | ) =
0 A | b
correspondiente a (2) que llamaremos transformaci on pivote. El pivote sera elegido convenientemente entre
los coeficientes de A.
Sea ( | ) la matriz ampliada de un sistema lineal, donde = (ij ) 0im es una matriz de (m + 1) (n + 1)
0jn
Observaci on 5.2. Si ( | ) es la matriz obtenida mediante una transformacion con pivote rs , es decir, la
matriz cuyas filas son F0 , . . . , Fm
entonces existe U IR(m+1)(m+1) inversible tal que ( | ) = U.( | ).
Luego, los sistemas x = y x = son equivalentes. Ademas, la columna s de la matriz tiene un uno
eligiendo un coeficiente ars de A como pivote entonces la columna cero no se modifica. Luego, la matriz
obtenida es de la forma
1 c | z0
0 A | b
Por la observacion 5.2., la columna s de esta matriz tiene un uno en la fila r y ceros en las restantes filas,
incluyendo la fila cero. Esto significa que cs = 0 y que la columna s de A es el vector er (donde er IRm
es el r-esimo vector de la base can
onica, es decir, el que tiene un uno en el lugar r y ceros en los restantes
lugares). Ademas, (z, x) es una solucion de
1 c z z0
. =
0 A x b
si y solo si lo es de
1 c z z0
. =
0 A x b
Veamos un ejemplo.
16 Optimizaci
on Combinatoria
Luego,
1 0 1/3 4/3 7/3 | 4/3 1 0 16 15 0 | 8
0 1 1/3 2/3 2/3 | 1/3 0 1 5 4 0 | 3
0 0 7/3 7/3 1/3 | 4/3 0 0 7 7 1 | 4
0 0 4/3 2/3 5/3 | 4/3 0 0 13 11 0 | 8
1 c | z0
As obtenemos una nueva matriz, a la que volvemos a llamar tal que las columnas 1 y 4
0 A | b
de A son e1 y a e2 respectivamente y c1 = c4 = 0. Finalmente hacemos una transformacion con pivote en
un coeficiente ars de A, por ejemplo, ars = a33 = 11. Las operaciones de fila seran
15
F0 = F0 .F3
11
4
F1 = F1 .F3
11
7
F2 = F2 .F3
11
1
F3 = .F3
11
Luego,
1
0 16 15 0 | 8 1 0 19/11 0 0 | 32/11
0
1 5 4 0 | 3 0 1 3/11 0 0 | 1/11
0
0 7 7 1 | 4 0 0 14/11 0 1 | 12/11
0
0 13 11 0 | 8 0 0 13/11 1 0 | 8/11
1 c | z0
Si ahora llamamos a la u
ltima matriz obtenida se tiene que
0 A | b
1 3/11 0 0
A = 0 14/11 0 1 , z0 = 32/11, b = (1/11, 12/11, 8/11) y c = (0, 19/11, 0, 0)
0 13/11 1 0
y se verifica que las columnas 1, 4 y 3 de A son los vectores e1 , e2 y e3 respectivamente y las correspondientes
coordenadas c1 , c4 y c3 de c son nulas.
Notando que en cada paso hemos obtenido un sistema equivalente al anterior, resulta que el u ltimo es
equivalente al original, de donde las soluciones de
z
1 2 1 0 1 2
x1
0 3 1 2 2 1
. x2 =
0 2 3 1 1 2
x3
0 1 1 0 1 1
x4
son las soluciones de
z + 19/11x2 = 32/11
x1 + 3/11 x2 = 1/11
14/11 x2 + x4 = 12/11
13/11 x2 + x3 = 8/11
Ahora, tomando x2 = 0 y (x1 , x4 , x3 ) = b = (1/11, 12/11, 8/11) y el valor del funcional z que queremos
minimizar como z = z0 = 32/11 se obtiene una soluci on del sistema original. La matriz
1 c | z0
0 A | b
18 Optimizaci
on Combinatoria
se obtuvo haciendo una sucesion de transformaciones pivote en el tableau original. Luego, por la observaci
on
5.2., existe una matriz inversible U IR44 tal que
1 2 1 0 1 | 2
0 3 1 2 2 | 1 1 c | z0
U. =
0 2 3 1 1 | 2 0 A | b
0 1 1 0 1 | 1
Como la columna cero permanecio constante, las columnas 1, 4y 3 de A resultaron e1 , e2 y e3 respectivamente
1 c | z0
y como c1 = c4 = c3 = 0, entonces las columnas 0, 1, 4 y 3 de forman la matriz identidad.
0 A | b
1 c
Luego, las columnas 0,1,4 y 3 de la matriz son linealmente independientes, ya que si B es la matriz
0 A
formada por ellas entonces U.B = I4 (donde I4 es la matriz identidad de 4 4).
Esto muestra que la soluci on (z, x) = (z, x1 , . . . , x4 ) = (z0 , b1 , 0, b3 , b2 ) = (32/11, 1/11, 0, 8/11, 12/11) es
una solucion b on el valor del funcional z a minimizar es z = z0 = 32/11. Adem
asica y para esta soluci as,
en este caso esta soluci on tambien es factible ya que x = (b1 , 0, b3 , b2 ) y b 0.
Observemos ademas que como los pivotes fueron elegidos entre los coeficientes de A entonces (A | b ) es la
matriz que se obtendra si hicieramos en (A | b) las mismas transformaciones pivote que hicimos en todo el
tableau. Por lo tanto los sistemas Ax = b y A x = b tambien son equivalentes. Mas a un, como las columnas
1, 4 y 3 de A forman la matriz identidad de 3 3 y b 0 entonces x = (b1 , 0, b3 , b2 ) es una soluci on b
asica
de Ax = b que satisface x 0 y vale z0 = cx + z0 ya que (z0 , x) es soluci on del sistema original.
Ejemplo 5.5. Consideremos ahora el problema
min z
z + 3x1 + 5x2 + 7x3 + 2x4 = 10
x1 + 2x3 + x4 = 0
2x1 + x2 x3 + x4 = 1
x1 + 2x2 + 2x3 x4 = 3
x1 , x2 , x3 , x4 0
cuyo tableau es
1 3 5 7 2 | 10
1 c | z0 0 1 0 2 1 | 0
=
0 A | b 0 2 1 1 1 | 1
0 1 2 2 1 | 3
Hacemos primero una transformacion con pivote en ars = a31 = 1. Las operaciones de fila seran
F0 = F0 3.F3
F1 = F1 F3
F2 = F2 2.F3
F3 = F3
Por lo tanto
1 3 5 7 2 | 10 1 0 1 1 5 | 1
0 1 0 2 1 | 0 0 0 2 0 2 | 3
0 2 1 1 1 | 1 0 0 3 5 3 | 5
0 1 2 2 1 | 3 0 1 2 2 1 | 3
Programaci
on lineal 19
Ahora hacemos una transformacion con pivote en ars = a12 = 2. Las operaciones de fila seran
1
F0 = F0 .F1
2
1
F1 = .F1
2
3
F2 = F2 .F1
2
F3 = F3 + F1
Por lo tanto
1 0 1 1 5 | 1 1 0 0 1 4 | 5/2
0 0 2 0 2 | 3 0 0 1 0 1 | 3/2
0 0 3 5 3 | 5 0 0 0 5 0 | 1/2
0 1 2 2 1 | 3 0 1 0 2 1 | 0
Finalmente hacemos una transformacion con pivote en ars = a23 = 5. Las operaciones de fila ser
an
1
F0 = F0 + .F2
5
F1 = F1
1
F2 = .F2
5
2
F3 = F3 + .F2
5
Por lo tanto
1 0 0 1 4 | 5/2 1 0 0 0 4 | 24/10
0 0 1 0 1 | 3/2 0 0 1 0 1 | 3/2
0 0 0 5 0 | 1/2 0 0 0 1 0 | 1/10
0 1 0 2 1 | 0 0 1 0 0 1 | 1/5
Luego el sistema
1 c z z0
. =
0 A x b
es equivalente al sistema
1 c z z0
. =
0 A x b
donde
0 1 0 1 3/2
A = 0 0 1 0 , b = 1/10 , z0 = 24/10 y c = (0, 0, 0, 4)
1 0 0 1 1/5
es decir, al sistema
z + 4x4 = 24/10
x2 x4 = 3/2
x3 = 1/10
x1 + x4 = 1/5
Como la matriz formada por las columnas 2, 3 y 1 de A es I3 y c2 = c3 = c1 = 0, tomando ahora x4 = 0 y
(x2 , x3 , x1 ) = b = (3/2, 1/10, 1/5) y z = z0 = 24/10 obtenemos una solucion b
asica (z, x) del problema
dado, pero esta soluci on no es factible ya que b tiene una coordenada negativa.
20 Optimizaci
on Combinatoria
min z
z+cx = z0
Ax = b (2)
x0
xim
ya que B = Im , pues la columna j de B es la columna ij de A que es el vector ej (1 j m).
Luego, c x = 0 y A x = b , de donde resulta que (z0 , x ) es soluci
on de
1 c z z0
. =
0 A x b
ais
y b 0, entonces debe ser ars > 0 para que resulte br 0 y debe valer bi ars br para todo i 6= r, es decir,
bi br
ais para todo i tal que ais > 0 (ya que como ars > 0 y b 0 entonces para i tal que ais < 0 la
ars
desigualdad que queremos vale trivialmente). Luego, cualquiera sea s, r debe satisfacer
br bi
= min / ais > 0
ars ais
Notemos que para poder elegir r debemos conocer s. Veamos entonces como elegir s para que valga z 0 z0 .
c c c
Como z 0 = z0 as br , es decir, z 0 = z0 + as br entonces z 0 z0 si y solo si as br 0, si y s
olo si cs 0
rs rs rs
(pues ars > 0 y br 0). Pero cuando cs = 0 entonces z 0 = z0 . Como nuestra intenci on es disminuir el valor
del funcional, pediremos entonces que s sea elegido verificando cs < 0.
En definitiva, primero elegiremos s tal que cs < 0 y luego r tal que
br bi
= min / ais > 0
ars ais
en uno equivalente
1 c z z0
. =
0 A x b
22 Optimizaci
on Combinatoria
con A conteniendo una submatriz permutacion, las correspondientes coordenadas de c nulas y b 0. Esto
se debe a que hay problemas que no tienen soluciones factibles. Por ejemplo:
min z
z + 2x1 + x3 = 2
x1 + x2 x3 = 1
x1 + x2 = 0
x0
no tiene ninguna soluci
on factible.
Mas a
un, hay sistemas que no tienen soluci
on:
x1 + x2 + x3 = 2
x1 x2 = 0
2x2 + x3 = 1
1 c | z0
Pero esto siempre es posible si el tableau de partida satisface que A tiene m columnas
0 A | b
que permutadas convenientemente forman la matriz identidad de m m, que las coordenadas de c corres-
pondientes a esas columnas son nulas y que b 0. Es por esta razon que pediremos que el tableau inicial
tenga estas propiedades.
entonces el sistema
1 c z z0
. =
0 A x b
esta en forma can
onica. En efecto, reemplazando en
1 c z z0
. =
0 A x b
queda
1 2 0 1 0 0 1 1
0 1 0 1 0 1 1 z 2
. =
0 1 1 1 0 0 1 x 1
0 1 0 0 1 0 2 1/2
En este caso las columnas i1 = 5, i2 = 2 e i3 = 4 de A forman la matriz identidad de 3 3. Las coordenadas
de c correspondientes a estas columnas, c5 , c2 y c4 , son nulas.
Para cada sistema
1 c z z0
. =
0 A x b
que este en forma can onica, tomando xi1 = b1 , xi2 = b2 , ..., xim = bm y las restantes coordenadas de x
iguales a cero, se obtiene un x que satisface Ax = b y cx = 0 (pues xj = 0 si j 6= i1 , . . . , im y cj = 0
si
1 c
j = i1 , . . . , im ). Luego, (z0 , x) es una solucion basica de (2) pues las columnas 0, i1 , . . . , im de
0 A
forman la matriz identidad Im+1 y la coordenada j-esima de (z0 , x) es nula para j 6= 0, i1 , . . . , im y, por
razones an alogas, x es una soluci on basica de Ax = b. Ademas, si b 0 resulta x 0. En tal caso, (z0 , x)
es una soluci on b on es z = z0 pues cx = 0.
asica y factible de (2). El valor del funcional en esta soluci
Observaci on 6.4. Es f
acil ver que si hacemos una transformacion pivote en un sistema can
onico obtenemos
otro sistema can
onico. La fila r y la columna s correspondientes al pivote elegido determinan cu
ales son las
columnas unitarias del nuevo sistema en la forma
ij si j 6= r
ij =
s si j = r
Decimos entonces que la columna ir sale de la base y que la columna s entra en la base.
A continuaci
on daremos una idea de la estructura del algoritmo.
En cada iteracion, partiremos de un sistema lineal
1 c z z0
. =
0 A x b
aplicar cuando el sistema de partida este en forma can onica y valga b 0. En los casos en que esto no
ocurriera recurriremos a un proceso previo llamado FASE 1 que nos permitira estar en condiciones de aplicar
el algoritmo.
Al finalizar el algoritmo, si el problema tena soluci
on optima, entonces la soluci
on b
asica obtenida a partir
del u
ltimo sistema canonico
1 c | z0
0 A | b
construdo sera una soluci on (z0 , x) debemos conocer
on optima del problema. Para determinar esta soluci
cu
ales columnas i1 , . . . , im de la matriz A son las columnas unitarias (donde ik es la columna de A donde
esta el vector ek ), ya que x es el vector definido por
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
Luego, en cada iteracion actualizaremos los valores de i1 , . . . , im . Para ello, en cada paso escribiremos a la
izquierda de cada fila k de la matriz del sistema el valor de ik correspondiente en la forma
1 c1 ... cn | z0
i1 0 a11 ... a1n | b1
i2 0 a21 ... a2n | b2
.. . .. .. ..
. .
. . . | .
im 0 am1 . . . amn | bm
Cada vez que se efectua una operacion con pivote en un coeficiente ars de A, los nuevos valores de ik se
pueden calcular a partir de los anteriores en la forma descripta en la observaci
on 6.4.
(ver observaci
on 6.4.) y como los pivotes se eligen entre los coeficientes de A entonces la columna cero
permanecera invariante (i.e., la nueva columna cero sera el vector e1 ). En efecto, como las operaciones son
cs
F0 = F0 Fr
ars
ais
Fi = Fi Fr si i 6= r
ars
1
Fr = Fr
ars
1 c | z0
se tiene que la columna cero permanece invariante y la matriz resultante satisface
0 A | b
cs
cj = cj arj
ars
cs
z0 = z0 br
ars
ais
Ai = Ai Ar si i 6= r
ars
1
Ar = Ar
ars
ais
bi = bi br si i 6= r
ars
1
br = br
ars
Los pivotes seran elegidos de manera tal que valgan b 0 y z0 z0 . Para ello, tal como
n vimos enola secci
on
5., basta elegir un valor de s tal que cs < 0 y luego un valor de r tal que abrs
r
= min abisi / ais > 0 .
Veremos a continuaci on que sucede si no es posible
n elegir soo r en esta forma, es decir, si no existe s tal que
bi
cs < 0 o si para s tal que cs < 0 el conjunto ais / ais > 0 es vaco, es decir, no existe i tal que ais > 0.
min z
z+cx = z0
Ax = b
x0
z + cx = z0
Ax = b
x0
on 7.2. Sea s tal que cs < 0. Si no existe i, (1 i m) tal que ais > 0 entonces
Proposici
min z
z+cx = z0
Ax = b
x0
Descripci
on del algoritmo.
Dado un sistema lineal
1 c z z0
. =
0 A x b
que esta en forma can
onica y que satisface b 0, el algoritmo realiza los siguientes pasos a partir de la
matriz
1 c1 ... cn | z0
i1 0 a11 ... a1n | b1
i2 0 a21 ... a2n | b2
.. . .. .. ..
. .
. . . | .
im 0 am1 . . . amn | bm
donde ik es la columna de A donde esta el vector ek .
Programaci
on lineal 27
1. Elegir una columna s de A tal que cs < 0. Si no existe, stop (la presente soluci
on b
asica (z0 , x) es optima).
2. Elegir una fila r de A tal que
br bi
= min / ais > 0
ars ais
Si el conjunto fuera vaco, es decir, 6 i tal que ais > 0, stop (el problema no tiene soluci
on optima).
3. Hacer una transformacion con pivote en ars y poner
n
i si k 6= r
ik = k
s si k = r
4. Si
1 c | z0
0 A | b
es la matriz obtenida en el paso 3., actualizar en la forma c = c , A = A , z0 = z0 , b = b , ik = ik .
5. Ir a 1.
Ejemplo 7.3.
Apliquemos el algoritmo simplex para resolver el problema en forma standard
min z
z+cx = z0
Ax = b
x0
b2 b3
pues = 12/4 y = 10/3. Luego, r = 2 de donde ars = a23 = 4. Indicaremos el pivote en la matriz
a23 a33
con un asterisco.
Mediante la transformacion pivote el sistema
1 0 1 3 0 2 0 | 0
1 0 1 3 1 0 2 0 | 7
4 0 0 2 4 1 0 0 | 12
6 0 0 4 3 0 8 1 | 10
se transforma en
1 0 1/2 0 3/4 2 0 | 9
1 0 1 5/2 0 1/4 2 0 | 10
3 0 0 1/2 1 1/4 0 0 | 3
6 0 0 5/2 0 3/4 8 1 | 1
ya que las operaciones de fila son:
c3
F0 = F0 F2
4
ai3
Fi = Fi F2 (i = 1, 3)
4
F2
F2 =
4
y las nuevas filas unitarias son
ij si j 6= r ij si j 6= 2
ij = =
s si j = r 3 si j = 2
1 1/5 0 0 4/5 12/5 0 | 11
2 0 2/5 1 0 1/10 4/5 0 | 4
3 0 1/5 0 1 3/10 2/5 0 | 5
6 0 1 0 0 1/2 10 1 | 11
Ahora se tiene que cs 0 para todo s. Luego, (z0 , x) = (11, 0, 4, 5, 0, 0, 11) es una soluci
on b
asica optima
de
min z
z+cx = z0
Ax = b
x0
donde c = (0, 1, 3, 0, 2, 0), b = (7, 12, 10), z0 = 0 y
1 3 1 0 2 0
A = 0 2 4 1 0 0
0 4 3 0 8 1
se transforma en
1 0 1/2 0 3/4 2 0 | 9
1 0 1 1/2 0 1/4 2 0 | 10
3 0 0 1/2 1 1/4 0 0 | 3
6 0 0 5/2 0 3/4 8 1 | 1
Ahora debemos elegir s = 2, pero ais = ai2 0 para todo i. Esto significa que el problema no tiene una
soluci
on optima.
min z
z+cx = z0
Ax = b
x0
en general. Para poder aplicar el algoritmo simplex necesitamos que se verifiquen las siguientes tres condi-
ciones:
i) A contiene una matriz permutaci on de Im .
ii) Las coordenadas ci1 , . . . , cim de c correspondientes a las columnas unitarias i1 , . . . , im de A son nulas.
iii) b 0
on 8.1. Si iii) no valiera podemos utilizar, en lugar del tableau original
Observaci
1 c | z0
0 A | b
el equivalente obtenido multiplicando por -1 cada fila i para la que bi < 0. Por lo tanto siempre podemos
suponer que b 0.
on 8.2. Supongamos que tenemos un tableau
Observaci
1 c | z0
0 A | b
para el cual valen i) y iii). Si ii) no valiera, entonces podemos utilizar en su lugar el equivalente que resulta
de la siguiente operacion de filas
F0 = F0 (ci1 F1 + + cim Fm )
min w
w + s1 + + sm = 0
Ax + Im s = b (3)
x, s 0
cuyas soluciones seran vectores (w, x, s), donde w IR, x IRn y s IRm . A las variables s1 , . . . , sm que
no estaban en el problema original las llamaremos variables artificiales.
El sistema (3) siempre es factible: (w, x, s) = (b1 + + bm , 0, b) es una soluci
on del sistema lineal con
x, s 0. Ademas, su tableau es
1 0 0 ... 0 1 1 ... 1 | 0
0 a11 a12 ... a1n 1 0 . . . 0 | b1
1 0n 1m | 0
= 0 a21 a22 ... a2n 0 1 . . . 0 | b2
0 A Im | b . .. .. .. .. .. .. .. .. .
.
. . . . . . . . . | ..
0 am1 am2 . . . amn 0 0 . . . 1 | bm
Notemos que este tableau satisface i) y iii). La FASE 1 consiste en resolver (3) aplicando el algoritmo simplex
al tableau equivalente
1 d 0m | u0
=
0 A Im | b
1 Pm a Pm Pm
. . . i=1 ain 0 0 . . . 0 | i=1 bi
Pm
i=1 i1 i=1 ai2
0 a11 a12 ... a1n 1 0 ... 0 | b1
= 0 a 21 a 22 . . . a 2n 0 1 . . . 0 | b 2
.. .. .. .. .. .. .. .. .. ..
. . . . . . . . . | .
0 am1 am2 ... amn 0 0 ... 1 | bm
que esta en forma can
onica y que resulta de hacer la operacion de filas
F0 = F0 (F1 + + Fm )
(ver observaci
on 8.2.). Veremos a continuaci on que una vez resuelto (3) con el algoritmo simplex (es decir,
finalizada la FASE 1) podremos determinar si (2) es factible o no y, en el caso en que lo sea, podremos
obtener un tableau que verificara i), ii) y iii). La FASE 2 consistira aplicar el simplex a este tableau.
Por la proposici
on 8.3., si (3) no tiene soluciones optimas o el valor del funcional en cualquier soluci
on optima
es no nulo entonces (2) no es factible. Luego, si (2) es factible, entonces al finalizar la FASE 1 el u ltimo
tableau obtenido al aplicar el simplex al tableau inicial
1 d 0m | u0
0 A Im | b
onica y satisfaga b 0, d 0 y f 0.
que este en forma can
Sean j1 , . . . , jr los ndices j tales que dj > 0, donde dj es la j-esima coordenada de d y sean k1 , . . . , kt
los ndices j tales que la columna j de I no sea una columna unitaria. Notar que entonces dj = 0 para
j 6= j1 , . . . , jr pues d 0 y fj = 0 para j 6= k1 , . . . , kt pues si la columna j de I es unitaria entonces fj = 0
ya que
1 d f | 0
0 A I | b
esta en forma can
onica.
Consideremos los problemas
A x + I s = b
xj = 0 j = j1 , . . . , jr (4)
sj = 0 j = k1 , . . . , kt
x, s 0
y
Ax = b (5)
x0
w + d x + f s = 0
A x + I s = b
x, s 0
w + d x + f s = 0
A x + I s = b
y
w + s1 + + sm = 0
Ax + Is = b
son equivalentes pues la matriz
1 d f | 0
0 A I | b
Programaci
on lineal 33
w + d x + f s = 0
A x + I s = b
x, s 0
A x + I s = b
xj = 0 j = j1 , . . . , jr
sj = 0 j = k1 , . . . , kt
x, s 0
Ax = b (5)
x0
Sea
: {x IRn / xj = 0 j = j1 , . . . , jr } IRnr
la biyeccion definida por
(x1 , . . . , xn ) = (x1 , . . . , xc
jl , . . . , xn )
donde (x1 , . . . , xc
jl , . . . , xn ) es el vector que resulta de eliminar en (x1 , . . . , xn ) las coordenadas j1 , . . . , jr y
sea
: {s IRm / sj = 0 j = k1 , . . . , kt } IRmt
34 Optimizaci
on Combinatoria
eliminando las columnas correspondientes a las coordenadas no nulas de d y las columnas correspondientes
a columnas no unitarias de I (recordemos que a la primera columna siempre la contamos como columna
cero y A tiene n columnas) y luego eliminando lo que quede de la fila (1 d f 0)
Observemos que c(x) = cx para todo x tal que xj = 0 j = j1 , . . . , jr pues c resulta de eliminar en c las
coordenadas j1 , . . . , jr .
Consideremos ahora el problema
min z
z + cx = z0
A x + I s = b (6)
xj = 0 j = j1 , . . . , jr
sj = 0 j = k1 , . . . , kt
x, s 0
y notemos que (z , x , s ) es una soluci on optima de (6) si y solo si s = 0 y (z , x ) es una soluci on optima de
(2) ya que (x , s ) es una soluci on de (4) si y solo si s = 0 y x es una soluci on de (5). Dejamos a cargo del
lector verificar que (z , x , s ) es una solucion optima de (6) si y solo si (x , s ) = (1 (u ), 1 (v ) y (z , u , v )
es una solucion optima de
min z
z + cu = z0 (7)
Au + Iv = b
u, v 0
Ahora aplicamos el simplex al tableau
1 c 0 | z0
0 A I | b
o al equivalente que este en forma can
onica mencionado en la observaci
on 8.2. si este no estuviera en forma
canonica. Esto es posible pues b 0 y (A I) contiene una matriz permutaci
on ya que
w
1 d f 0
. x =
0 A I b
s
era un sistema canonico, las coordenadas dj correspondientes a vectores unitarios eran nulas, con lo cual
estas columnas no fueron eliminadas y las columnas unitarias de I tampoco fueron eliminadas.
Programaci
on lineal 35
Esto resuelve el problema (7). Si (7) no tiene soluci on optima, entonces (6), y por lo tanto (2), tampoco. En
caso contrario, sea (z , u , v ) la soluci
on b
asica optima de (7) hallada por el algoritmo. Entonces tomando
x = 1 (u ) y s = 1 (v ) resulta que (z , x , s ) es una soluci asica optima de (6) y por lo tanto s = 0
on b
y (z , x ) es una solucion b asica optima de (2).
min z
z+cx = z0
Ax = b
x0
3 3 4 2 1
donde c = (2, 3, 2, 1, 1), z0 = 0, A = y b = (1, 2), es decir,
1 1 1 3 1
min z
z + 2x1 +3x2 + 2x3 x4 + x5 = 0
3x1 3x2 +4x3 + 2x4 x5 = 1
x1 + x2 +x3 + 3x4 + x5 = 2
x0
min w
w + s1 + + sm = 0
Ax + Im s = b
x, s 0
3 3 4 2 1 1 0
con A = , Im = I2 = y b = (1, , 2), cuyo tableau es
1 1 1 3 1 0 1
1 0 0 0 0 0 1 1 | 0
0 3 3 4 2 1 1 0 | 1
0 1 1 1 3 1 0 1 | 2
y hagamos la transformacion de filas F0 = F0 (F1 + + Fm ) que nos da el tableau equivalente que est
a
en forma can
onica
1 4 2 5 5 0 0 0 | 3
1 d 0m | z0
= 0 3 3 4 2 1 1 0 | 1
0 A Im | b
0 1 1 1 3 1 0 1 | 2
36 Optimizaci
on Combinatoria
1 231/55 2/5 275/55 0 0 | 2/5
4 0 44/55 2/5 1 1 0 | 3/5
5 0 7/5 11/5 2 0 1 | 1/5
Luego, tomando z = 2/5, u = (0, 0, 0, 3/5, 1/5) resulta que (z , u ) es el optimo de
min z
z + cu = z0
Au + Iv = b
u, v 0
1
min x1 + x2 + 3x3 x4
2
x1 +x2 x4 = 1
x2 +2x3 + 2x4 = 2
2x1 +x2 4x3 4x4 = 0
x0
FASE 1
1 0 0 0 0 1 1 1 | 0
5 0 1 1 0 1 1 0 0 | 1
6 0 0 1 2 2 0 1 0 | 2
7 0 2 1 4 4 0 0 1 | 0
F0 = F0 (F1 + F2 + F3 )
1 3 3 2 3 0 0 0 | 3
5 0 1 1 0 1 1 0 0 | 1
6 0 0 1 2 2 0 1 0 | 2
7 0 2 1 4 4 0 0 1 | 0
F0 = F0 + 3F3 , F1 = F1 F3 , F2 = F2 F3 , F3 = F3
38 Optimizaci
on Combinatoria
1 3 0 10 9 0 0 3 | 3
5 0 1 0 4 3 1 0 1 | 1
6 0 2 0 6 6 0 1 1 | 2
2 0 2 1 4 4 0 0 1 | 0
F0 = F0 + 3F1 , F1 = 31 F1 , F2 = F2 2F1 , F3 = F3 + 34 F1
1 0 0 2 0 3 0 0 | 0
4 0 1/3 0 4/3 1 1/3 0 1/3 | 1/3
6 0 0 0 2 0 2 1 1 | 0
2 0 2/3 1 4/3 0 4/3 0 1/3 | 4/3
FASE 2:
1 0 0 2 0 3 0 0 | 0
1 1 1/2 3 1 0 0 0 | 0
4 0 1/3 0 4/3 1 1/3 0 1/3 | 1/3
6 0 0 0 2 0 2 1 1 | 0
2 0 2/3 1 4/3 0 4/3 0 1/3 | 4/3
Suprimimos la columna 3 pues d3 > 0 y las columnas 5 y 7 por ser las columnas no unitarias de I y
eliminamos la primera fila obteniendo
1 1 1/2 1 0 | 0
0 1/3 0 1 0 | 1/3
0 0 0 0 1 | 0
0 2/3 1 0 0 | 4/3
Este tableau satisface i) y iii) pero no ii). Por lo tanto hacemos la transformacion de filas
min z
1
z x1 + x2 + 3x3 x4 = 0
2
x1 +x2 x4 = 1
x2 +2x3 + 2x4 = 2
2x1 +x2 4x3 4x4 = 0
x0
Programaci
on lineal 39
1
min x1 + x2 + 3x3 x4
2
x1 +x2 x4 = 1
x2 +2x3 + 2x4 = 2
2x1 + x2 4x3 4x4 = 0
x0
9. El algoritmo dual.
1 c | z0
Dado un tableau en forma can
onica , con b 0, veamos que sucede cuando le aplicamos
0 A | b
el algoritmo simplex.
1 c | z 0
Supongamos que es el tableau obtenido en alguna iteracion del algoritmo. Entonces
0 A | b
1 c | z 0 1 c | z0
existe una matriz inversible U IR(m+1)(m+1) tal que = U. . Si
0 A | b 0 A | b
U = ||uij || 0im entonces
0jm
u00 u01 ... u0m 1 c1 ... cn 1 c1 ... cn
u10 u11 ... u1m 0 a11 ... a1m 0 a11 ... a1m
. .. .. . . .. .. =. .. ..
.. . . .. . . .. . .
um0 um1 . . . umm 0 am1 . . . amm 0 am1 . . . amm
u11 ... u1m
.. ..
Luego, u00 = 1, u10 = 0, ... , um0 = 0. Tomando y = (u01 , . . . , u0m ) y U = . . resulta
um1 . . . umm
1 y
que U = , por lo tanto c = c y.A y z 0 = z0 y.b. El vector c se llama vector de costos
0 U
originales y el vextor c vector de costos reducidos. Ademas, si i1 , . . . , im son las columnas unitarias de A
entonces ci1 = 0, . . ., cim = 0. Luego, el vector x definido por
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
1 c z z 0
satisface A.x = b, x 0 y c.x = 0, de donde (z 0 , x) es una soluci
on del sistema . = .
0 A x b
1 c z z0
Luego, (z 0 , x) es soluci
on del sistema equivalente . = . Por lo tanto z 0 +c.x = z0
0 A x b
y Ax = b.
40 Optimizaci
on Combinatoria
min cx max yb
Ax = b (P ) yA c (D )
x0
Entonces, en cada iteracion del algoritmo tenemos dos vectores x IRn e y IRm , donde x es una soluci
on
factible de (P), que satisfacen c.x = z 0 z0 , y.b = c.x y c = c y.A.
1 c | z0
Notemos que el tableau inicial es el tableau correspondiente al problema
0 A | b
min z
z+cx = z0
Ax = b
x0
onica y tal que c 0, y hacemos una transformacion con el pivote elegido para que el
que esta en forma can
nuevo tableau (que estara en forma can onica)
1 c | z0
0 A | b
satisfaga c 0 y z0 z0 . Sea
1 c | z 0
0 A | b
el tableau obtenido luego de varias iteraciones a partir del tableau inicial
1 c | z0
0 A | b
Entonces, tomando y como antes, se tiene que c = c y.A y z 0 = z0 y.b. Como c 0 entonces
y es una
1 c | z 0
soluci
on factible de (D). Sea x la soluci
on b
asica correspondiente al tableau , es decir, la
0 A | b
definida por
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
donde i1 , . . . , im son las columnas unitarias de A. Entonces x satisface A.x = b y c.x = 0, de donde A.x = b
y c.x = z 0 z0 = y.b. Ademas, x 0 si y solo si b 0. Luego, cuando sea b 0 entonces x sera una soluci on
factible de (P) y como y es una soluci on factible de (D) y vale c.x = y.b entonces x sera una soluci
on optima
de (P) e y una soluci on optima de (D).
En resumen, en cada iteracion de este algoritmo obtendremos una soluci on factible y de (D), tal que el
valor del funcional en ella sea mayor o igual que el valor del funcional en la soluci
on obtenida en la iteraci
on
anterior, y un vector x que satisface A.x = b y c.x = y.b. El optimo de (P) y de (D) se alcanza cuando x
on factible de (P), es decir, cuando b 0.
es una soluci
Descripci
on del algoritmo dual
onica y satisfaga c 0.
y que este en forma can
Si b 0 entonces este es el tableau correspondiente al optimo y el algoritmo termina. En caso contrario,
br < 0 para alg un r. Entonces elegimos como fila del pivote la fila r. Ahora veamos como elegimos la
columna s del pivote.
1 c | z 0
Si haciendo una transformacion con pivote en ars obtenemos el tableau , queremos que
0 A | b
c c cs
valgan c 0 y z 0 z0 . Como cj = cj as arj y z 0 = z0 as br entonces debe ser cj ars arj para todo
rs rs
c cs
j y as br 0. Luego deben valer ars < 0 y cj ars arj para todo j tal que arj < 0, pues cs 0, br < 0 y
rs
ars 6= 0. Por lo tanto s debe elegirse tal que
( )
cs cj
= max / arj < 0
ars arj
Si no existe j tal que arj < 0 entonces (P) no tiene ninguna solucion factible y en ese caso el algoritmo
on factible de (P) entonces x 0 y A.x = b, de donde A .x = b y
termina. En efecto, si x fuese una soluci
42 Optimizaci
on Combinatoria
x 0. Luego, ar1 x1 + + arn xn = br , lo que no puede ocurrir pues br < 0, arj 0 para todo j y x 0.
Dejamos a cargo del lector mostrar que si (P) no tiene soluciones factibles entonces (D) no tiene ninguna
soluci
on optima.
y hacemos una transformacion con pivote en a23 . Las operaciones de fila son:
F0 = F0 + 1/3F2
F1 = F1 + 2/3F2
F2 = 1/3F2
Luego
1 0 3 1 0 | 0 1 1/3 10/3 0 0 | 2/3
4 0 0 1 2 1 | 1 4 0 2/3 1/3 0 1 | 7/3
1 0 1 1 3 0 | 2 3 0 1/3 1/3 1 0 | 2/3
Ahora elegimos r = 1 pues b1 < 0 y s = 2 ya que
c2 cj
= max / a1j < 0
a12 a1j
y hacemos una transformacion con pivote en a12 . Las operaciones de fila son:
F0 = F0 + 10F1
F1 = (3)F1
F2 = F2 F1
y se tiene
1 1/3 10/3 0 0 | 2/3 1 7 0 0 10 | 24
4 0 2/3 1/3 0 1 | 7/3 2 0 2 1 0 3 | 7
3 0 1/3 1/3 1 0 | 2/3 3 0 1 0 1 1 | 3
min cx
Ax b
x0
donde c 0.
Observando que, agregando variables de holgura, este problema es equivalente a
min cx
Ax + Is = b
x, s 0
min cx
Ax b
x0
Si b 0 se puede iniciar el algoritmo simplex con este tableau. Si c 0, el dual. Si no pasa ninguna de estas
cosas, supongamos que las xj se pueden acotar (esto, en los problemas reales, siempre es posible). Entonces
agregamos la condici on x1 + + xn b0 . Con la correspondiente variable de holgura el tableau ser
a
1 c 0 0m | 0
0 1 1 0m | b0 = 1 c 0m+1 | 0
0 A Im+1 | b
0 A 0 Im | b
Sea cs la mnima componente de c. Luego cs < 0. Ahora hacemos una transformacion con pivote en la fila
uno, columna s. As obtenemos un nuevo sistema que es can onico pues resulto de aplicar una transformaci on
pivote a un sistema que era can onico.
La nueva fila cero sera F0 = F0 cs F1 = (1, c1 cs , . . . , cs cs , . . . , cn cs , cs , 0, . . . , 0, cs b0 ).
Como cs era la mnima componente de c y cs < 0 entonces todos los coeficientes de la nueva fila cero son no
negativos y por lo tanto estamos en condiciones de aplicar el algoritmo dual.
Ejemplo 9.4. Agregar una restriccion.
Supongamos que hemos resuelto un problema de programacion lineal. Haciendo un cambio de variables si
es necesario, podemos suponer que el tableau que da el optimo es
1 c 0m | z0
0 A Im | b
44 Optimizaci
on Combinatoria
d1 x1 + + dn xn b0
Fm+1 = Fm+1 g1 F1 gm Fm
Este algoritmo tiene 2n pasos, guarda en la memoria el valor de 2n variables y realiza 2n operaciones.
En cambio el algoritmo
1. x = 5
2. x = x2
3. Repetir n 1 veces el paso 2.
requiere de poca memoria (solo guarda el u ltimo valor de x), hace n operaciones y termina en n pasos. Este
algoritmo es, por lo tanto, mas eficiente que el anterior.
En el caso del simplex, la matriz A del tableau es de m n donde, en general, m es del orden de los cientos
y n del orden de las decenas de mil. Por lo tanto, nos convendra que la cantidad de pasos, la cantidad de
espacio en memoria requerido y la cantidad de operaciones tuviesen cotas que dependieran de m en lugar de
n y que estas cotas fuesen lo mas chicas que fuera posible.
Lo que haremos es revisar el algoritmo en detalle, eliminando todo calculo que no sea indispensable y s olo
conservando en la memoria la informacion que sea estrictamente necesaria. De esta manera ahorraremos
tiempo y espacio.
Programaci
on lineal 45
Tambien aqu llamamos columna cero a la primera columna de la izquierda y fila cero a la primera fila de
arriba.
Como s se elige tal que cs < 0, necesitamos conocer c. Una vez elegido s, para elegir r necesitamos conocer
b y la columna s de A pues r se elige tal que
br bi
= min / ais > 0
ars ais
Observemos que para calcular la matriz Pk+1 no se necesitan conocer todos los coeficientes de la matriz Tk
sino que solo se necesitan los datos F0 (k), Cs (k) y B(k). Luego, conociendo F0 (k), Cs (k), B(k) e I(k) se
puede calcular Tk+1 .
46 Optimizaci
on Combinatoria
Sea Ek+1 = Pk+1 . . . P1 . Entonces Ek+1 = Pk+1 .Ek y ademas Ek+1 .T0 = Tk+1 . Luego Ek+1 es la matriz
que multiplicada a izquierda por el tableau inicial nos da el tableau del paso k + 1. Ademas, conociendo Ek
podemos calcular la fila cero F0 (k) de Tk = Ek .T0 , la columna s Cs (k) y tambien la columna B(k). Esto
significa que no es necesario guardar el tableau del paso k, solo necesitamos conocer Ek y el vector I(k).
Observaci on 10.1 Para todo k, la columna cero de Ek es el vector e1 . En efecto, como el pivote nunca se
elige en la fila cero entonces la columna cero de Pk siempre es el vector e1 . Pero el producto de dos matrices
cuya primera columna de la izquierda es el vector e1 es una matriz del mismo tipo. Luego, la columna cero
de Ek es el vector e1 como queramos ver.
Descripci
on del algoritmo simplex revisado.
Sea T0 el tableau inicial que esta en forma can
onica y tal que b 0.
1. Ponemos I = I(0), E = I, k = 0
2. Calculamos F0 (k) y B(k) como la fila cero y la u ltima columna de E.T0 respectivamente.
3. Elegimos s. Si no es posible, stop (la presente solucion es optima).
4. Calculamos Cs (k) = columna s de E.T0 .
5. Determinamos r. Si no es posible, stop (no existe soluci on optima).
6. Calculamos la matriz Pk+1 que corresponde a nuestra eleccion de r y s, Ek+1 = Pk+1 .E y calculamos
tambien I(k + 1) a partir de I y de r y s.
7. Ponemos E = Ek+1 , I = I(k + 1), k = k + 1
8. Ir a 2.
Luego,
1 1 0 0 0
0 0
. .
Ek . . .
. Ci1 (T0 ) Cim (T0 ) = . e1 e2 em
=
0 0
0 0
1 0 0 0
0 1 0 0
. .. .
=
.
. . .. = Im+1
0 0 1 0
0 0 0 1
Programaci
on lineal 47
Por lo tanto 1
1
0
.
Ek =
.. C (T ) C (T )
i1 0 im 0
0
0
puede calcularse conociendo I(k) = (i1 , . . . , im ) como la inversa de la matriz cuya columna cero es (1, 0, . . . , 0)
y las restantes columnas son las columnas i1 , . . . , im del tableau inicial.
on 10.3. Si
Observaci
1 c | z0 1 c | z 0
T0 = y Tk =
0 A | b 0 A | b
son el tableau inicial y el tableau del paso k respectivamente y si I(k) = (i1 , . . . , im ) entonces
1 y
Ek =
0 B 1
max yb
y.A c
pues E es la matriz que multiplicada a izquierda por T0 da el tableau correspondiente al optimo (ver 9.) y
valen y = cB .B 1 y U = B 1 , donde cB = (ci1 , . . . , cim ) y B es la submatriz de A formada por las columnas
i1 , . . . , im de A, siendo (i1 , . . . , im ) el valor de I presente en ese momento.
cantidad de soluciones b asicas es finita. Luego, si en cada paso se redujera estrictamente el valor del
funcional entonces todas las soluciones b asicas que se fueran obteniendo seran distintas. Esto asegurara
que el algoritmo termina en un n umero finito de pasos. Veamos que pasara si el valor de z0 no cambiara en
una iteracion. Si z 0 fue obtenido haciendo una transformacion con pivote en ars entonces
cs
z0 = z0 br
ars
br
bt = bt ats =0
ars
de donde Th = Eh .T0 = Eh+k .T0 = Th+k y por lo tanto el tableau se repite cada k iteraciones.
Ejemplo 11.1. Consideremos el problema
3 1
min x1 + 150x2 x3 + 6x4
4 50
1 1
x1 60x2 x3 + 9x4 + x5 = 0
4 25
1 1
x1 90x2 x3 + 3x4 + x6 = 0
2 50
x3 + x7 = 1
x0
Usando como criterio elegir el menor r cuando hay empate resulta que, a partir de un cierto paso, I toma
los valores
es la submatriz de A formada por las columnas i1 , . . . , im . El mnimo se toma con respecto al orden lexi-
cografico.
Observemos que si l 6= r entonces a1rs (br , r1 , . . . , rm ) 6= a1ls (bl , l1 , . . . , lm ). En efecto, si ocurriera que
1 1 1
ars (br , r1 , . . . , rm ) = als (bl , l1 , . . . , lm ) entonces B tendra dos filas linealmente dependientes.
Observemos ademas que si elegimos r de esa manera entonces
br bl
= min / als > 0
ars als
Sea B la submatriz de A formada por las columnas (i1 , . . . , im ) = I(h) y sea B la formada por las columnas
(i1 , . . . , im ) = I(h + 1). Entonces
cs
z0 = z0 br
ars
cs
y = y (r1 , . . . , rm )
ars
50 Optimizaci
on Combinatoria
ya que
1 y 1 y
1 = Eh+1 = Urs .Eh = Urs .
0 B 0 B 1
y Th+1 = Urs .Th (ver seccion 10.). Luego,
cs
(z 0 , y) = (z0 , y) (br , r1 , . . . , rm )
ars
y como c
ars > 0, bastar
s
a probar que (br , r1 , . . . , rm ) > (0, . . . , 0) (con respecto al orden lexicogr
afico).
Probaremos que para todo paso k y para todo j vale (bj , j1 , . . . , jm ) > (0, . . . , 0) por inducci on en k.
Si k = 0 vale pues bj 0 j y Ek = E0 = Im+1 , de donde B 1 = Im y por lo tanto (j1 , . . . , jm ) = ej .
Supongamos que vale para k. Como antes, notemos con barra los valores correspondientes al paso k + 1 y
sin barra los correspondientes al paso k. Si ars es el pivote que da el paso k + 1 entonces
1
ars (br , r1 , . . . , rm ) si j = r
(bj , j1 , . . . , jm ) =
(b , , . . . , ) ajs (b , , . . . , ) si no
j j1 jm ars r r1 rm
pues
1 y 1 y
1 = Ek+1 = Urs .Ek = Urs .
0 B 0 B 1
Como ars > 0 y como (bj , j1 , . . . , jm ) > (0, . . . , 0) j entonces (bj , j1 , . . . , jm ) > (0, . . . , 0) si j = r.
Lo mismo ocurre para j tal que j 6= r y ajs 0.
Finalmente, si j 6= r y ajs > 0, por la forma en que elegimos r resulta que
1 1
(br , r1 , . . . , rm ) (bj , j1 , . . . , jm )
ars ajs
Pero ya vimos antes que nunca vale la igualdad y como ajs > 0 entonces
ajs
(br , r1 , . . . , rm ) < (bj , j1 , . . . , jm )
ars
de donde (bj , j1 , . . . , jm ) > (0, . . . , 0).
Hemos probado que el vector (z0 , y) crece estrictamente en el orden lexicogr afico en cada iteracion del
algoritmo. Veamos ahora que si k 6= k entonces I(k) 6= I(k ). Supongamos que k 6= k .
Si fuese I(k) = I(k ) entonces Ek = Ek (pues Ek solo depende de I(k): si I(k) = (i1 , . . . , im ) entonces
Ek = (e1 , Ci1 (T0 ), , Cim (T0 ))1 ). Indicando con barra los valores correspondientes al paso k y sin barra
los correspondientes al paso k resulta que z 0 = z0 pues Tk = Ek .T0 = Ek .T0 = Tk y que y = y pues
1 y 1 y
1 = Ek = Ek =
0 B 0 B 1
Luego, (z 0 , y) = (z0 , y), cosa que contradice lo que probamos antes.
An
alisis de sensibilidad.
Supongamos que lo hemos resuelto y queremos ahora resolver el mismo problema para otro valor de b,
digamos b . Consideremos los tableau iniciales
1 c | z0 1 c | z0
T0 = y T0 =
0 A | b 0 A | b
Luego,
1 c | z 0
Ek .T0 =
0 A | b
con c 0. Si b 0 entonces hemos encontrado el optimo de
min z
z + cx = z0
Ax = b
x0
Intervalo de factibilidad de bl .
Sea bl una componente de b y sea B = {Ci1 (A), , Cim (A)} la base para la cual se obtuvo el optimo en el
paso k. Nos preguntamos dentro de que intervalo puede variar bl sin cambiar la base B.
Cambiemos bl por bl + y sea b = (b1 , . . . , bl1 , bl + , bl+1 , . . . , bm ). Si
1 y
Ek = , B 1 = ||ij ||
0 B 1
1 c | z0 1 c | z0
T0 = y T0 =
0 A | b 0 A | b
entonces
Ek = (e1 , Ci1 (T0 ), . . . , Cim (T0 ))1 = (e1 , Ci1 (T0 ), . . . , Cim (T0 ))1 = Ek
52 Optimizaci
on Combinatoria
Luego,
1 y 1 c | z0 1 c | z 0
Tk = Ek .T0 = . =
0 B 1 0 A | b 0 A | b
y
1 y 1 c | z0
Tk = Ek .T0 = Ek .T0 =
0 B 1 0 A | b
Luego, la base B sera la misma si
Intervalo de factibilidad de cl .
Sea cl una componente de c y sea B = {Ci1 (A), , Cim (A)} la base para la cual se obtuvo el optimo en el
paso k. Ahora nos preguntamos dentro de que intervalo puede variar cl sin cambiar la base B.
Cambiemos cl por cl + . Si
1 y
Ek = , B 1 = ||ij ||
0 B 1
y
1 c | z0 1 c | z 0
Tk = Ek .T0 = Ek . =
0 A | b 0 A | b
entonces, por la observaci on 10.3. se tiene que y = cB .B 1 , donde cB = (ci1 , . . . , cim ) y c = c yA. Luego,
cj = cj (yA)j . Pero c 0 y cj = 0 para j = i1 , . . . , im , es decir, cj (yA)j j y cj = (yA)j para
j = i1 , . . . , im .
Sea c = (c1 , . . . , cl1 , cl + , cl+1 , . . . , cn ). Como
1 y 1 c | z0
Ek = y T0 =
0 B 1 0 A | b
y = cB .B 1 = (cB + er )B 1 = cB B 1 + er B 1 = cB B 1 + Fr (B 1 )
c = c y A = c + el [y + .Fir (B 1 )].A =
= c yA + el .Fir (B 1 ).A =
= c + el .Fir (B 1 .A) =
= c + el .Fir (A) =
= c + el .(air 1 , . . . , air n )
Por lo tanto cj 0 para todo j 6= i1 , . . . , im sii (como l = ir ) cj .air j 0 para todo j 6= i1 , . . . , im sii
cj cj
max / air j < 0 min / air j > 0
air j air j
para todo j 6= i1 , . . . , im , donde ||aij || = A = B 1 .A.
Tiempo de ejecuci
on del algoritmo.
Si bien en la pr
actica el tiempo de ejecucion del algoritmo es bueno, en teora no lo es ya que podramos
tener que hacer 2m pasos.
Ejemplo 12.1. (Klee-Minty) Consideremos el problema
m
X
max 10mj xj
j=1
x1 1
i1
X
2 10ij xj + xi 100i1 (2 i m)
j=1
x0
que tiene m ecuaciones y m incognitas. Para poder aplicar el algoritmo planteamos el problema en forma
standard, obteniendo el problema equivalente
m
X
min 10mj xj
j=1
x1 + s1 = 1
i1
X
2 10ij xj + xi + si = 100i1 (2 i m)
j=1
x, s 0
54 Optimizaci
on Combinatoria
Captulo 2
Grafos y algoritmos
1. Conceptos b
asicos de la teora de grafos.
En este captulo veremos algoritmos para resolver algunos problemas de optimizacion en la teora de grafos.
Comencemos por dar algunas definiciones que necesitaremos luego.
Definici on 1.1. Un grafo es un par (V, E) donde V es un conjunto finito y los elementos de E son pares
de elementos distintos de V . Llamaremos vertices o nodos a los elementos de V y ramas, arcos o tambien
flechas a los elementos de E.
Cuando nos importe el orden en las ramas, los elementos de E seran pares ordenados y diremos que el grafo
es dirigido. Cuando no nos importe el orden, los elementos de E seran pares no ordenados y diremos que el
grafo es no dirigido. En ambos casos usaremos la notacion (v, w) para indicar una rama con la convencion
de que si el grafo es dirigido nos estamos refiriendo al par ordenado (en cuyo caso (v, w) y (w, v) denotan
ramas distintas) y si es no dirigido nos estamos refiriendo al par no ordenado (en cuyo caso (v, w) y (w, v)
denotan la misma rama).
Definicion 1.2. Sea G = (V, E) un grafo. Dados v, w V diremos que una sucesion C = (e1 , . . . , en ) de
elementos de E es un camino en G de v a w si e1 = (v, w) o e1 = (w, v) cuando n = 1, o si ei 6= ei+1
para todo 1 i n 1 y existen v1 , . . . vn1 V tales que e1 = (v, v1 ) o e1 = (v1 , v), en = (vn1 , w) o
en = (w, vn1 ) y ei = (vi1 , vi ) o ei = (vi , vi1 ) para todo i tal que 2 i n 1 cuando n > 1. En tal caso
diremos que v, v1 , . . . , vn1 y w son los vertices del camino C.
Si v, v1 , . . . , vn1 y w son todos distintos diremos que el camino es simple. Si v = w y v, v1 , . . . , vn1 son
todos distintos diremos que el camino es un ciclo o tambien que es un circuito.
Cuando el grafo es dirigido y e1 = (v, v1 ), en = (vn1 , w) y ei = (vi1 , vi ) para todo i tal que 2 i n 1
si n > 1, o cuando e1 = (v, w) si n = 1 diremos que C es un camino dirigido de v a w. Es decir, en un
grafo dirigido tenemos los conceptos de camino y camino dirigido. Analogamente se definen los conceptos
de camino dirigido simple y ciclo dirigido.
Diremos que un grafo G es acclico si no existe ning
un ciclo (dirigido o no) en G.
Definicion 1.3. Diremos que un grafo G = (V, E) es conexo si para todo par de vertices u, v V , u 6= v,
existe un camino en G de u a v.
Diremos que el grafo es fuertemente conexo si para todo par de vertices u, v V , u 6= v, existe un camino
dirigido en G de u a v. Observemos que este concepto solo tiene sentido en el caso de un grafo dirigido.
Definicion 1.4. Un grafo G = (V, E) se dice completo si para todo par de vertices u, v V , u 6= v, vale que
(u, v) E.
Observaci
on 1.5. Si G = (V, E) es un grafo completo y m = #V entonces
m m(m1)
2 = 2 si G es no dirigido
#E =
m
2 .2! = m(m 1) si G es dirigido
e1
e3
1
3
e4
e5
e2
5 e6
4
Este es un grafo dirigido, conexo, pero no fuertemente conexo (no hay un camino dirigido de 2 a 3).
La sucesion (e1 , e3 ) es un camino simple de 2 a 3. Este camino no es dirigido. El grafo no es acclico: la
sucesion (e5 , e6 , e2 , e3 ) es un ciclo. Este ciclo no es un ciclo dirigido.
La sucesion (e4 , e5 , e6 ) es un camino dirigido simple de 3 a 4. La sucesion (e3 , e4 ) es un ciclo dirigido. La
sucesion (e1 , e4 , e2 , e6 , e5 ) es un camino de 2 a 1. Este camino no es dirigido ni simple.
El grafo no es completo: (2, 1)
/ E.
Ejemplo 1.7. Consideremos el grafo no dirigido G = (V, E), con vertices 1, 2, 3, 4, 5 y 6 y ramas e1 = (1, 4),
e2 = (1, 2), e3 = (2, 5), e4 = (1, 3) y e5 = (5, 6) V = {1, 2, 3, 4, 5, 6} y E = {(1, 4), (1, 2), (2, 5), (1, 3), (5, 6)},
al que representaremos graficamente en la forma
2
e2
1
e4
3
e3
e1
5
e5
4
6
2
5
1 4
7
Este es un grafo no dirigido. No es conexo (no existe ning un camino que una 1 y 7) sino que tiene dos
componentes conexas, una conteniendo un ciclo (el ciclo (1, 2), (2, 4), (4, 1)) y otra acclica.
Definici
on 1.9 Diremos que G = (V, E) es un grafo bipartito si existen dos conjuntos disjuntos P y Q tales
que V = P Q y toda rama e E tiene un extremo en P y el otro extremo en Q.
Grafos y algoritmos 57
h1 m1
m 2
h2
m 3
h3 m4
m5
h4
m6
h5
m7
e
e1 5
e e4
v1 3
v4
e2
e6
v2
2. Forestas,
arboles y hojas.
Definici
on 2.1. Una foresta es un grafo acclico. Un
arbol es un grafo acclico conexo, es decir, una
componente conexa de una foresta.
58 Optimizaci
on Combinatoria
Definici
on 2.2. Sea G = (V, E) un grafo y sea u V . Definimos
Definicion 2.3. Sea G = (V, E) un arbol. Diremos que u V es una hoja sii deg (u) 1, es decir, una
hoja es un vertice en el que incide a lo sumo una rama.
Observacion 2.4. Si G es un arbol con un u nico vertice (y ninguna rama) entonces ese vertice es una hoja.
En cualquier otro caso, un arbol siempre tiene por lo menos dos hojas.
es una foresta compuesta por cuatro arboles. El primero tiene cuatro hojas, el segundo seis, el tercero una
y el cuarto cinco.
es una foresta compuesta por tres arboles con dos, cinco y siete hojas cada uno respectivamente.
Definici
on 2.7. Un
arbol binario es un arbol dirigido G = (V, E) tal que o(u) = 2 para todo u V que no
sea una hoja.
Proposici
on 2.9. Si un arbol tiene n ramas entonces tiene n + 1 vertices.
Demostraci on: Por induccion en n.
El caso n = 1 es trivial. Supongamos que la proposicion vale para todo arbol con n ramas y sea G un
arbol con n + 1 ramas. Sea u una hoja de G y sea e la u nica rama de G que incide en u (es decir,
e = (w, u) E si i(u) = 1 y {v V / (v, u) E} = {(w, u)} o bien e = (u, w) E si o(u) = 1 y
{v V / (u, v) E} = {(u, w)}. Sea G0 = (V 0 , E 0 ), donde V 0 = V {u} y E 0 = E {e}. Entonces G0 es un
arbol con n ramas. Luego, por hipotesis inductiva, #V 0 = n + 1, de donde #V = n + 2.
Proposici
on 2.10. Si G es un grafo conexo con m vertices y m 1 ramas entonces G es un arbol.
Demostraci on: Solo debemos ver que G es acclico.
Supongamos que G tuviera un ciclo. Entonces, como se ve en el dibujo, podramos quitar una rama e1 del
ciclo de manera que G0 = (V, E {e1 }) siguiera siendo conexo y tuviera un ciclo menos que G.
e1
Si G0 no fuera acclico podramos repetir el procedimiento. As siguiendo, luego de quitar r ramas obtenemos
un grafo conexo y acclico (V, E {e1 , . . . , er }). Pero este arbol tendra m vertices y m 1 r < m 1
ramas. Absurdo, pues esto contradice la proposicion 2.9.
3. Grafos planares.
Definicion 3.1. Un grafo no dirigido G se dice planar si se lo puede representar en el plano de manera tal
que sus ramas solo se corten en los vertices.
60 Optimizaci
on Combinatoria
Un grafo planar divide al plano en regiones conexas a las que llamaremos caras. Dado un grafo planar,
siempre una de sus caras es no acotada.
Ejemplo 3.4. El grafo
R1
R3 R R 4
2
En cambio, en un grafo planar las ramas son relativamente escasas como lo muestra la siguiente proposicion.
Proposici
on 3.7. Un grafo planar conexo con m 3 vertices tiene a lo sumo 3(m-2) ramas.
Demostraci on: Cada cara del grafo esta delimitada por un circuito que tiene por lo menos tres ramas
(salvo el caso #E = 2 en cuyo caso debe ser m = 3 y vale trivialmente lo que queremos probar).
Para cada cara Ri sea xi la cantidad de ramas que son un borde de Ri . Entonces
#F
X
xi 3#F
i=1
Por otra parte, como cada rama es el borde de a lo sumo dos caras entonces
#F
X
xi 2#E
i=1
Luego, 2#E 3#F . Ahora, aplicando el teorema 3.6. de Euler, se tiene que
4. Buscando un camino.
Dado un grafo G = (V, E) y dado un vertice s de G, vamos a describir un algoritmo que, para cada t V
tal que t 6= s, encuentra (cuando existe) un camino en G de s a t. Describiremos dos maneras de hacer esto,
62 Optimizaci
on Combinatoria
llamadas breadth-first search y depth-first search. Para poder aplicar estos algoritmos necesitaremos conocer
cierta informacion sobre el grafo dada en lo que llamaremos la tabla de adyacencia de G.
Definicion 4.1. Sea G = (V, E) un grafo. Dados u, v V diremos que u y v son adyacentes si (u, v) E o
(v, u) E.
Dado un grafo G = (V, E), la tabla de adyacencia de G es una tabla que contiene, para cada vertice u, el
conjunto A(u) = {v V / u y v son adyacentes }.
v3
e
e1 5
e e
4
v1 3
v4
e2
e6
v2
es la tabla
u A(u)
v1 v3 , v2
v2 v1 , v3 , v4
v3 v1 , v2 , v4
v4 v2 , v3
Al terminar el algoritmo se tiene un subconjunto de vertices que estan marcados. Dado t 6= s se verifica
que existe un camino de s a t si y solo si t esta marcado y en tal caso, p(t) es el nodo anteriror a t en ese
camino. De esta manera, el camino a t hallado por el algoritmo puede reconstrurse usando el predecesor
p(v) de cada nodo v de ese camino.
El criterio usado para extraer cada vertice u de Q en este algoritmo es first in, first out. En este caso
decimos que Q es una cola (queue) y la b usqueda se denomina breadth-first search. Si, en cambio, utilizamos
el criterio last in, first out para extraer los elementos de Q entonces la b
usqueda se llama depth-first search
y Q se dice una pila (stack). Es decir, el algoritmo depth-first search resulta de cambiar en el algoritmo
anterior el paso 3. por
3. Si u Q es, de todos los elementos de el u
ltimo que ingreso a Q, Q = Q {u}.
Observaci on 4.3. El grafo G puede ser dirigido o no dirigido. Si el grafo es dirigido el camino no necesa-
riamente es dirigido. Si quisieramos resolver el problema de determinar (cuando existe) un camino dirigido
Grafos y algoritmos 63
de s a t deberemos utilizar, en lugar de la tabla de adyacencia, una tabla que contenga, para cada vertice u,
el conjunto
A0 (u) = {v V / (u, v) E}
Dejamos a cargo del lector verificar que, en ambos casos, los caminos hallados por el algoritmo search son
simples.
A continuacion aplicaremos estos algoritmos en un par de ejemplos. En el primer caso aplicaremos el
algoritmo breadth-first search a un grafo no dirigido y usaremos la tabla de adyacencia del grafo para
encontrar, fijado un vertice s, un camino de s a t, para aquellos t tales que existe un tal camino. En el segundo,
aplicaremos el algoritmo depth-first search a un grafo dirigido y encontraremos, para un determinado s, un
camino dirigido de s a t, para aquellos t tales que existe un tal camino. En este caso usaremos, en lugar de
la tabla de adyacencia, la tabla que contiene, para cada u, el conjunto A0 (u).
1
4 8
2 3
10
5 7
6
9
su tabla de adyacencia es
u A(u)
1 2, 3, 4
2 1, 5
3 1, 6
4 1, 7
5 2, 6
6 3, 5
7 4
8 9, 10
9 8
10 8
Sea s = 1. Determinaremos, usando breadth-first search, para cuales t existe un camino de s a t. Recons-
truiremos ese camino para uno de esos valores de t y dejaremos a cargo del lector la reconstruccion de los
caminos a los restantes t hallados.
1. V = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2. V = {1 , 2, 3, 4, 5, 6, 7, 8, 9, 10}, Q = {1}, p = (p(1), p(2), . . . , p(10)) = (1, 1, . . . , 1)
Primera iteracion
3. u = 1, Q = Q {1} =
4. A(u) = {2, 3, 4}, marcamos 2, 3 y 4, los agregamos a la cola y reemplazamos p(2), p(3) y p(4) por 1. El
estado actual de la lista y de la cola es
V = {1 , 2 , 3 , 4 , 5, 6, 7, 8, 9, 10} y Q = {2, 3, 4}.
El valor actual del vector p es (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
5. Q 6=
64 Optimizaci
on Combinatoria
6. volvemos a 3.
Segunda iteracion
3. u = 2, Q = Q {2} = {3, 4}
4. A(u) = {1, 5}, marcamos el 5, lo agregamos a la cola y reemplazamos p(5) por 2. El estado actual de la
lista y de la cola es V = {1 , 2 , 3 , 4 , 5 , 6, 7, 8, 9, 10} y Q = {3, 4, 5}.
El valor actual del vector p es (1, 1, 1, 1, 2, 1, 1, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Tercera iteracion
3. u = 3, Q = Q {3} = {4, 5}
4. A(u) = {1, 6}, marcamos el 6, lo agregamos a la cola y reemplazamos p(6) por 3. El estado actual de la
lista y de la cola es V = {1 , 2 , 3 , 4 , 5 , 6 , 7, 8, 9, 10} y Q = {4, 5, 6}.
El valor actual del vector p es (1, 1, 1, 1, 2, 3, 1, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Cuarta iteracion
3. u = 4, Q = Q {4} = {5, 6}
4. A(u) = {1, 7}, marcamos el 7, lo agregamos a la cola y reemplazamos p(7) por 4. El estado actual de la
lista y de la cola es
V = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8, 9, 10} y Q = {5, 6, 7}.
El valor actual del vector p es (1, 1, 1, 1, 2, 3, 4, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Quinta iteracion
3. u = 5, Q = Q {5} = {6, 7}
4. A(u) = {2, 6}, no marcamos ning un vertice porque el 2 y el 6 ya estan marcados. El estado actual de la
lista y de la cola es
V = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8, 9, 10} y Q = {6, 7}.
El valor actual del vector p es (1, 1, 1, 1, 2, 3, 4, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Sexta iteracion
3. u = 6, Q = Q {6} = {7}
4. A(u) = {3, 5}, no marcamos ning un vertice porque el 3 y el 5 ya estan marcados. El estado actual de la
lista y de la cola es
V = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8, 9, 10} y Q = {7}.
El valor actual del vector p es (1, 1, 1, 1, 2, 3, 4, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Septima iteracion
3. u = 7, Q = Q {7} =
4. A(u) = {4}, no marcamos ning un vertice porque el 4 ya esta marcado. El estado actual de la lista y de
la cola es
V = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8, 9, 10} y Q = .
Grafos y algoritmos 65
Dejamos a cargo del lector la reconstruccion de los caminos a los restantes t hallados.
Ejemplo 4.5. Dado el grafo dirigido
2
6
1
4
construyamos la tabla
u A0 (u)
1 2
2 5, 6
3 7
4 5, 7
5 3
6 3
7 2
Sea s = 1. Determinaremos, usando depdth-first search, para cuales t existe un camino dirigido de s a t.
Reconstruiremos ese camino para uno de esos valores de t y dejaremos a cargo del lector la reconstruccion
de los caminos a los restantes t hallados.
1. V = {1, 2, 3, 4, 5, 6, 7}
2. V = {1 , 2, 3, 4, 5, 6, 7}, Q = {1}, p = (p(1), p(2), . . . , p(7)) = (1, 1, . . . , 1)
Primera iteracion
3. u = 1, Q = Q {1} =
4. A0 (u) = {2}, marcamos 2, lo ponemos en la pila y reemplazamos p(2) por 1. El estado actual de la lista
y de la pila es
V = {1 , 2 , 3, 4, 5, 6, 7} y Q = {2}.
El valor actual del vector p es (1, 1, 1, 1, 1, 1, 1)
5. Q 6=
6. volvemos a 3.
Segunda iteracion
3. u = 2, Q = Q {2} =
4. A0 (u) = {5, 6}, marcamos 5, 6, los ponemos en la pila y reemplazamos p(5) y p(6) por 2. El estado actual
de la lista y de la pila es
V = {1 , 2 , 3, 4, 5 , 6 , 7} y Q = {5, 6}
66 Optimizaci
on Combinatoria
lo sumo c m2 operaciones y por lo tanto la complejidad del algoritmo search es menor o igual que c m2 para
una constante c. Diremeos entonces que la complejidad es del orden de m2 o tambien que es O(m2 ).
Definicion 4.5. Dado un algoritmo, sea N el tama no del input, es decir, la cantidad de bits que se necesitan
para describir el input. Diremos que la complejidad del algoritmo es polinomial si es menor o igual que P (N )
para alg
un polinomio P .
En el caso del algoritmo search, se tiene que m N , de donde c m2 c.N 2 . Luego, la complejidad del
algoritmo search es menor o igual que P (N ) donde P es el polinomio c X 2 . Hemos probado entonces que la
complejidad de este algorimto es polinomial.
5. Spanning trees.
on 5.1. Sea G = (V, E) un grafo conexo. Un spanning tree de G es un arbol T = (V 0 , E 0 ) tal que
Definici
V = V y E 0 es un subconjunto de E.
0
entonces el grafo
Definici
on 5.5. Diremos que un spanning tree T de G es mnimo sii la suma de los pesos de sus ramas es
menor o igual que la suma de los pesos de las ramas de cualquier otro spanning tree de G.
Ejemplo 5.6. Consideremos el siguiente grafo donde en cada rama indicamos el peso
13
7
100
20
2 10
14
13
13
7
100
2 10
Ejemplo 5.7. Supongamos que deseamos interconectar cinco localidades con una red de caminos a costo
mnimo. Supongamos conocido el costo de conectar las localidades i y j e ilustremos la situacion con esos
datos en un grafo G con pesos, donde a cada rama (i, j) le asignamos como peso el costo de conectar i y j.
43 21
4 8
7
9
11
17 12
27
En las proximas dos secciones veremos un par de algoritmos que hallan, dado un grafo G no dirigido, conexo
y con pesos, un spanning tree mnimo de G.
6. El algoritmo de Kruskal
Sea G = (V, E) un grafo no dirigido, conexo, donde cada rama e E tiene asignado un peso (e). Sea
Grafos y algoritmos 69
5
4 2 20
1 13
6
7 3 14
8
2 17
19
3 22
7
Para poder tener en claro en el grafico cual es el conjunto de ramas elegidas, dibujaremos las ramas que han
sido elegidas hasta el momento con trazo grueso y las que no con trazo fino.
1. Ordenamos las ramas de menor a mayor seg
un el peso tal como se indica en la tabla
e (e)
e1 = (4, 5) (e1 ) = 2
e2 = (4, 3) (e2 ) = 3
e3 = (1, 2) (e3 ) = 7
e4 = (1, 4) (e4 ) = 13
e5 = (3, 6) (e5 ) = 14
e6 = (7, 8) (e6 ) = 17
e7 = (2, 3) (e7 ) = 19
e8 = (5, 6) (e8 ) = 20
e9 = (3, 7) (e9 ) = 22
2. Elegimos e1 .
5
e1
1 4
6
2
3
7
e
2
8
2
3
7
70 Optimizaci
on Combinatoria
2
3
7
e5
8
2 e6
3
7
Siendo que #{ ramas elegidas } = 6 < 8 1 = m 1, repetimos 2. Como e7 y e8 forman ciclo con las ya
elegidas y e9 no, elegimos e9 .
5
1 4
6
2
3 e9 7
A = {(u, v) E u A y v V A}
Definici
on 6.4. Si A es un corte de G y U es un subconjunto de ramas de G, diremos que U no cruza al
corte A si U A = .
Grafos y algoritmos 71
2 7
1 10
4 5
9
6
En la figura, A = {(3, 7), (4, 5), (4, 6), (1, 9)} es el conjunto de ramas intersecadas por la curva. El conjunto
U = {(1, 2), (5, 6), (6, 8)} no cruza el corte.
Teorema 6.6. Sea G = (V, E) un grafo no dirigido conexo, donde cada rama e E tiene asignado un peso
(e), y sea A un corte. Sea U un subconjunto de ramas de un mnimo spanning tree T de G que no cruza
el corte.
Si e A es una rama de mnimo peso entonces U {e} es un subconjunto de ramas de un mnimo spanning
tree T 0 de G.
Demostraci
on: Si e es una rama de T no hay nada que probar. Supongamos entonces que no lo es.
Como T es conexo, si e = (u, v) entonces existe un camino en T de u a v. Sean e1 , . . . , er las ramas de ese
camino.
Ilustremos esta situacion en un grafico
u 3
u 2
e2 u r1
u e r
1
e1
v
u e
e Uk
u k+1
u
camino en U k
u v
u k+1
camino en U k
camino en U k
Luego, por el teorema 6.6., Uk+1 = Uk {ek+1 } es un subconjunto de ramas de un spanning tree mnimo
Tk+1 .
Luego, para todo k, el conjunto de ramas elegidas hasta la k-esima iteracion es un subconjunto de ramas de
un spanning tree mnimo Tk . Sea m = #V . Como #Uk = k para todo k ya que en cada iteracion se agrega
una rama (Uk+1 = Uk {ek+1 } con ek+1 / Uk ) y el algoritmo se detiene cuando hay m 1 ramas elegidas,
entonces el algoritmo se detiene cuando k = m 1. Ademas, Um1 sera un conjunto de m 1 ramas que es
un subconjunto de ramas de un spanning tree mnimo Tm1 . Pero como Tm1 tambien tiene m 1 ramas
por ser un spanning tree entonces se tiene que Um1 es igual al conjunto de ramas de Tm1 . Esto significa
que si E 0 es el conjunto de las m 1 ramas elegidas por el algoritmo entonces (V, E 0 ) = Tm1 y por lo tanto
es un mnimo spanning tree de G.
Para aplicar el algoritmo de Kruskal debemos ordenar las ramas de menor a mayor costo. Hay muchos
algoritmos que se pueden utilizar para ordenar. Veremos uno conocido como divide and conquer.
{a1 , a2 , a3 , a4 } {a5 , a6 , a7 , a8 }
Ordenamos los elementos de cada uno de los subconjuntos de cuatro elementos teniendo en cuenta el orden
obtenido en el paso previo.
3. Partimos el conjunto {a1 , . . . , an } en los subconjuntos de 8 = 23 elementos cada uno:
Ordenamos los elementos de cada uno de los subconjuntos de ocho elementos teniendo en cuenta el orden
obtenido en el paso previo.
Seguimos de este modo hasta tener un solo subconjunto con los n elementos ordenados.
Si {b1 , . . . , br } y {c1 , . . . , cr } estan ordenados, para ordenar {b1 , . . . , br , c1 , . . . , cr } (es decir, para ordenar
cada subconjunto al pasar del paso k al paso k + 1) necesitamos hacer, a lo sumo, 2r comparaciones. Veamos
esto en un par de ejemplos y luego veamos el caso general.
Ejemplo 6.7 Supongamos que sabemos que b1 b2 b3 b4 b5 b6 y que c1 c2 c3 c4 c5 c6
y supongamos que el orden final sera
b1 , b2 , c1 , b3 , c2 , b4 , b5 , c3 , b6 , c4 , c5 , c6
b1 b2 b3 b4 b5
y que
c1 c2 c3 c4 c5
b1 , c1 , b2 , c2 , b3 , c3 , b4 , c4 , b5 , c5
comparaciones para ordenar cada subconjunto de 2r elementos generado a partir de dos subconjuntos de r
elementos ordenados.
Por u
ltimo, veamos que el algoritmo divide and conquer para ordenar n elementos tiene complejidad
O(n. log n).
Para el primer paso necesitamos hacer n2 comparaciones. Ademas, en cada paso k tenemos 2nk subconjuntos de
2k elementos cada uno que queremos ordenar, y cada uno de estos subconjuntos es la union de dos conjuntos
de r = 2k1 elementos que ya estan ordenados. Luego, necesitamos hacer 2r = 2.2k1 comparaciones por
cada uno de los 2nk subconjuntos, es decir, un total de 2k . 2nk = n
Si 2t1 < n 2t entonces en t 1+log n pasos terminamos ya que en el paso k ordenamos subconjuntos de 2k
elementos. Como en cada paso hacemos a lo sumo n comparaciones y se realizan a lo sumo 1 + log n 2 log n
pasos entonces la complejidad de este algoritmo es O(n. log n), donde log denota el logaritmo en base 2.
Implementaci
on del algoritmo de Kruskal.
Supongamos que V = {v1 , . . . , vm } y E = {e1 , . . . , en }, donde hemos ordenado las ramas de manera que e1
sea la de menor peso, e2 a la que sigue, etc.
Ahora, en cada iteracion debemos elegir una rama de mnimo peso entre las no elegidas que no forman ciclo
con las que tenemos hasta ese momento. Para hacer esto en la forma en que una maquina pudiera hacerlo,
Grafos y algoritmos 75
notemos que en la iteracion k del algoritmo, el grafo (V, Uk ), donde Uk denota el conjunto de ramas elegidas
hasta la k-esima iteracion, constituye una foresta con m k arboles. En cada iteracion asignaremos a cada
uno de estos arboles un n umero entre 1 y m y llevaremos un registro de cuales son los nodos y las ramas que
lo forman.
Utilizaremos dos vectores x = (x1 , . . . , xm ) e y = (y1 , . . . , yn ) y una variable t. El valor de la coordenada
xi de x nos dira el n umero de arbol al pertenece el nodo vi y el valor de la coordenada yj de y nos dira
el numero de arbol al que pertenece la rama ej , o valdra -1 si ej no fue examinada a un, o valdra 0 si ej
fue examinada y descartada porque formaba ciclo con las ramas ya elegidas. El valor de la variable t nos
indicara cual es la rama que nos toca examinar. Ademas, utilizaremos un contador c que nos indicara cual
es la iteracion que hemos realizado. El algoritmo se detendra cuando c valga m 1.
En la iteracion cero inicializamos las variables c y t poniendo c = 0, t = 1 y los vectores x e y en la forma
x1 = 1, x2 = 2, . . . , xm = m, y1 = 1, y2 = 1, . . . , yn = 1. Esta asignacion corresponde a la foresta
inicial formada por los m vertices y ninguna rama.
Supongamos que hemos realizado las primeras k iteraciones. En este momento c = k y la foresta puede
describirse como sigue: cada arbol de la foresta esta formado por las ramas y vertices cuyas correspondientes
coordenadas en los vectores x e y tienen un mismo n umero positivo. Si yj > 0 significa que la rama ej
fue elegida, si yj = 0 significa que la rama ej fue examinada y descartada porque formaba ciclo con las ya
elegidas y si yj = 1 significa que la rama ej a un no fue examinada. El valor que tiene t en este momento
nos indica cual es la primera rama que debemos examinar al comenzar la iteracion k + 1.
Iteracion k + 1: examinamos la rama et . Supongamos que et = (vi , vj ). Para ver si forma un ciclo con las
ramas de la foresta actual comparamos los dos valores de xi y xj correspondientes a los vertices vi y vj de
et . Si son distintos, entonces estos vertices pertenecen a distintos arboles y por lo tanto agregar la rama
fusionara esos arboles formando uno nuevo y no habra ciclo. Pero si son iguales, entonces pertenecen a un
mismo arbol. Como el arbol es conexo existe un camino en el de vi a vj y por lo tanto agregar la rama
formara ciclo con las ya elegidas.
Si vemos que et forma ciclo, actualizamos el valor de yt poniendo yt = 0 para indicar que la rama et fue
examinada y descartada, actualizamos t en la forma t = t + 1 y pasamos a examinar la rama et . Si en
cambio no forma ciclo, el agregar esa rama fusionara los arboles xi y xj . Supongamos que el valor de xi es
r y el de xj es s, con s < r . Entonces actualizamos los vectores x e y poniendo yt = s, xl = s l / xl = r,
yl = s l / yl = r. Esto indica que ahora el arbol s esta formado por todos los vertices y ramas que tena
hasta ese momento, la rama et y todos los vertices y ramas que antes pertenecan al arbol s. Ademas,
actualizamos t y c en la forma t = t + 1 y c = c + 1.
Repetimos este procedimiento hasta que c = m 1, es decir, hasta que haya m 1 ramas elegidas (notemos
que en cada iteracion elegimos una rama). En ese momento todas las coordenadas de x valdran 1 y las
coordenadas de y valdran 0, 1 o 1. Mas a un, habra exactamente m 1 coordenadas de y que tengan el
valor 1. Esas son las coordenadas que corresponden a las m 1 ramas del mnimo spanning tree buscado.
Ejemplo 6.9. Aplicaremos el algoritmo de Kruskal al grafo con m = 7 vertices
18 3
2
13
10 8
4 22
25 5
11
1 40 35
38
21
7
6
76 Optimizaci
on Combinatoria
para obtener un mnimo spanning tree. Primero ordenamos las ramas de menor a mayor seg
un el peso:
e (e)
e1 = (2, 4) (e1 ) = 8
e2 = (1, 2) (e2 ) = 10
e3 = (1, 4) (e3 ) = 11
e4 = (3, 5) (e4 ) = 13
e5 = (2, 3) (e5 ) = 18
e6 = (6, 4) (e6 ) = 21
e7 = (4, 3) (e7 ) = 22
e8 = (2, 5) (e8 ) = 25
e9 = (5, 7) (e9 ) = 35
e10 = (1, 7) (e10 ) = 38
e11 = (4, 7) (e11 ) = 40
En la siguiente tabla se ven las actualizaciones de los vectores x e y, donde xi corresponde al vertice i e yj
a la rama ej y el estado del contador c.
c 0 1 2 3 4 5 6
x1 1 1 1 1 1 1 1
x2 2 2 1 1 1 1 1
x3 3 3 3 3 1 1 1
x4 4 2 1 1 1 1 1
x5 5 5 5 3 1 1 1
x6 6 6 6 6 6 1 1
x7 7 7 7 7 7 7 1
y1 1 2 1 1 1 1 1
y2 1 1 1 1 1 1 1
y3 1 1 1 0 0 0 0
y4 1 1 1 3 1 1 1
y5 1 1 1 1 1 1 1
y6 1 1 1 1 1 1 1
y7 1 1 1 1 1 1 0
y8 1 1 1 1 1 1 0
y9 1 1 1 1 1 1 1
y10 1 1 1 1 1 1 1
y11 1 1 1 1 1 1 1
Ahora analicemos como es la foresta en cada iteracion del algoritmo. En la interacion cero la foresta inicial
consiste de siete arboles, cada uno de ellos formado por un u
nico vertice y ninguna rama.
3
2
4 5
3
2
e1
4 5
3
2
e2 e1
4 5
3
2
e
4
e2 e1
4 5
e6
7
Foresta en la sexta iteracion, donde las ramas e7 y e8 son descartadas y se fusionan los arboles 1 y 7 al
agregar la rama e9
e5 3
2
e
4
e2 e1
4 5
1 e
9
e6
7
se hacen a lo sumo c.n comparaciones y actualizaciones (donde c es una constante) y se realizan a lo sumo
m iteraciones, entonces la complejidad de este algoritmo es O(n. log n) + m.O(n).
Dado que n m 2 2
2 m , entonces n. log n n. log m = 2n. log m 2n.m. Por lo tanto la compeljidad es
O(n.m), es decir, es menor o igual que k.n.m para una constante k. Como en el caso del algorimto search,
este algoritmo es polinomial. En efecto, si N es el tama no del input, se tiene que n + m N . Luego
n.m (n + m)2 N 2 de donde la complejidad del algoritmo es menor o igual que P (N ) donde P es el
polinomio k X 2 .
7. El algoritmo de Prim.
Sea G = (V, E) un grafo no dirigido, conexo, donde cada rama e E tiene asignado un peso (e) y sea
m = #V . Describiremos ahora otro algoritmo, conocido como el algoritmo de Prim que tambien encuentra,
en tiempo polinomial, un spanning tree mnimo de G. Dejamos como ejercicio el calculo de su complejidad.
Descripci
on del algoritmo.
Dejamos a cargo del lector justificar la validez de este algoritmo. La demostracion es analoga a la de la
validez del algoritmo de Kruskal. Debe probarse que, para cada k, Uk = { ramas elegidas hasta el paso k }
es un subconjunto de un spanning tree mnimo Tk .
Sugerencia: para el paso cero tomar U0 = , T0 un spanning tree mnimo y, para el paso inductivo, aplicar
el teorema 6.6. a U = Uk = { ramas del subarbol formado hasta ahora } y al corte definido por el conjunto
Ak+1 = { vertices del subarbol formado hasta ahora }.
Notar que entonces Ak+1 = {e E U /U {e} es un subarbol de G }.
Ejemplo 7.1. Apliquemos el algoritmo de Prim al siguiente grafo, donde en cada rama hemos indicado su
peso
2
22
3
11
35
15
1 18
6
20
4 19
5
Se tiene
80 Optimizaci
on Combinatoria
3 3
4
6
4 4
3 2
3
6
6
4
5
4
5
2
3
4
5
8. El camino
optimo en un grafo dirigido.
Sea G = (V, E) un grafo dirigido y supongamos que para cada rama e = (u, v) E tenemos definido un
costo (o distancia) ce = cuv .
Si P es un camino dirigido en G definimos el costo de P como la suma de los costos de las ramas que lo
forman. Fijado un vertice s queremos encontrar, para cada vertice v de G, un camino dirigido optimo (i.e.,
de mnimo costo o distancia) de s a v. En esta seccion analizaremos varios algoritmos que resuelven este
problema, pero antes veamos su utilidad en un ejemplo.
Ejemplo 8.1. Una empresa es contratada para reparar 100 torres electricas, para lo cual necesitara comprar
barras de acero de distintas longitudes L1 < L2 < < Ln cuya unica diferencia es la longitud. La empresa
compra estas barras a un fabricante, quien esta dispuesto a venderle barras de cualquier longitud siempre y
cuando compre un mnimo de 100 barras de cada longitud. Por lo tanto, a la empresa no le conviene comprar
barras de todas las n longitudes. En lugar de esto, le conviene comprar barras de ciertas longitudes y obtener
las barras de cada longitud Li que no tiene cortando las barras de longitud mas chica entre aquellas que
tiene y cuya longitud es mayor que Li . Por ejemplo, si necesita 10 barras de longitud L1 , 5 de longitud L2
y 90 de longitud L3 , le conviene comprar 105 barras de longitud L3 y cortar 10 de ellas para obtener las
barras de longitud L1 y 5 de ellas para obtener las barras de longitud L2 en lugar de comprar 100 barras de
longitud L1 , 100 de longitud L2 y 100 de longitud L3 . En cambio, si necesita 99 barras de longitud L1 , 20
de longitud L2 y 90 de longitud L3 , entonces le conviene comprar 100 de longitud L1 y 110 de longitud L3 .
Se plantea entonces el problema de elegir cuales longitudes conviene comprar de manera de poder obtener
las restantes por recorte, a un costo mnimo. Como Ln > Li i, la longitud Ln debe ser una de las que se
compren ya que no puede obtenerse por recorte de ninguna otra.
Para cada i entre 1 y n sea ci el costo de una barra de longitud Li y sea pi la cantidad de barras de longitud
Li que necesitara la empresa para reparar las 100 torres.
Grafos y algoritmos 81
Consideremos el grafo dirigido G = (V, E), donde V = {0, 1, 2, . . . , n} y E = {(i, j) / 0 i < j n}. Por
ejemplo, para n = 4 el grafo sera
1 2 3 4
0
Asignemos a cada rama (i, j) (0 i < j n) el costo cij = max {100, pi+1 + pi+2 + + pj } cj . Supongamos
que P es un camino dirigido de 0 a n y que los vertices de ese camino son 0, j1 , . . . , jr , n. Entonces, si
elegimos comprar las longitudes Lj1 , . . . , Ljr y Ln y obtener las restantes por recorte, resulta que el costo
total de la compra determinado por esta eleccion es el costo de P. En efecto, si P es el camino dirigido
(0, j1 ), (j1 , j2 ), . . . , (jr1 , jr ), (jr , n) el costo de P es
Dado que de cada longitud deben comprarse un mnimo de 100 barras, entonces el costo de comprar k barras
de una dada longitud Lj es max {100, k} cj . Luego, el costo de P es el costo de comprar p1 + p2 + + pj1
barras de longitud Lj1 + el costo de comprar pj1 +1 + pj1 +2 + + pj2 barras de longitud Lj2 + + el costo
de comprar pjr1 +1 + pjr1 +2 + + pjr barras de longitud Ljr + el costo de comprar p1+jr + p2+jr + + pn
barras de longitud Ln . Luego el problema se resuelve hallando el camino dirigido de mnimo costo de 0 a n
en G. Si el camino de mnimo costo es
0 j1 j2 jr n
entonces a la empresa le conviene comprar max {100, p1 + p2 + + pj1 } barras de longitud Lj1 y obtener
las de longitudes menores que Lj1 recortando las de longitud Lj1 , max {100, pj1 +1 + pj1 +2 + + pj2 } barras
de longitud Lj2 y obtener las de longitudes mayores que Lj1 y menores que Lj2 recortando las de longitud
Lj2 , . . ., max {100, pjr1 +1 + pjr1 +2 + + pjr } barras de longitud Ljr y obtener las de longitudes mayores
que Ljr1 y menores que Ljr recortando las de longitud Ljr y max {100, p1+jr + p2+jr + + pn } barras de
longitud Ln y obtener las de longitudes mayores que Ljr y menores que Ln recortando las de longitud Ln .
Sea G un grafo dirigido donde cada rama (u, v) tiene asignado un costo cuv y donde se ha fijado un vertice
s.
Describiremos a continuacion varios algoritmos que encuentran (cuando existe) el camino dirigido optimo
de s a u y su costo, para cualquier vertice u 6= s.
Observaci on 8.2. Sea R es un camino optimo de s a u y sea v el vertice anterior a u en ese camino. Si P
la parte de ese camino que va de s a v entonces P es un camino optimo a v.
En efecto, si hubiera un camino mas barato de s a v, entonces ese camino seguido de la rama (v, u) sera
un camino mas barato que el camino que resulta de agregar a P la rama (v, u), es decir, mas barato que
el camino optimo R.
M
etodo de programaci
on din
amica.
Para poder aplicar este metodo necesitaremos que el grafo G no contenga ciclos dirigidos. Sea entonces
G = (V, E) un grafo que no contiene ciclos dirigidos, donde cada rama (u, v) tiene asignado un costo cuv y
82 Optimizaci
on Combinatoria
supongamos que el vertice fijado s de G es tal que de el solo salen flechas. A este vertice s lo llamaremos la
fuente.
Claramente podemos suponer que V = {1, 2, . . . , m}. Para cada i < j tal que (i, j) / E tomaremos cij = .
Supondremos ademas que los vertices estan numerados de 1 a m de forma tal que valga
(i, j) E = i < j
Dejamos como tarea para el lector probar que si G no contiene ciclos dirigidos siempre es posible renumerar
los vertices de manera que esto se verifique.
Luego, s = 1 y vale {i / (i, j) E} {1, 2, . . . , j 1}. Sea
(0 si j = 1
yj = si j 2 y 6 camino dirigido de 1 a j
costo de un camino dirigido optimo de 1 a j en otro caso
(Notar que, como el grafo no contiene ciclos dirigidos, si existe un camino dirigido a j entonces existe un
camino dirigido optimo a j)
Luego, para todo i < j es yj yi + cij . En efecto, esto es obvio si (i, j) E. Pero si (i, j) / E entonces
tambien vale pues en ese caso cij = . Mas a
un, por la observacion 8.2., si i es el vertice anterior a j en un
camino dirigido optimo de 1 a j, entonces yj = yi + cij .
Esto muestra que
yj = min {yi + cij }
1ij1
y que si k es el ndice que realiza el mnimo entonces k es el vertice anterior a j en un camino optimo de 1
a j.
Descripci
on del algoritmo.
1. y1 = 0, j=2.
2. yj = min {yi + cij }. Si yk + ckj = min {yi + cij } poner pj = k.
1ij1 1ij1
3. j = j + 1. Si j m ir a 2.
4. STOP
Como pj es el ndice que realiza el mnimo entonces es el predecesor a j en un camino optimo. Luego,
conociendo pj para cada 2 j m podemos reconstrur ese camino.
Ejemplo 8.3. Apliquemos el algoritmo al grafo
2 12 4
5
6
21 2
3 1 5
7
1
13
4 2
7
11 11
5
8 4
donde para cada rama (i, j) hemos indicado su costo cij . Notemos que este grafo no contiene ciclos dirigidos
y satisface (i, j) E = i < j
Grafos y algoritmos 83
y1 = 0
y2 = 21, p2 = 1
y3 = min {y1 + c13 , y2 + c23 }. Como y1 + c13 = 13 e y2 + c23 = entonces y3 = 13, p3 = 1.
y4 = min {y1 + c14 , y2 + c24 , y3 + c34 }. Como y1 + c14 = , y2 + c24 = 33 e y3 + c34 = 15 entonces y4 = 15,
p4 = 3.
y5 = min {y1 +c15 , y2 +c25 , y3 +c35 , y4 +c45 }. Como y1 +c15 = , y2 +c25 = , y3 +c35 = 17 e y4 +c45 = 16
entonces y5 = 16, p5 = 4.
y6 = min {y1 + c16 , y2 + c26 , y3 + c36 , y4 + c46 , y5 + c56 }. Como y1 + c16 = , y2 + c26 = , y3 + c36 = ,
y4 + c46 = 10 e y5 + c56 = 23 entonces y6 = 10, p6 = 4.
Analogamente y7 = 14, p7 = 5, y8 = 10 y p8 = 7.
En el camino optimo de 1 a 7 el predecesor de 7 es p7 = 5, el de 5 es p5 = 4, el de 4 es p4 = 3 y el de 3
es p3 = 1. Luego, el camino dirigido optimo de 1 a 7 es 1 3 4 5 7 con costo y7 = 14.
Analogamente el camino dirigido optimo de 1 a 6 es 1 3 4 6 con costo y6 = 10.
M
etodo de Dijkstra.
Este metodo solo se podra aplicar en el caso en que los costos ce = cuv son no negativos para toda rama
e = (u, v). Si el grafo G = (V, E) no es completo ponemos cij = si (i, j)
/ E.
Descripci
on del algoritmo.
1. Poner
0 si u = s 1 si u = s
yu = , pu = , A = {s}
si u 6= s s si u 6= s
2. Sea v el u
ltimo vertice que ingreso a A. Para todo u
/ A tal que yv + cvu < yu actualizar yu y pu en la
forma
yu = yv + cvu pu = v
3. Sea u
/ A tal que yu = min {yw }. Poner A = A {u}.
wA
/
4. Si A 6= V goto 2.
Al finalizar el algoritmo, para todo u 6= s vale: si yu < entonces yu es el costo de un camino dirigido
optimo de s a u y pu es el vertice anterior a u en ese camino y si yu = entonces no existe un camino
dirigido de s a u.
Ejemplo 8.4. Apliquemos el algoritmo al grafo completo de seis vertices, para hallar el camino dirigido de
mnimo costo desde el nodo s = 1 hasta cada uno de los restantes nodos, donde los costos de cada rama
estan dados por la matriz
5 14 3 7 6
13 3 7 4 1
2 2 2 7 2
||cij || =
1 1 12 21 10
5 3 1 1 2
2 7 3 2 1
Primera iteracion:
1. y1 = 0, p1 = 1, yu = , pu = 1 (u 6= 1), A = {1}.
Luego (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, , , , , ) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 1, 1, 1, 1, 1)
2. v = 1
Para u = 2, yv + cvu = y1 + c12 = 5 < = y2 = yu . Luego ponemos yu = yv + cvu , es decir, y2 = y1 + c12 = 5
y pu = v, es decir, p2 = 1.
84 Optimizaci
on Combinatoria
0 1 2 3 4 5
y1 0 0 0 0 0 0
y2 5 4 4 4 4
y3 14 14 7 7 7
y4 3 3 3 3 3
y5 7 7 7 6 6
y6 6 6 5 5 5
p1 1 1 1 1 1 1
p2 1 1 4 4 4 4
p3 1 1 1 2 2 2
p4 1 1 1 1 1 1
p5 1 1 1 1 6 6
p6 1 1 1 2 2 2
A 1 4 2 6 5 3
yu = yv + cvu pu = v
Como por hipotesis inductiva lo que queremos demostrar vale para v entonces yv es el costo de un camino
optimo C de s a v. Luego yu = yv + cvu es el costo del camino de s a u que resulta de agregar a C la rama
(v, u). Veamos que yu es el costo de un camino optimo a u.
86 Optimizaci
on Combinatoria
Sea v 0 el vertice anterior a u en un camino optimo R a u y sea P la parte de este camino que va de s a v 0 .
La situacion es
1 2
L
u1 A
Como R era optimo, la parte de este camino que va de s a u2 , es decir, el camino L1 seguido de la rama
(u1 , u2 )
u2 A
u1 A
es un camino optimo a u2 .
Como por hipotesis ce 0 para toda rama e E, el costo de un camino optimo de s a u es mayor o igual
que el costo de un camino optimo de s a u2 y este u ltimo es igual al costo del camino L1 mas el costo cu1 u2
de la rama (u1 , u2 ).
Como u1 A, u1 6= u entonces, por hipotesis inductiva, el costo de L1 es yu1 ya que L1 es un camino optimo
a u1 (ver observacion 8.2.). Ademas, como yu2 / A entonces yu2 yu1 + cu1 u2 por el lema 8.5.
Por otra parte, como u era el ultimo vertice que ingreso a A entonces yu = min {yw } de donde yu yw para
wA
/
todo w
/ A. En particular, yu yu2
Grafos y algoritmos 87
Luego el costo de un camino optimo de s a u costo de un camino optimo de s a u2 = costo del camino
L1 + cu1 u2 = yu1 + cu1 u2 yu2 yu .
Esto prueba que yu es menor o igual que el costo de un camino optimo de s a u y, como yu es el costo de un
camino a u, entonces debe valer la igualdad.
Por ultimo, veamos que si u 6= s entonces pu es el vertice que precede a u en un camino optimo de s a u.
Por construccion, yu = yv + cvu para alg
un v y, por lo que acabamos de probar, yu es el costo de cualquier
camino optimo a u e yv es el costo de cualquier camino optimo a v.
Sea P un camino optimo a v y sea R el camino a u que resulta de agregarle a P la rama (v, u). Luego, el
costo de R = costo de P + cvu = yv + cvu = yu . Entonces R es un camino optimo a u y en este camino v es
el predecesor a u.
M
etodo de Ford-Bellman.
Este metodo es el mas general: el grafo puede contener ciclos dirigidos y ramas con costos negativos. Podra
ocurrir, entonces, que para alg un t no exista un camino mnimo de s a t tal como se ve en el siguiente
ejemplo.
Ejemplo 8.6. El grafo
e2 e
5
e1 1 2
s t
3 1
3 e3
e
4
contiene un ciclo dirigido de costo negativo. En efecto, el ciclo (e2 , e3 , e4 ) tiene costo 1. Luego no existe
un camino optimo de s a t ya que hay caminos de costo tan peque no como se quiera: el camino que resulta
de recorrer primero la rama e1 , luego n veces el ciclo (e2 , e3 , e4 ) y finalmente la rama e5 es un camino de s
a t de costo 3 + n.(1) + 2 = 5 n.
Supongamos que yu sea el costo de un camino (no necesariamente optimo) de s a u, para cada u V . Dado
v, si para algun u 6= v fuese yu + cuv < yv entonces es mejor el camino de s a u cuyo costo es yu seguido
de la rama (u, v) que el camino cuyo costo es yv . Luego, si yv fuese el costo de un camino optimo entonces
debera ser yv yw + cwv para todo w 6= v. Esto sugiere el siguiente algoritmo
Descripci
on del algoritmo.
1. Poner
0 si u = s
yu = , pu = 1, i=1
si u =
6 s
88 Optimizaci
on Combinatoria
2. Para cada v poner yv0 = yv , si yv yu + cuv para todo u tal que (u, v) E o poner yv0 = yw + cwv y
pv = w, donde yw + cwv = min{yu + cuv / (u, v) E e yv > yu + cuv }, si yv > yu + cuv para alg
un u tal que
(u, v) E
3. yv = yv0 , i = i + 1
4. Si i < #V goto 2. Si no, STOP.
Ejemplo 8.7. Apliquemos el algoritmo de Ford-Bellman al grafo
2
1
3
1
3
1
1
3 2
4
2
5
5 4 4
i = 3.
Continuamos de esta manera hasta que tengamos i = 5. La siguiente tabla resume la informacion de las
iteraciones
0 1 2 3 4
y1 0 0 0 0 0
y2 3 0 0 0
y3 1 1 1 1
y4 1 1 1
y5 2 2 3 3
p1 1 1 1 1 1
p2 1 1 3 3 3
p3 1 1 1 1 1
p4 1 1 3 3 3
p5 1 1 1 2 2
Dejamos a cargo del lector verificar los valores de yv y de pv en las restantes iteraciones y tambien que los
valores finales de yv (v V ) satisfacen que para todo (u, v) E es yv yu + cuv . Veremos luego que al
terminar el algoritmo se verifican
i) Si yw < para todo w entonces el grafo no contiene ciclos dirigidos de costo negativo sii yv yu + cuv
(u, v) E. En tal caso, para cada v se tiene que pv es el vertice predecesor a v en un camino optimo de s
a v cuyo costo es yv .
1
4
1
2
1
5 2
1
4
3
2
3
1
4
para encontrar el camino optimo de s = 1 a cada uno de los restantes vertices obtenemos la siguiente tabla
que muestra los valores de yv y de pv para cada vertice v.
90 Optimizaci
on Combinatoria
0 1 2 3 4
y1 0 0 0 0 0
y2 1 1 1 0
y3 2 2 2 2
y4 3 1 4
y5 4 2 6 6
p1 1 1 1 1 1
p2 1 1 1 1 4
p3 1 1 2 2 2
p4 1 1 3 3 5
p5 1 1 3 3 3
5 4
1
1
3
3
para encontrar el camino optimo de s = 1 a cada uno de los restantes vertices obtenemos la siguiente tabla
que muestra los valores de yv y de pv para cada vertice v.
0 1 2 3
y1 0 0 0 0
y2 5 5 5
y3 9 9
y4
p1 1 1 1 1
p2 1 1 1 1
p3 1 1 2 2
p4 1 1 1 1
yv yu + cuv (u, v) E
de donde
donde u1 , u2 , . . . , uk son todos vertices distintos. Luego, k #V y, como ce C para toda rama e entonces
Supongamos ahora que P contiene algunos ciclos dirigidos C1 , C2 , . . . , Cr . Entonces esos ciclos deben tener
costo mayor o igual que cero. Sea P 0 el camino simple que resulta de eliminar en P estos ciclos. Luego,
y como P 0 es un camino que no contiene ciclos entonces c(P 0 ) (#V 1)C, de donde resulta que
c(P) (#V 1)C.
Sea G = (V, E) un grafo dirigido donde cada rama e E tiene asignado un costo ce . Describiremos
un algoritmo que halla, cuando existe, un ciclo dirigido de costo negativo en G. Sea m = #V y sea
C = max{| ce | / e E}.
A partir de G construmos el nuevo grafo G = (V, E) agregando a G un vertice s y ramas (s, v) para cada
v V . A cada rama e E le asignamos un costo ce en la forma
ce si e E
ce =
0 si e = (s, v) para alg
un v V
Notar que #V = m + 1 y que max{| ce | / e E} = C. Notar ademas que para todo v V, v 6= s, existe un
camino de s a v (la rama (s, v)).
Observaci on 9.2. C es un ciclo dirigido de costo negativo en G si y solo si C es un ciclo dirigido de costo
negativo en G. En efecto, sea C un ciclo dirigido de costo negativo en G. Como ning un ciclo de G puede
pasar por el vertice s, ya que de s solo salen flechas, entonces ese ciclo debe ser un ciclo en G, es decir, e E
para toda rama e de C. Luego, ce = ce para toda rama e de C. Por lo tanto, C es un ciclo dirigido de costo
negativo en G. Recprocamente, si C es un ciclo dirigido de costo negativo en G entonces claramente es un
ciclo dirigido en G del mismo costo.
Para hallar un ciclo dirigido de costo negativo en G, primero aplicamos el algoritmo de Ford-Bellman para
hallar un camino de mnimo costo en G de s a cada v V .
Como este algoritmo realiza #V 1 = m iteraciones entonces, por el corolario 8.12., se tiene que al terminar
la iteracion m-esima yv < para todo v (ya que para todo v V existe un camino de s a v) y ademas,
yv yu + cuv (u, v) E si y solo si G no contiene ciclos dirigidos de costo negativo.
Luego, por la observacion 9.2., al terminar la iteracion m-esima se tiene que yv yu + cuv (u, v) E
si y solo si G no contiene ciclos dirigidos de costo negativo. En ese caso el algoritmo termina. En caso
contrario, continuamos con el algoritmo (es decir, seguimos haciendo iteraciones) hasta que para alg un v
valga yv < mC = (#V 1)C.
Como yv < entonces, por la observacion 8.10., yv es el costo de un camino P en G.
Luego c(P) = yv < (#V 1)C y, como C = max{| ce | / e E}, P debe contener un ciclo dirigido de costo
negativo por el lema 9.1. Por la observaci on 9.2., ese ciclo debe ser un ciclo dirigido de costo negativo en G.
Para hallarlo, reconstrumos el camino usando los predecesores.
Descripci
on del algoritmo.
1. A partir de G construmos el nuevo grafo G = (V, E) agregando a G un vertice s y ramas (s, v) para cada
v V . A cada rama e E le asignamos un costo ce en la forma
ce si e E
ce =
0 si e = (s, v) para alg
un v V
2. Poner
0 si u = s
yu = , pu = 1, i=1
si u =
6 s
3. Para cada v poner yv0 = yv , si yv yu + cuv para todo u tal que (u, v) E o poner yv0 = yw + cwv y
pv = w, donde yw + cwv = min{yu + cuv / (u, v) E e yv > yu + cuv }, si yv > yu + cuv para alg
un u tal que
(u, v) E
4. yv = yv0 . Poner i = i + 1
94 Optimizaci
on Combinatoria
5. Si i < m + 1 ir a 3.
6. Si i = m + 1 y vale yv yu + cuv (u, v) E STOP (en ese caso G no contiene ciclos dirigidos de costo
negativo).
7. Si yv mC para todo v ir a 3. Si no, hallar v tal que yv < mC y reconstrur el camino P cuyo costo
es yv usando los predecesores.
8. Hallar un ciclo dirigido de costo negativo contenido en P. STOP.
Notemos que, en principio, este algoritmo podra no detenerse nunca. El objetivo de lo que sigue es dar
condiciones que garantizan un STOP (proposicion 9.5.) y mostrar que, en realidad, estas condiciones no son
realmente restrictivas en la practica (observacion 9.6.).
Observaci on 9.3. Cualquiera sea v, al terminar la primera iteracion del algoritmo el valor de yv presente
en ese momento satisface yv 0. En efecto como (s, v) E entonces en el paso 3. de la primera iteracion
se tiene que yv > ys + csv ya que yv = e ys = 0 = csv . Luego, al terminar la primera iteracion el valor de
yv es reemplazado por min{yu + cuv / (u, v) E e yv > yu + cuv } ys + csv = 0. En particular, el valor de
yv presente al terminar la primera iteracion es finito. Por lo tanto, como en cada iteracion el valor de yv no
cambia o se reemplaza por algo menor entonces al terminar cualquier iteracion del algoritmo, el valor de yv
presente en ese momento es finito para todo v.
Lema 9.4. Si al terminar alguna iteracion del algoritmo se tiene que yv yu + cuv para todo (u, v) E,
entonces G no contiene ciclos dirigidos de costo negativo.
Demostraci on: Supongamos que al terminar alguna iteracion del algoritmo se tenga que yv yu + cuv
para todo (u, v) E.
Si C es un ciclo en G y (u1 , u2 ),(u2 , u3 ), . . . , (un1 , un ), (un , u1 ) son sus ramas entonces
de donde
X
Por lo tanto, para k = 2 + m2 C se tiene que yv(k) (1 + m2 C) = 1 m2 C < m2 C. Si fuera
vX
(k)
yv mC para todo v entonces se tendra que yv(k) m2 C. Luego, para k = 2 + m2 C, existe v tal
v
(k)
que yv < mC y por lo tanto el algoritmo termina a lo sumo en esa iteracion.
Observaci on 9.6. En la practica, los costos no siempre son enteros. Sin embargo, siempre son racionales.
Veamos que siempre podemos utilizar este algoritmo para hallar un ciclo dirigido de costo negativo en G.
En efecto, si ce es un n
umero racional para todo e E, entonces podemos hallar a entero, a > 0, tal que
0
ce = a.ce sea entero para todo e E. Por lo tanto basta resolver el problema equivalente de hallar un ciclo
dirigido de costo negativo en G utilizando c0e como costo de cada rama.
96
Captulo 3
M
aximo flujo - Mnimo corte
Sea G = (V, E) un grafo dirigido y supongamos que hemos fijado dos vertices s y t a los que llamaremos la
fuente y la terminal respectivamente.
Definici
on 1.1. Si e xe es una funcion de E en IR, diremos que x = (xe )eE es un flujo en G. Ademas,
para cada rama e = (u, v) diremos que xe = xuv es el flujo de la rama e.
Definici
on 1.2. Dado un vertice v de G llamaremos
flujo que sale de v a X
xvw
w/(v,w)E
Por abuso de notacion, si v V escribiremos x(v, V ) en lugar de x({v}, V ) y x(V, v) en lugar de x(V, {v}).
De esta manera, x(v, V ) denota el flujo que sale de v y x(v, V ) x(V, v) el flujo neto que sale de v.
Observaci
on 1.3. Si A B = entonces
y
x(C, A B) = x(C, A) + x(C, B)
Lema 1.4. Si el flujo neto que sale de v es nulo para todo v 6= s, t entonces el flujo neto que sale de s es
igual al flujo neto que entra en t.
Demostraci on: Sabemos que x(v, V )x(V, v) = 0 v 6= s, t. Veamos que x(s, V )x(V, s) = x(V, t)x(t, V ).
Por la observacion 1.3. se tiene que
X
x(V, V ) = x(s, V ) + x(t, V ) + x(v, V )
v6=s,t
M
aximo flujo - Mnimo corte 97
y X
x(V, V ) = x(V, s) + x(V, t) + x(V, v)
v6=s,t
Luego, X
0 = x(V, V ) x(V, V ) = x(s, V ) x(V, s) + x(t, V ) x(V, t) + x(v, V ) x(V, v)
v6=s,t
1
3
2
2
s t
1
1
Este flujo satisface las hipotesis del lema 1.4. En este caso el valor del flujo es 4.
2. El problema del m
aximo flujo.
Sea G = (V, E) un grafo dirigido donde hemos fijado dos vertices s y t a los que llamaremos la fuente y la
terminal respectivamente. Supondremos ademas que algunas ramas e = (v, w) tienen asignado un n umero
real positivo ue = uvw al que llamaremos capacidad de la rama e. A las ramas que no tengan restriccion de
capacidades asignamos capacidad infinita. Luego, cada e E tiene asignado un valor ue tal que 0 < ue
(e E).
Describiremos un algoritmo para resolver el siguiente problema:
Encontrar un b-flujo (xe )eE tal que el valor del flujo sea maximo sujeto a la restriccion de que el flujo de
cada rama sea no negativo y no exceda su capacidad, es decir, queremos resolver
0 xvw uvw
y, por lo tanto, lo podramos resolver aplicando el algoritmo simplex. La ventaja sobre el simplex que tiene
el algoritmo que veremos es que produce soluciones enteras cuando los datos son enteros.
98 Optimizaci
on Combinatoria
Describiremos ahora el algoritmo de Ford-Fulkerson, que utilizara ciertos caminos de s a t que llamaremos
caminos aumentativos. Si P es un camino y e E escribiremos por abuso de notacion e P para significar
que e es una rama del camino P.
Dado v V , si P es un camino de s a v y e P, diremos que e tiene la direcci on s v o tambien que e
es directa si al recorrer P desde s hacia v pasamos por la cola de e antes que por la punta.
Analogamente diremos que e tiene la direcci on s v o tambien que e es inversa si al recorrer P desde s
hacia v pasamos por la punta de e antes que por la cola.
Ejemplo 2.1. En el camino de s a t
e6
e5
e2 e4 e7
e1 e3
s t
y
0 < xe e P con direccion s t
Tomando > 0 tal que
min{ue xe / e P con direccion s t}
y
min{xe / e P con direccion s t}
sumando a cada xe tal que e P tiene direccion s t y restando a cada xe tal que e P tiene
direccion s t, obtendremos un nuevo flujo x0 = (x0e ) que tambien sera factible y cuyo valor de flujo sera
igual al valor del flujo x = (xe ) mas . Es decir, tomando
(
xe + si e P es directa
0
xe = xe si e P es inversa
xe si e
/P
resulta que x0 es factible y
valor del flujo x0 = + valor del flujo x
Definicion 2.3. Sea x = (xe ) un flujo en G y sea v un vertice distinto de s. Diremos que un camino simple
P de s a v es un camino aumentativo de x (o simplemente que P es un camino aumentativo cuando no haya
duda de cual es el flujo x del que se trata) sii
y
0 < xe e P que tiene direccion s v
M
aximo flujo - Mnimo corte 99
1(2)
1(1)
1(2)
1(4) 3(4)
2(6) 3(3)
v1 v3
2(5) 3(3)
s 1(7) 2(6)
e1 v2 e4 t
e e3
4(4) 2
4(5) 2(7)
6(9)
2(3) 1(3)
1(2)
4(6)
3(3)
Dejamos como tarea al lector comprobar que el flujo x es factible, con valor 4 y que el camino marcado con
trazo grueso es un camino aumentativo de s a t que nos permitira aumentar el flujo en = 2. En este
camino, las ramas e2 y e3 tienen la direccion s t y las ramas e1 y e4 tienen la direccion s t. Si
sumamos = 2 al flujo de las ramas directas y restamos = 2 al flujo de las ramas inversas obtenemos el
nuevo flujo
(
xe + si e = e2 , e3
x0e = xe si e = e1 , e4
xe si e 6= e1 , e2 , e3 , e4
2(3)
2(2)
1(2)
1(1)
1(2)
1(4) 3(4)
2(6) 3(3)
v1 v3
0(5) 1(3)
s 3(7) 4(6)
e1 v2 e4 t
e e3
4(4) 2
4(5) 2(7)
6(9)
2(3) 1(3)
1(2)
4(6)
3(3)
1(2)
1(1)
1(2)
1(4) 3(3) 3(4)
2(6)
0(5)
s 3(7)
1(3) t
4(6)
4(4)
4(5) 2(7)
6(9)
2(3) 1(3)
1(2)
4(6)
3(3)
y usando el camino aumentativo de s a t indicado con trazo grueso podemos volver a aumentar el valor del
flujo en = 3. En este camino la cuarta y quinta ramas son inversas y las restantes ramas son directas.
Luego el nuevo flujo sera
2(3)
2(2)
1(2)
1(1)
1(2)
4(4) 0(3) 0(4)
5(6)
0(5)
s 6(7)
1(3) t
4(6)
4(4)
4(5) 5(7)
9(9)
2(3) 1(3)
1(2)
4(6)
3(3)
x0 (s, V ) x0 (V, s) = 5 + 4 = 9 = 6 + 3 = 6 +
En la seccion 4. veremos este algoritmo en detalle. Daremos condiciones que garantizan un STOP (en
principio, este algoritmo podra no detenerse nunca) y probaremos que si en alguna iteracion no existe un
camino aumentativo de x de s a t entonces el flujo x presente en ese momento es maximo.
Sea G = (V, E) un grafo dirigido con fuente s y terminal t y donde cada rama e = (v, w) E tiene asignada
una capacidad ue = uvw , donde 0 < ue .
Recordemos que si A es un subconjunto del conjunto de vertices del grafo dirigido G, el corte definido por
A es el conjunto
A = {(v, w) E / v A w / A}
De ahora en mas solo consideraremos cortes definidos por conjuntos A que contengan a la fuente y no a la
terminal, es decir, tales que s A y t
/ A. Denotaremos por A al complemento de A respecto de V .
Definicion 3.1. Sea A un corte tal que s A y t / A. Definimos la capacidad del corte A como la suma
de las capacidades de las ramas del corte, es decir,
X X
u(A, A) = ue = uvw
eA vA,wA
(v,w)E
Como siempre, diremos que un flujo x en G es factible si satisface las restricciones del problema. Veremos
que el problema del maximo flujo tiene como dual al problema del mnimo corte que consiste en hallar un
corte A de mnima capacidad entre todos los cortes definidos por conjuntos que contienen a s y no a t.
Para probar esto necesitaremos antes algunos resultados.
Lema 3.2. Sea x = (xe ) un flujo factible en G, es decir, tal que x(v, V ) x(V, v) = 0 v 6= s, t y 0 xe ue
e E. Sea A un corte tal que s A y t / A. Entonces
Demostraci
on:
X
x(A, V ) x(V, A) = x(s, V ) x(V, s) + x(v, V ) x(V, v)
vA{s}
Corolario 3.3. Sea x = (xe ) un flujo factible y sea A un corte tal que s A y t
/ A. Entonces el valor
del flujo x es menor o igual que la capacidad del corte A, es decir,
Demostraci
on: Como x(A, A) 0 pues x es factible, por el lema 3.2. se tiene que
Pero por el lema 3.2. x(A, A) x(A, A) = x(s, V ) x(V, s), por lo tanto el valor del flujo x es igual a la
capacidad del corte A.
Ahora s probemos el teorema de dualidad.
Teorema 3.5. (max flow - min cut) Si x es un flujo optimo (es decir, un flujo factible de valor maximo)
entonces el corte A definido por el conjunto A del lema 3.4. es un mnimo corte (es decir, A tiene capacidad
mnima entre los cortes definidos por conjuntos que contienen a s y no a t) y su capacidad es igual al valor
del flujo x.
Demostraci on: Sea x un flujo factible de valor maximo. Si existiera un camino aumentativo de x de s a t
entonces, por la observacion 2.2., podramos aumentar el valor de x. Luego no existe un camino aumentativo
de s a t. Por lo tanto, por el lema 3.4. el corte A tiene capacidad igual al valor del flujo x.
Si B es un corte tal que s B y t / B entonces, por el corolario 3.3., el valor de x es menor o igual que la
capacidad de B, de donde
Luego A es un corte de capacidad mnima entre los cortes definidos por conjuntos que contienen a s y no
a t y su capacidad es igual al valor del flujo x.
M
aximo flujo - Mnimo corte 103
En la proxima seccion describiremos el algoritmo de Ford-Fulkerson con mas detalle y mostraremos que
este algoritmo encuentra el mnimo corte cuando resuelve el problema de maximo flujo (es decir, cuando el
algoritmo resuelve el problema del maximo flujo obtiene tambien la solucion al problema dual del mnimo
corte).
4. El algoritmo de Ford-Fulkerson.
Sea G = (V, E) un grafo dirigido con fuente s y terminal t y sea 0 < ue la capacidad de la rama e
(e E) y consideremos el problema del maximo flujo
Proposicion 4.1. Sea x un flujo factible. Entonces x es optimo sii no existe un camino aumentativo de x
de s a t.
Demostraci on: (=) es trivial.
(=) Sea x un flujo factible. Si no existe un camino aumentativo de x de s a t entonces, por el lema 3.4.
existe un corte A tal que s A y t / A cuya capacidad es igual al valor del flujo x. Luego el flujo debe ser
optimo. En efecto, si x0 es un flujo factible entonces, por el corolario 3.3.,
Proposicion 4.2. Si u es entero (es decir, que ue ZZ para todo e E) entonces existe un flujo optimo x
que ademas es entero (es decir, satisface xe ZZ para toda rama e).
Demostraci on: El conjunto de todos los flujos x que son factibles y enteros es no vaco (pues xe = 0 e E
es un flujo factible que es entero) y finito (si x es un flujo factible entero entonces, para cada e E, xe puede
tomar a lo sumo los ue + 1 valores 0, 1, 2, . . . ue ). Sea x un flujo de valor maximo en este conjunto. Basta
ver que x es optimo.
Supongamos que existiera un camino aumentativo de x de s a t. Entonces, como u y x son enteros podramos
aumentar el flujo en un entero (ver observacion 2.2.) y as encontrar un flujo factible entero de mayor valor
que x, cosa que contradice la eleccion de x. Luego, no existe camino aumentativo de s a t y por lo tanto,
por la proposicion 4.1. resulta que x es optimo.
Describiremos ahora en mas detalle el algoritmo para hallar un flujo optimo. Veremos que este algoritmo
resuelve el problema de maximo flujo al mismo tiempo que el problema del mnimo corte. En cada iteracion
del algoritmo se tendra un flujo factible x (tomaremos x = 0 como flujo factible inicial) a partir del cual se
construira el conjunto
del lema 3.4. Una vez hallado el conjunto A correspondiente al flujo x de la presente iteracion, si t
/ A el
algoritmo se detendra. Como t / A entonces no existe camino aumentativo de s a t y por lo tanto el flujo x
de la presente iteracion es optimo por la proposicion 4.1. Dado que x es optimo entonces el corte definido
por el u
ltimo conjunto A generado por el algoritmo (que fue construdo a partir de x) resulta mnimo (ver
teorema 3.5.).
En cambio, si t A entonces existe un camino aumentativo P de s a t. Si todas las ramas de ese camino son
directas y de capacidad infinita entonces el algoritmo se detendra. En este caso es posible aumentar el valor
104 Optimizaci
on Combinatoria
del flujo tanto como se quiera, es decir, no existe un flujo de valor maximo. En el caso en que el camino P
contenga ramas inversas o ramas directas de capacidad finita, supongamos que conocemos las ramas de ese
camino, su direccion y tal que
Entonces el flujo x0 obtenido sumando a cada xe tal que e P es directa y restando a cada xe tal que
e P es inversa, es factible y el valor de x0 = valor de x +. En ese caso reemplazamos el flujo x por x0 y
hacemos una nueva iteracion.
Ahora veamos como hacer para poder determinar, cuando t A, las ramas del camino aumentativo de s a
t, su direccion y el que nos permitira actualizar el flujo para comenzar una nueva iteracion. Para lograr
esto, como buscamos un conjunto A que contenga a s comenzamos ingresando s en A y poniendo (s) = .
Luego, al ingresar cada w en A (notemos que como lo que queremos es construr
Descripci
on del algoritmo.
Observaci on 4.3. Notemos que en el paso 1. del algoritmo tambien puede tomarse como flujo inicial
cualquier flujo factible x.
Observaci on 4.4. Cuando este algoritmo se detiene es por alguna de las siguientes razones:
i) t A y (t) = .
ii) no existe un camino aumentativo de s a t.
En el caso i), no existe un flujo optimo pues hay un camino de s a t formado por todas ramas directas de
capacidad infinita.
En el caso ii), el flujo x presente en la u
ltima iteracion es optimo y A es un mnimo corte.
Pero tambien podra ocurrir que este algoritmo no se detuviera nunca. Sin embargo, si para cada e E ue
es entero o infinito y ademas usv < para todo (s, v) E entonces, partiendo de un flujo inicial entero
(por ejemplo, x = 0) en cada iteracion = (t) resulta finito (pues usv < para todo (s, v) E) y entero
106 Optimizaci
on Combinatoria
positivo. Por lo tanto, en cada iteracion el flujo sera entero y su valor se incrementara en un 1 entero.
Como el valor de cualquier flujo esta acotado pues
X
x(s, V ) x(V, s) x(s, V ) usv
(s,v)E
entonces el algoritmo debe detenerse en un n umero finito de pasos y, como (t) < debe ser porque t / A.
Es decir, el algoritmo encuentra un maximo flujo en un n umero finito de pasos y este flujo resulta ser entero.
Lo mismo ocurre si para cada e E ue es entero o infinito y ademas existe un flujo de valor maximo. En
efecto, basta observar que tambien en este caso (t) es finito en cada iteracion (pues existe un flujo de valor
maximo) y que para cualquier flujo factible x el valor del flujo x(s, V ) x(v, s) esta acotado por el valor del
flujo optimo.
Observaci
on 4.5. Sea x un flujo factible y sea A un corte tal que s A y t
/ A. Entonces
valor de x = capacidad de A xe = ue e A y xe = 0 e A
En efecto, basta observar que xe < ue para alguna rama e A o xe > 0 para alguna rama e A si y solo
P
si x(A, A) x(A, A) < eA ue . Entonces se tiene que
X
x(s, V ) x(V, s) = ue si y solo si xe = ue e A y xe = 0 e A
eA
Observaci on 4.6. En la descripcion que hemos dado del algoritmo se detalla una manera de hallar un
camino aumentativo de s a t, pero claramente podramos usar cualquier otra. En nuestra descripcion, la
b
usqueda del camino aumentativo se hace a lo ancho (breadth-first). Esto produce que el camino hallado
tenga una mnima cantidad de ramas. Cuando ese es el caso, el siguiente teorema garantiza una mejor cota
para la complejidad del algoritmo en el caso en que u es entero.
Teorema 4.7. (Karp) Sean n = #E y m = #V y supongamos que u es entero. Si los caminos aumentativos
usados en el algoritmo de Ford-Fulkerson para hallar un flujo optimo en G tienen un mnimo n
umero de
ramas entonces el numero de iteraciones del algoritmo es a lo sumo m.n.
Luego, si u es entero y los caminos aumentativos utilizados para modificar el flujo se eligen con un mnimo
umero de ramas, la complejidad del algoritmo es O(n2 .m).
n
El siguiente ejemplo muestra como la complejidad puede ser afectada por la forma en que se eligen los
caminos aumentativos.
Ejemplo 4.8. Consideremos el siguiente grafo, donde para cada rama hemos indicado entre parentesis su
capacidad.
M
aximo flujo - Mnimo corte 107
(10000) (10000)
s
(1) t
(10000)
(10000)
En este caso el valor del maximo flujo es 20000. Veamos que puede ocurrir cuando los caminos aumentativos
no se eligen con una mnima cantidad de ramas. Partimos del flujo inicial x = 0 y usamos el camino
aumentativo s b a t
a
0
0
s
0 t
0
0
En este camino todas las ramas son directas. Como la capacidad de la rama (b, a) es 1 entonces = 1.
Sumando = 1 al flujo de (s, b), (b, a) y (a, t) obtenemos el nuevo flujo
a
0 1
s
1 t
1
0
En este camino las ramas (s, a) y (b, t) son directas y la rama (b, a) es inversa. Como xba = 1 entonces = 1.
Sumando = 1 al flujo de las ramas (s, a) y (b, t) y restamos = 1 al flujo de la rama (b, a), obtenemos
108 Optimizaci
on Combinatoria
1 1
s
0 t
1
1
1 2
s
1 t
2
1
2 2
s
0 t
2
2
Es claro que si continuamos de esta manera necesitaremos 20000 iteraciones del algoritmo para llegar al
optimo. En cambio, si los caminos aumentativos son elegidos con un mnimo n
umero de ramas, partiendo
de x = 0 primero usamos el camino aumentativo s a t para aumentar el valor del flujo en = 10000
y obtenemos
a
10000 10000
s
0 t
0 0
y luego usamos el camino aumentativo s b t para aumentar nuevamente el valor del flujo en
M
aximo flujo - Mnimo corte 109
10000 10000
s
0 t
10000
10000
5. Aplicaciones.
Veremos en esta seccion una serie de aplicaciones tanto del problema de maximo flujo como del problema
dual de hallar un mnimo corte.
a. Matching y cover.
Definici
on 5.1. Sea G = (V, E) un grafo. Diremos que un subconjunto M de E es un matching si no hay
dos ramas de M que incidan en un mismo vertice.
Definici
on 5.2. Sea G = (V, E) un grafo. Diremos que un subconjunto C de V es un cover si, para cualquier
rama en E, al menos uno de sus vertices pertenece a C.
Ejemplo 5.3. Dado el grafo
3 7
8
2
4 6
10
1
12
9 11
los conjuntos M1 = {(2, 4), (5, 6), (7, 8)} y M2 = {(1, 2), (4, 6), (5, 10), (7, 8)} son matchings y los conjuntos
C1 = {2, 5, 6, 8} y C2 = {2, 5, 6, 8, 12} son covers.
Lema 5.4. Sea G = (V, E) un grafo. Si M E es un matching y C V es un cover entonces #M #C.
Demostraci
on: Sea : M C la aplicacion definida por
n
u si u C
(u, v) =
v si u
/C
Entonces valen
i) est
a bien definida pues C es un cover: si u
/ C entonces v C.
ii) es inyectiva pues M es un matching.
Luego #M #C.
Definici
on 5.5 Sea G = (V, E) un grafo. Diremos que M E es un m
aximo matching si M es un matching
y #M #M 0 para todo matching M 0 E y diremos que C V es un mnimo cover si C es un cover y
#C #C 0 para todo cover C 0 V .
110 Optimizaci
on Combinatoria
M
aximo matching y mnimo cover en un grafo bipartito.
Sea P un conjunto de hombres y sea Q un conjunto de mujeres. Supongamos que para ciertos pares
(p, q) P Q p y q se gustan mutuamente. Queremos hallar un n
umero maximo de casamientos (suponiendo
ingenuamente que para que dos personas se puedan casar deben gustarse mutuamente).
Representando esta situacion en el grafo bipartito no dirigido G = (V, E), donde V = P Q y donde
E = {(p, q) P Q / p y q se gustan mutuamente } (ver definicion 1.9. del captulo 2) el problema se
traduce en hallar un maximo matching M en el grafo bipartito G (los elementos de M seran los matrimonios
formados).
Por ejemplo, consideremos el grafo bipartito
En este caso, el conjunto de las ramas indicadas con trazo grueso es un matching de cardinal seis.
Resolveremos el problema de hallar un maximo matching en G como aplicacion del problema de maximo
flujo.
Construmos un nuevo grafo dirigido G0 = (V 0 , E 0 ) agregando a G dos vertices s y t (que seran la fuente
y la terminal respectivamente), ramas (s, p) para cada p P y ramas (q, t) para cada q Q. A las ramas
(s, p) y (q, t) les asignamos capacidad 1 y a las ramas (p, q) direccion p q y capacidad infinita, es decir,
usp = 1 = uqt y upq = (p P, q Q)
En el ejemplo anterior el grafo G0 sera
s
Aplicamos el algoritmo de Ford-Fulkerson para hallar un maximo flujo entero x de G0 (ver observacion 4.4.).
Como x es entero, por las capacidades definidas los valores de xsp y xqt solo pueden ser cero o uno. Luego,
M
aximo flujo - Mnimo corte 111
nor p tendra a lo sumo una pareja q: como xpq es entero no negativo para todo (p, q) E 0 y
cada se
X
xsp = x(V, p) = x(p, V ) = xpq
qQ
(p,q)E 0
si xsp = 0 entonces xpq = 0 para todo q. En este caso el se nor p no integra ninguna feliz pareja. En cambio,
si xsp = 1 entonces una y solo una de las flechas (p, q) tendra flujo no nulo e igual a 1. Esa es la se
norita q
que le toca en suerte al se
nor p.
Recprocamente, cada senorita q tendra a lo sumo una sola pareja p, ninguna cuando xqt = 0 y exactamente
una cuando xqt = 1 ya que
X
xpq = x(V, q) = x(q, V ) = xqt
pP
(p,q)E 0
Esto muestra que M = {(p, q) E / xpq = 1} es un matching de G. Notemos ademas que, como xpq = 0 o
1, entonces
X X
#M = x(p, V ) = xsp = valor de x
pP pP
Sea A el u
ltimo conjunto generado por el algoritmo de Ford-Fulkerson antes de detenerse, es decir,
Como todas las ramas de A tienen capacidad 1 entonces se tiene que la capacidad del mnimo corte A es
#(A) = #(P A) + #(Q A).
Por otra parte, si (p, q) E entonces p P A o q Q A. En efecto, si p P A y q Q A entonces
pAyq / A, de donde resultara que (p, q) A cosa que vimos que no puede ocurrir. Esto muestra que
el conjunto C = (P A) (Q A) es un cover de G.
Luego, #C = #(P A) + #(Q A) = capacidad de A = valor de x = #M . Por lo tanto, por la observacion
5.6., resulta que M es un maximo matching, C es un mnimo cover y #M = #C.
Notemos que no solo encontramos un maximo matching M de G sino que tambien hallamos un mnimo
cover del mismo cardinal. Es decir, al mismo tiempo que resolvimos el problema de los matrimonios hemos
demostrado el siguiente
Teorema 5.7. (Konig) En un grafo bipartito no dirigido el cardinal de un maximo matching es igual al
cardinal de un mnimo cover.
b. Cierre
optimo en un grafo dirigido.
Supongamos que tenemos m proyectos y que cada proyecto v tiene asignado un n umero entero bv que
llamaremos beneficio (pero que podra ser negativo a pesar de llamarse beneficio). Supongamos ademas que
hay ciertos proyectos que requieren de la realizacion de otros. Queremos encontrar un subconjunto A de
112 Optimizaci
on Combinatoria
proyectos
X tal que si u A entonces v A para todo proyecto v que se requiera para realizar u y de manera
que bv sea maximo.
vA
Sea G = (V, E) el grafo dirigido cuyos vertices son los proyectos y cuyas ramas son los pares (u, v) tales que
v se requiere para realizar u. Entonces, hallar un subconjunto A de proyectos que satisfaga
uA = vA v que se requiera para realizar u
es lo mismo que hallar un subconjunto A de V tal que el corte definido por A en G sea vaco.
Definicion 5.8. Dado un grafo G = (V, E) diremos que un subconjunto A de V es cerrado si A = . Si,
ademas, cada
X v VX tiene asignado un n
umero real bv diremos que A V es un cierre
optimo en G si A es
cerrado y bv bv para todo subconjunto cerrado A0 de V .
vA vA0
De esta manera nuestro problema se traduce en encontrar un cierre optimo en G. Por ejemplo, si bv 0
para todo v V entonces basta tomar A = V y si bv 0 para todo v V entonces basta tomar A = .
Para resolver este problema construmos, a partir de G, un nuevo grafo G0 agregando dos vertices s y t (la
fuente y la terminal), ramas (s, v) para cada v tal que bv > 0 con capacidad bv y ramas (v, t) para cada v
tal que bv < 0 con capacidad bv . A las ramas de E les asignamos capacidad infinita.
Sea B un mnimo corte en G0 (tal que s B y t / B). Como la capacidad de B es menor o igual que la
capacidad del corte definido por {s} en G0 y todas las ramas de G0 que salen de s tienen capacidad finita,
entonces B es un corte de capacidad finita. Luego, ninguna rama de E puede pertenecer a B ya que esas
ramas tienen capacidad infinita.
Sea A el subconjunto de V definido por A = B {s}. Como el corte definido por B en G0 no contiene
ninguna rama de E entonces el corte definido por A en G no contiene ninguna rama de E, es decir, es vaco.
Esto muestra que A es un subconjunto cerrado de V . Ademas, (s, v) B sii bv > 0 y v
/ A y (v, t) B
sii bv < 0 y v A. Luego, la capacidad del corte es
X X
bv bv =
v A
/ vA
bv >0 bv <0
X X X X
= bv + bv bv bv =
v A
/ vA vA vA
bv 0 bv 0 bv 0 bv <0
X X
= bv bv
vV vA
bv 0
Supongamos ahora que A0 es un subconjunto cerrado de V . Consideremos el corte definido por B 0 = A0 {s}
en G0 . Entonces B 0 no contiene ninguna rama de E (pues A0 es cerrado) y, ademas, (s, v) B 0 sii bv > 0
yv / A0 y (v, t) B 0 sii bv < 0 y v A0 . Luego, la capacidad de B 0 es
X X
bv bv =
/ 0
v A vA0
bv >0 bv <0
X X X X
= bv + bv bv bv =
/ 0
v A vA0 vA0 vA0
bv 0 bv 0 bv 0 bv <0
X X
= bv bv
vV vA0
bv 0
Dado que B era un mnimo corte en G0 entonces su capacidad debe ser menor o igual que la de B 0 de
donde X X X X
bv = bv capacidad de B bv capacidad de B 0 = bv
vA vV vV vA0
bv 0 bv 0
M
aximo flujo - Mnimo corte 113
c. Eligiendo localidades.
Sea G = (V, E) un grafo no dirigido. Supongamos que la eleccion del vertice u implica un costo cu > 0
(u V ) y que la eleccion de una rama (u, v) implica un beneficio buv > 0 ((u, v) E). Queremos elegir un
subconjunto S de V tal que el beneficio neto asociado a esa eleccion definido por
X X
buv cu
(u,v)E uS
uS, vS
sea maximo.
Para resolver este problema creamos un nuevo grafo dirigido G0 = (V 0 , E 0 ) poniendo, para cada vertice u
de G, un vertice u en G0 y, para cada rama (u, v) de G, un u nico vertice uv en G0 . Ahora agregamos dos
vertices mas: la fuente s y la terminal t. Ademas, para cada vertice uv de G0 ponemos una rama dirigida
(s, uv) con capacidad buv y dos ramas dirigidas (uv, u) y (uv, v) con capacidad infinita. Finalmente, para
cada vertice u de G0 ponemos una rama dirigida (u, t) con capacidad cu . Por ejemplo, si G es el grafo no
dirigido
c
a
e
d
Observaci on 5.9. Sea A V 0 tal que s A y t / A. Entonces (s, uv) A sii uv / A (donde uv es el
vertice de G0 correspondiente a la rama (u, v) de G) y (u, t) A sii u V A. Si ademas el corte A tiene
capacidad finita entonces ninguna rama (uv, u) o (uv, v) pertenece al corte.
Luego, si A es un corte de capacidad finita entonces
X X
capacidad de A = buv + cu
uvV 0 / uV A
uv A
/
Entonces X
buv capacidad de A =
uvV 0
X X X
= buv buv cu =
uvV 0 uv A
/ uAV
X X
= buv cu =
uvA uAV
X X
= buv cu
(u,v)E/ uAV
uAV, vAV
Sea ahora x un flujo en G0 de valor maximo y sea A el correspondiente mnimo corte. Entonces la capacidad
de A es finita ya que es menor o igual que la capacidad del corte definido por {s}. Veamos que A verifica
uv A sii u A V , v A V y (u, v) E:
Sea uv V 0 . Si uv A, como A es de capacidad finita entonces (uv, u) / A y (uv, v) / A. Luego,
0
u A V y v A V . Ademas, (u, v) E pues uv V .
Recprocamente, si u A V , v A V y (u, v) E entonces uv V 0 . Como el valor de x es igual a la
capacidad de A, por la observacion 4.5. se tiene
xe = ue e A y xe = 0 e A
Supongamos que uv / A. En tal caso (s, uv) A y (uv, u), (uv, v) A, de donde xs uv = buv > 0 y
xuv u = 0 = xuv v .
Entonces 0 = xuv u + xuv v = x(uv, V 0 ) = x(V 0 , uv) = xs uv = buv . Absurdo, pues buv > 0. Luego uv A.
Por lo tanto, A es un corte de capacidad finita y verifica uv A sii u A V y v A V . Luego, por la
observacion 5.10 vale
X
buv capacidad de A =
uvV 0
X X
= buv cu
(u,v)E/ uAV
uAV, vAV
es maximo.
d. Asignaci
on de tareas.
Supongamos que se desea realizar m tareas en n das. Sea pu el n umero de horas necesarias para realizar
la tarea u (1 u m) y sea qv el n umero de horas disponibles en el da v (1 v n). Supongamos
ademas que cada tarea u no puede iniciarse antes del da su ni terminarse despues del da tu . Las tareas no
necesariamente deben realizarse en un mismo da, pero una parte de la tarea u (que podra ser toda) puede
asignarse al da v sii su v tu . El problema consiste en determinar si la asignacion de tareas es factible
y, en tal caso, hallar una solucion factible del problema.
Representaremos la situacion en un grafo dirigido bipartito G = (V, E) donde V = { tareas } { das } y haya
una rama (u, v) cuando parte de la tarea u puede asignarse al da v (es decir, cuando su v tu ). Sea xuv
la cantidad de horas del da v que se dedicaran a la realizacion de una parte (que podra ser toda) de la
tarea u. Entonces la asignacion de tareas es factible sii existe x tal que
X
xuv = pu u
v
X
xuv qv v (1)
u
xuv 0 (u, v) E
Para averiguar si existe una solucion factible creamos un nuevo grafo dirigido G0 agregando al grafo G dos
vertices s y t, para cada tarea u una rama (s, u) con capacidad pu y para cada da v una rama (v, t) con
capacidad qv . A las ramas de (u, v) E les asignamos capacidad infinita.
116 Optimizaci
on Combinatoria
Proposici on 5.11. El problema de asignacion de tareas es factible si y solo si G0 tiene un flujo x de valor
maximo que satisface xsu = pu para toda tarea u. En tal caso, (xuv ) es una solucion factible de (1).
X
Demostraci on: Si el problema es factible y xuv es una solucion de (1) tomando xsu = pu y xvt = xuv
X u
se tiene que x es un flujo factible en G0 , es decir es un b-flujo (pues x(u, V ) = xuv = pu = xsu = x(V, u)
X v
para toda tarea u y, para todo da v, x(V, v) = xuv = xvt = x(v, V )) y para toda rama e de G0 , xe es no
u X
negativo y menor o igual que la capacidad de la rama (pues xsu = pu y xvt = xuv qv ).
u
Ademas, como no existe un camino aumentativo de x de s a t pues para cada tarea u vale xsu = pu =
capacidad de la rama (s, u) entonces el valor de este flujo debe ser maximo.
Recprocamente, si x es un flujo de valor maximo que satisface xsu = pu para toda tarea u entonces xuv 0,
X
xuv = x(u, V ) = x(V, u) = xsu = pu
v
y X
xuv = x(V, v) = x(v, V ) = xvt qv
u
x(v, V ) x(V, v) = bv v V
0 xe ue (e E)
y, por lo tanto, una condicion necesaria para que el problema sea factible (es decir, para que exista x) es que
valga X
bv = 0
vV
Para resolver este problema creamos, a partir del grafo G = (V, E), un nuevo grafo dirigido G0 de la siguiente
manera: agregamos a V dos vertices s y t (que seran la fuente y la terminal), para cada v tal que bv > 0
agregamos una rama (s, v) con capacidad bv y, para cada v tal que bv < 0 agregamos una rama (v, t) con
capacidad bv . A las ramas de e E les asignamos capacidad ue .
on 5.13. El problema del transshipment es factible sii G0 tiene un flujo maximo x que verifica
Proposici
xsu = bu u / bu > 0
xut = bu u / bu < 0
on: G0 = (V 0 , E 0 ), donde
Demostraci
V 0 = V {s, t}
y
E 0 = E {(s, u) / bu > 0} {(u, t) / bu < 0}
xsu = bu u / bu > 0
xut = bu u / bu < 0
xsu = bu u / bu > 0
xut = bu u / bu < 0
resulta que (xe )eE 0 es un flujo maximo de G0 . En efecto, para toda rama e E 0 xe es no negativo y no
excede la capacidad de la rama. Ademas, es un b-flujo: para todo u V 0 , u 6= s, t es
0 0 x(u, V ) x(V, u) xsu si bu > 0 bu xsu si bu > 0
x(u, V ) x(V , u) = = =0
x(u, V ) x(V, u) xut si bu < 0 bu + xut si bu < 0
Por u
ltimo, x es de valor maximo ya que para las ramas que salen de s se tiene xsu = bu = capacidad de la
rama (s, u).
118 Optimizaci
on Combinatoria
0
Corolario
X 5.14.
X El problema del transshipment es factible si y solo si G tiene un flujo maximo de valor
bu y bu = 0.
u / bu >0 u
X X X
xsu bu u / bu > 0 y xsu = xsu = valor de x = bu
u / bu >0 (s,u)E 0 u / bu >0
X X X
Ademas, como bu = 0 entonces bu = bu de donde resulta que xut = bu u / bu < 0
u u / bu >0 u / bu <0
pues xut bu u / bu < 0 y
X X
xut = xut = x(V 0 , t) x(t, V 0 ) =
u / bu <0 (u,t)E 0
X X X
= x(s, V 0 ) x(V 0 , s) = valor de x = bu = bu = (bu )
u / bu >0 u / bu <0 u / bu <0
xsu = bu u / bu > 0
xut = bu u / bu < 0
y por lo tanto se tiene que (xe )eE es una solucion al problema del transshipment (ver demostracion de la
proposicion 5.13.).
y el n
umero de partidos que u gano jugando contra los equipos 1, 2, . . . , u 1 es
X X
(1 xvu ) = (u 1) xvu
v / (v,u)E v / (v,u)E
Luego, (1 , . . . , n ) es factible sii existe x = (xuv )(u,v)E entero tal que 0 xuv 1 y
X X
xuv + (u 1) xvu = u
v / (u,v)E v / (v,u)E
Sea G0 el grafo dirigido creado a partir de G agregando dos vertices s y t, ramas (s, u) con capacidad bu para
los u tales que bu > 0 y ramas (u, t) con capacidad bu para los u tales que bu < 0 y asignando capacidad 1
a cada rama e E.
Entonces, por el corolario 5.15., (1 , . . . , n ) es factible sii G0 tiene un flujo maximo entero de valor
X X
bu = u + (1 u)
u / bu >0 u / u +(1u)>0
X
y bu = 0 sii G0 tiene un flujo maximo de valor
u
X
u + (1 u)
u / u +(1u)>0
X X
n
y u = , ya que las capacidades de G0 son enteras (ver proposicion 4.2.) y la condicion bu = 0
2
u
X u
n
es equivalente a la condicion u = .
u
2
120 Optimizaci
on Combinatoria
g. Un problema de circulaci
on.
Dado un grafo dirigido G = (V, E) donde cada rama e E tiene asignado un n
umero real no negativo ke y
una capacidad ue (0 < ue ), queremos hallar x = (xe )e E que verifique
x(w, V ) x(V, w) = 0 w V
ke xe ue e E
x(w, V ) x(V, w) = 0 w 6= s, t
(2)
ke x e u e e E
Veamos como adaptar el algoritmo de maximo flujo para poder resolver este problema. Para comenzar,
ahora x = 0 no es una solucion factible y por lo tanto deberemos hallar de alguna manera una solucion
factible inicial. Por otra parte, para poder obtener soluciones factibles para este nuevo problema deberemos
ademas modificar la definicion de camino aumentativo en la forma:
Un camino P de s a v es un camino aumentativo de x sii
y
ke < xe e P que tiene direccion s v
y
min{xe ke / e P es inversa}
3. Para cada (v, w) A tal que xvw < uvw poner w A y etiquetar w en la forma
Para cada (w, v) A tal que xwv > kwv poner w A y etiquetar w en la forma
este nuevo algoritmo encontrara una solucion optima del problema si partimos de una solucion factible inicial
x, es decir, si reemplazamos el paso
1. x = 0
por
1. x = x
donde x es cualquier solucion factible inicial que conozcamos. Luego, basta decir como hallar una solucion
factible inicial.
Para ello, consideremos el nuevo grafo G0 = (V, E 0 ) que se obtiene agregando al grafo G = (V, E) una rama
de t a s, tomemos kts = 0 y uts = , y resolvamos el problema de circulacion
x(w, V ) x(V, w) = 0 w V
(3)
ke xe ue e E0
Observemos que si (xe )e E 0 es una solucion de (3) entonces (xe )e E es una solucioX
n factible de (2).
Recprocamente, si (xe )e E es una solucion factible de (2) entonces tomando xts = xsw se obtiene
w
una solucion de (3). En efecto, es claro que kts xts uts . Ademas
x(w, V ) x(V, w) = 0 w 6= s, t
X X
x(s, V ) x(V, s) = xsw = xsw xts = 0
w/(s,w)E 0 w/(s,w)E
y, por el lema 1.4., como (xe )e E es una solucion factible de (2), en G se tiene que el flujo neto que entra en
t es igual al flujo neto que sale de s, es decir,
X X X
xwt xtw = xsw
w/(w,t)E w/(t,w)E w/(s,w)E
Luego, para hallar la solucion factible inicial del algoritmo basta resolver el problema de circulacion definido
por (3), que puede plantearse como un problema de transshipment. Recordemos que cuando este problema
tiene solucion, podemos hallarla (ver observacion 5.14.).
122 Optimizaci
on Combinatoria
X
min cij xij
i,j
n
X
xij ai (1 i m)
j=1 (4)
Xm
xij = bj (1 j n)
i=1
xij 0 i, j
X X
Observemos que para que el problema sea factible debe ser bj ai , ya que
j i
X XX XX X
bj = xij = xij ai
j j i i j i
X X
Para simplificar el problema supondremos que vale la igualdad, es decir, supondremos que bj = ai .
j i
Si esto X
no ocurriera,
X agregando una nueva localidad n + 1 con ci n+1 = 0 para todo 1 i m, tomando
bn+1 = ai bj y considerando el problema
i j
m n+1
X X
min cij xij
i=1 j=1
n+1
X
xij = ai (1 i m)
j=1
(5)
Xm
xij = bj (1 j n + 1)
i=1
xij 0 i, j
es solucion de (5).
X
min cij xij
i,j
n
X
xij = ai (1 i m)
j=1 (P)
Xm
xij = bj (1 j n)
i=1
xij 0 i, j
Sean x = (x11 , . . . , x1n , . . . , xm1 , . . . , xmn ), b = (a1 , . . . , am , b1 , . . . , bn ), c = (c11 , . . . , c1n , . . . , cm1 , . . . , cmn ) y
A IRm+nmn la matriz
1 1 ... 1 0 0 ... 0 ...... 0 0 ... 0
0 0 ... 0 1 1 ... 1 ...... 0 0 ... 0
.. .. .. ..
. . . .
0 0 ... 0 0 0 ... 0 ...... 1 1 ... 1
A=
1 0 ... 0 1 0 ... 0 ...... 1 0 ... 0
0 1 ... 0 0 1 ... 0 ...... 0 1 ... 0
.. .. .. ..
. . . .
0 0 ... 1 0 0 ... 1 ...... 0 0 ... 1
es decir,
U1 U2 . . . Um
A=
In In . . . In
donde Uk IRmn es la matriz que tiene unos en la fila k y ceros en las restantes filas e In IRnn es la
matriz identidad.
Entonces (P) puede escribirse en la forma
min cx
Ax = b
x0
Escribiendo la variable del problema dual en la forma y = (u1 , . . . , um , v1 , . . . , vn ) y numerando las filas y
columnas de A en forma consecuente con las variables, es decir, en orden, las columnas de A son las columnas
11, 12, . . . , 1n, . . . , m1, m2, . . . mn y las filas de A son las filas 1, . . . , m, m + 1, . . . , m + n resulta que en cada
columna ij la matriz A tiene un 1 en las filas i y m + j y ceros en las restantes filas. Luego, como vj es la
coordenada m + j de y se tiene que yA c es el sistema ui + vj cij . Esto muestra que el problema dual
de (P)
max yb
yA c
es
m
X n
X
max ai ui + bj vj
i=1 j=1 (D)
ui + vj cij (1 i m, 1 j n)
Recordemos que, por el teorema de holgura complementaria (ver teorema 4.9. del captulo 1), dos soluciones
factibles x de (P) y (u, v) de (D) seran optimas si y solo si [cij (ui +vj )]xij = 0 i, j (1 i m, 1 j n).
124 Optimizaci
on Combinatoria
Luego, si x y (u, v) son optimas de (P) y (D) respectivamente entonces, para todo i, j tal que cij (ui +vj ) > 0
debe ser xij = 0. Por lo tanto, si x y (u, v) son optimos y si A = {(i, j) / cij (ui + vj ) = 0} se tiene que
X X m
X n
X
xij = xij = ai = bj
(i,j)A i,j i=1 j=1
Sea ahora (u, v) una solucion cualquiera de (D) y sea A = {(i, j) / cij (ui + vj ) = 0}.
Sean X = {d1 , d2 , . . . , dm } (depositos) e Y = {l1 , l2 , . . . , ln } (localidades). Consideremos el grafo dirigido
Guv = (V, E) donde V = XY {s, t} y E = {(di , lj ) / (i, j) A}{(s, di ) / 1 i m}{(lj , t) / 1 j n}.
Asignemos capacidad ai a las ramas (s, di ), capacidad bj a las ramas (lj , t) y capacidad infinita a las ramas
(di , lj ) ((i, j) A)). Por ejemplo, si m = 5, n = 10 y A = {(1, 2), (1, 4), (3, 1), (5, 2), (5, 7), (5, 10)} el grafo
sera
l1
d 1
l2
l3
d2
l4
l5
s d3 t
l6
l7
d4
l8
d5 l9
l10
Sea x un flujo optimo en Guv . Para cada 1 i m, 1 j n sean xsi = xs di y xjt = xlj t y, para cada
(i, j) A, sea xij = xdi lj .
m
X m
X
Notemos que valor de x = xsi ai ya que xsi ai para todo i.
i=1 i=1
Ademas
m
X X X X
valor de x = xsi = x(V, di ) = x(di , V ) = xij
i=1 i i (i,j)A
X m
X
Luego, xij = valor de x ai .
(i,j)A i=1
m
X
Si valor de x = ai , tomando xij = 0 para todo (i, j)
/ A (1 i m, 1 j n) se tiene que (xij ) es
i=1
m
X X m
X
una solucion optima de (P). En efecto, si valor de x = ai , entonces xij = ai .
i=1 (i,j)A i=1
X X m
X
xij = xij = ai
i,j (i,j)A i=1
M
aximo flujo - Mnimo corte 125
Ademas,
n
X X
xij = xij = xsi ai
j=1 j/(i,j)A
m
X X
xij = xij = xjt bj
i=1 i/(i,j)A
x0
X X X
Luego, como xij = ai = bj entonces debe ser
i,j i j
n
X m
X
xij = ai y xij = bj
j=1 i=1
n
X m
X X m
X n
X
(ya que si para alg
un i fuese xij < ai o para alg
un j fuese xij < bj entonces xij < ai = bj ).
j=1 i=1 i,j i=1 j=1
Luego, (xij ) es una solucion factible de (P) que satisface xij = 0 para todo (i, j)
/ A, es decir, xij = 0 para
todo (i, j) tal que cij (ui + vj ) > 0, de donde [cij (ui + vj )]xij = 0. Entonces, x y (u, v) son soluciones
factibles de (P) y (D) respectivamente que satisfacen la condicion de holgura complementaria. Por lo tanto,
x es un optimo de (P) (y (u, v) lo es de (D)).
m
X
Supongamos ahora que valor de x < ai
i=1
Sea B el mnimo corte correspondiente al flujo optimo x y sean I = {i / di B} y J = {j / lj B}.
Como las flechas (di , lj ) correspondientes a los (i, j) A tienen capacidad infinita entonces ninguna de ellas
pertenece al corte B ya que
X
capacidad de B = valor de x < ai <
i
Luego, como s B y t
/ B se tiene que
B = {(s, di ) / i
/ I} {(lj , t) / j J}
de donde
X m
X X
bj < ai ai
jJ i=1 iI
/
y
X n
X X
ai < bj bj
iI
/ j=1 jJ
126 Optimizaci
on Combinatoria
es decir, X X
bj < ai
jJ iI
y X X
ai < bj
iI
/ j J
/
Ahora construmos una nueva solucion factible (u, v) de (D) tal que
m
X n
X m
X n
X
ui ai + v j bj > ui ai + vj b j
i=1 j=1 i=1 j=1
(es decir, una nueva solucion factible de (D) con un valor mayor del funcional) y, a partir del conjunto
A0 = {(i, j) / cij (ui + v j ) = 0}, construmos el grafo Guv = (V, E 0 ), tomando V = X Y {s, t} y
E 0 = {(di , lj ) / (i, j) A0 } {(s, di ) / 1 i m} {(lj , t) / 1 j n}.
Xm
Si se verifica que valor de x = / A0
ai para un flujo optimo x del grafo Guv , tomando xij = 0 para (i, j)
i=1
tendramos una solucion optima de (P). En caso contrario, repetimos el procedimiento.
Veamos ahora como construr (u, v).
Sean
ui + si i I vj si j J
ui = vj =
ui si i
/I vj + si j
/J
donde > 0 sera elegido de manera que (u, v) sea una solucion factible de (D). Notemos que cualquiera sea
> 0 el valor del funcional en la nueva solucion (u, v) sera mayor que el valor del funcional en (u, v). En
efecto, como X X X X
bj < ai y ai < bj
jJ iI iI
/ j J
/
se tiene
m
X n
X
u i ai + v j bj =
i=1 j=1
X X
= (ui + )ai + (ui )ai +
iI iI
/
X X
+ (vj )bj + (vj + )bj =
jJ j J
/
m
X n
X X X X X
= u i ai + vj bj +
ai bj
+
bj a
i >
i=1 j=1 iI jJ j J
/ iI
/
| {z } | {z }
>0 >0
m
X n
X
> u i ai + vj bj
i=1 j=1
ui + v j cij
Si i
/ I entonces
ui + v j = ui + vj ui + vj cij
M
aximo flujo - Mnimo corte 127
Lo mismo ocurre si j J. Por lo tanto basta considerar el caso i I, j / J donde debe verificarse que
ui + vi + 2 cij .
Observemos que si i I y j / J entonces (i, j)
/ A. En efecto, si (i, j) A entonces la rama (di , lj ) sera
una rama de Guv . Pero I = {i / di B} y J = {j / lj B}. Luego, como i I y j / J entonces di B y
lj
/ B, de donde (di , lj ) sera una rama de Guv que pertenecera al corte B, cosa que no puede ocurrir ya
que esta rama tiene capacidad infinita. Por lo tanto (i, j) / A con lo cual ui + vj < cij . Tomando
cij (ui + vj )
= min / i I, j
/J
2
entonces se verifica que > 0 y ui + vi + 2 cij para todo i I, j
/ J y se tiene que
ui + v j cij i, j
n o
cij (ui +vj )
Notemos que existen i I y j / J (es decir, 2 / i I, j
/ J es no vaco) pues si I = o
X
J = {1, 2, . . . , n} entonces se tendra que valor de x = ai . En efecto, si I = entonces, para todo i,
i
di
/ B de donde, para todo i, noXexiste camino
X aumentativo de s a di . Luego, debe ser xsi = ai para todo
i y, por lo tanto, valor de x = xsi = ai . Analogamente, si J = {1, 2, . . . , n} entonces, para todo j,
i i
lj B, es decir, para todo j existe un camino aumentativo a lj y, como t / B entonces ese camino seguido
de la rama (lj , t) no
X puede ser
X un camino
X aumentativo.
X Por lo tanto, para todo j debe ser xjt = bj , con lo
cual valor de x = xsi = xjt = bj = ai .
i j j i
ltimo observemos que, para hallar un flujo optimo en Guv , puede aplicarse el algoritmo de Ford-
Por u
Fulkerson utilizando como flujo factible inicial al flujo x0 en Guv definido por
x0si = xsi i
x0jt = xjt j
x0ij = xij (i, j) A0 A
x0ij =0 (i, j) A0 A
En efecto, basta ver que x0 es un flujo factible en Guv .
Notemos que xij = 0 para todo (i, j) A A0 . En efecto, supongamos que (i, j) A A0 . Si i I y j J
o si i /Iyj / J entonces cij (ui + v j ) = cij (ui + vj ), lo que no puede ocurrir ya que cij (ui + v j ) 6= 0
pues (i, j) / A0 y cij (ui + vj ) = 0 pues (i, j) A. Y si i I y j / J entonces di B y lj / B y, como
(di , lj ) es una rama de Guv pues (i, j) A entonces se tendra que (di , lj ) B, cosa que tampoco puede
ocurrir ya que B no contiene ramas de capacidad infinita. Luego se tiene que i / I y j J, de donde
di / B y lj B. Por lo tanto, (di , lj ) es una rama de Guv (pues (i, j) A) y ademas (di , lj ) B. Como
valor de x = capacidad de B ya que x es un flujo maximo en Guv y B es el correspondiente mnimo corte,
por la observacion 4.5. se tiene que xij = 0 (i, j) B. Luego, xij = 0 para todo (i, j) A A0 .
Luego, como x0ij = 0 para todo (i, j) A0 A, x0ij = xij para todo (i, j) A0 A, xij = 0 para todo
(i, j) A A0 y x es un flujo factible en Guv , se tiene
X X X X
x0 (di , V ) = x0ij = x0ij + x0ij = x0ij =
j/(i,j)A0 j/(i,j)A0 A j/(i,j)A0 A j/(i,j)A0 A
X X X
= xij = xij + xij =
j/(i,j)A0 A j/(i,j)A0 A j/(i,j)AA0
X
= xij = x(di , V ) = x(V, di ) = xsi = x0si = x0 (V, di )
j/(i,j)A
128 Optimizaci
on Combinatoria
y X X X X
x0 (V, lj ) = x0ij = x0ij + x0ij = x0ij =
i/(i,j)A0 i/(i,j)A0 A i/(i,j)A0 A i/(i,j)A0 A
X X X
= xij = xij + xij =
i/(i,j)A0 A i/(i,j)A0 A i/(i,j)AA0
X
= xij = x(V, lj ) = x(lj , V ) = xjt = x0jt = x0 (lj , V )
i/(i,j)A
Descripci
on del algoritmo primal-dual para resolver el problema del transporte.
1. Tomar una solucion factible inicial (u, v) cualquiera de (D), por ejemplo, ui = 0, vj = min cij . Hallar
i
A = {(i, j) / cij (ui + vj ) = 0}. Inicializar x0 = 0.
2. Construr el grafo Guv = (V, E) con vertices V = {d1 , d2 , . . . , dm } {l1 , l2 , . . . , ln } {s, t} y ramas
E = {(di , lj ) / (i, j) A} {(s, di ) / 1 i m} {(lj , t) / 1 j n}. Asignar capacidad ai a las ramas
(s, di ), capacidad bj a las ramas (lj , t) y capacidad infinita a las ramas (di , lj ) ((i, j) A)).
3. Hallar un flujo x de valor maximo en el grafo Guv , aplicando el de Ford-Fulkerson con x0 como flujo
factible inicial.
X m
Si valor de x = ai STOP (en este caso tomando xij = xdi lj para (i, j) A y xij = 0 para (i, j) / A se
i=1
obtiene una solucion optima del problema).
4. Sea B el u
ltimo conjunto construdo por el algoritmo de Ford-Fulkerson (es decir, el que define el mnimo
corte correspondiente al flujo optimo x hallado en el paso 3. cuyos elementos son s y todos los vertices que
pueden ser alcanzados por un camino aumentativo n de x). o
c (u +v )
Hallar I = {i / di B}, J = {j / lj B} y = min ij 2i j / i I, j / J . Poner
ui + si i I vj si j J
ui = vj =
ui si i
/I vj + si j
/J
que salen de s tienen capacidad entera, partiendo del flujo factible inicial x0 = 0 que es entero. Supongamos
ahora que el maximo flujo x obtenido en la k-esima iteracion sea entero y veamos que esto tambien vale
en la iteracion k + 1: sea x el maximo flujo obtenido en la iteracion k + 1. Entonces, nuevamente por la
observacion 4.4., x es entero ya que se obtiene aplicando el algoritmo de Ford-Fulkerson a un grafo cuyas
ramas tienen capacidades enteras o infinitas y que satisface que las ramas que salen de s tienen capacidad
entera, partiendo del flujo factible inicial x0 que es entero pues x0 esta definido por
x0si = xsi i
x0jt = xjt j
x0ij = xij (i, j) A0 A
x0ij =0 (i, j) A0 A
y sean A0 = {(i, j) / cij (ui + v j ) = 0}, B 0 el mnimo corte correspondiente al maximo flujo x en Guv ,
I 0 = {i / di B 0 } y J 0 = {j / lj B 0 }.
Como valor de x = valor de x entonces el flujo inicial x0 en Guv definido por
x0si = xsi i
x0jt = xjt j
x0ij = xij (i, j) A0 A
x0ij =0 (i, j) A0 A
Por lo tanto x = x0 ya que x se obtiene aplicando el algoritmo de Ford-Fulkerson utilizando como flujo inicial
el flujo x0 que ya es optimo. Luego, los elementos de B 0 son s y todos los vertices que pueden ser alcanzados
por un camino aumentativo de x0 .
on: B B 0
Afirmaci
Demostraci on: Sea w B, w 6= s. Entonces, como B es el mnimo corte correspondiente al flujo optimo
x en Guv , existe en Guv un camino P aumentativo de x de s a w. Probaremos que este camino es un camino
aumentativo de x0 de s a w en Guv , de donde resulta que w B 0 .
130 Optimizaci
on Combinatoria
En efecto, si (di , lj ) es una rama de P entonces (i, j) A (pues (di , lj ) es una rama de Guv ) y ademas i I
y j J (pues la parte P de s hasta di es un camino aumentativo de x en Guv de s a di , con lo cual di B
y la parte de P de s hasta lj es un camino aumentativo de x en Guv de s a lj , con lo cual lj B). Luego,
ui = ui + y v j = vj , de donde cij (ui + v j ) = cij (ui + vj ) = 0 pues (i, j) A. Por lo tanto
(i, j) A0 . Entonces (di , lj ) es una rama de Guv y ademas vale que x0ij = xij ya que (i, j) A A0 .
Ademas, si (s, di ) es una rama de P entonces es claro que tambien es una rama de Guv y vale x0si = xsi .
Como P no puede contener ramas del tipo (lj , t) ya que t / B esto muestra que P es un camino aumentativo
0
de x de s a w en Guv como queramos probar.
Luego, B B 0 como habamos afirmado y, por lo tanto, se tiene que I I 0 y J J 0 .
n o
c (u +v ) ci0 j0 (ui0 +vj0 )
Recordemos que = min ij 2i j / i I, j / J . Sean i0 I y j0 / J tales que = 2 .
Luego
ci0 j0 (ui0 + v j0 ) = ci0 j0 (ui0 + + vj0 + ) = ci0 j0 (ui0 + vj0 ) 2 = 0
de donde resulta que (i0 , j0 ) A0 , es decir, (di0 , lj0 ) es una rama de Guv . Como esta rama tiene capacidad
infinita entonces no puede pertenecer al corte B 0 que tiene capacidad finita y como di0 B 0 (pues i I I 0 )
entonces lj0 B 0 , es decir, j0 J 0 . Como j0
/ J, esto muestra que J J 0 y J 6= J 0 . Por lo tanto #J < #J 0
de donde #J 0 #J + 1.
Por otra parte, como valor de x = valor de x entonces
X X X X
ai + bj = valor de x = valor de x = ai + bj
/ 0
iI jJ 0 iI
/ jJ
Captulo 4
Flujo de mnimo costo
1. Introducci
on.
Sea G = (V, E) un grafo dirigido. Supongamos que cada rama e E tiene asignada una capacidad ue ,
0X < ue y un costo ce y que cada vertice v tiene asignado un n
umero real bv . Supondremos ademas que
bv = 0. Queremos encontrar un flujo x = (xe ) tal que
v
x(v, V ) x(V, v) = bv v V
0 xe ue e E
X
y de manera que ce xe sea mnimo. En otras palabras, queremos resolver el problema de programacion
eE
lineal X
min cvw xvw
(v,w)E
X X
xvw xwv = bv v V
w / (v,w)E w / (w,v)E
x(v, V ) x(V, v) = bv
y
{e E / ave = 1} = {e / v es la punta de e} = {(w, v) E / w V }
132 Optimizaci
on Combinatoria
entonces la fila v de Ax es
X X X
ave xe = xe xe =
e e/ave =1 e/ave =1
X X
= xvw xwv = x(v, V ) x(V, v)
w/(v,w)E w/(w,v)E
min cx
Ax = b
0xu
e1 e5
1 e3 e4
4
e2
e6
2
Sea b = (b1 , b2 , b3 , b4 ). Entonces, si elegimos el orden (1, 3), (1, 2), (3, 2), (2, 3), (3, 4), (2, 4) para las columnas
de A la matriz de incidencia vertice-rama es
1 1 0 0 0 0
0 1 1 1 0 1
A=
1 0 1 1 1 0
0 0 0 0 1 1
es decir,
x13 + x12 = b1
x12 x32 + x23 + x24 = b2
x13 + x32 x23 + x34 = b3
x34 x24 = b4
que es el sistema
x(1, V ) x(V, 1) = b1
x(2, V ) x(V, 2) = b2
x(3, V ) x(V, 3) = b3
x(3, V ) x(V, 3) = b4
Flujo de mnimo costo 133
Observaci on 1.2. Sea A IRmn una matriz que tiene n columnas distintas tales que en en cada una de
ellas hay un solo 1, un solo -1 y los restantes coeficientes son nulos. Entonces existe un grafo dirigido G con
m vertices y n ramas tal que A es la matriz de incidencia vertice-rama de G. Por ejemplo
1 0 0 1 1
0 1 0 0 1
A=
1 0 1 0 0
0 1 1 1 1
1
4
Ademas, si A Rmn es una matriz de coeficientes ceros y unos tal que en cada columna los unos aparecen
en forma consecutiva y b es un vector cualquiera de IRm entonces el sistema Ax = b es equivalente al sistema
A0 x = b0 , donde [A0 | b0 ] se obtiene de [A | b] haciendo la transformacion de filas
y se verifica que A0 IR(m+1)n tiene en cada columna un solo 1, un solo -1 y los restantes coeficientes nulos,
un grafo con m + 1 vertices y n ramas y b0 IRm+1
es decir, es una matriz de incidencia vertice-rama de alg
m+1
X
verifica b0i = 0. Por ejemplo, si
i=1
1 1 1 0 0 | 1
[A | b] = 0 1 1 1 1 | 5
0 0 1 0 1 | 1
entonces
1 1 1 0 0 | 1
0 0 1 0 0 1 1 | 4
[A | b ] =
0 1 0 1 0 | 6
0 0 1 0 1 | 1
Esto significa que si A es una matriz que tiene en cada columna un solo 1, un solo -1 y los restantes coeficientes
nulos y b es un vector tal que la suma de sus coordenadas es cero o si A es una matriz de coeficientes ceros y
unos tal que en cada columna los unos aparecen en forma consecutiva y b es un vector cualquiera entonces,
dados c y u, el problema
min cx
Ax = b
0xu
puede expresarse como un problema de flujo de mnimo costo en alg
un grafo G.
Ejemplo 1.3. Las fabricas 1 y 2 producen 80 y 70 unidades de un cierto producto que deben ser trans-
portadas a los depositos 3 y 4, los que demandan 60 y 90 unidades respectivamente. El transporte puede
134 Optimizaci
on Combinatoria
realizarse en forma directa por tren, con capacidad ilimitada, o por camion, en cuyo caso debe pasarse nece-
sariamente por un centro de distribucion 5 y no pueden transportarse mas de 50 unidades por vez. Sea cij
el costo de transportar una unidad de i a j y sea xij la cantidad de unidades que deben transportarse de i a
j. Queremos determinar cuanto debe valer x = (xij ) de manera tal que el costo del transporte sea mnimo.
Podemos representar la situacion en el grafo
1 3
5
2 4
donde asignamos capacidad infinita a las ramas (1, 3), (1, 4), (2, 3) y (2, 4) (transporte por tren) y capacidad
50 a las restantes ramas (transporte en camion).
Sean b = (80, 70, 60, 90, 0), u13 = u14 = u23 = u24 = y u15 = u53 = u25 = u54 = 50. Entonces el
problema puede escribirse X
min ce xe
eE
x(i, V ) x(V, i) = bi i V
0 xe ue e E
Luego, este es un ejemplo de un problema de flujo de mnimo costo.
Ejemplo 1.4. El problema del transporte que vimos en el captulo 3 es un problema de flujo de mnimo
costo. En efecto, el problema X
min cij xij
i,j
n
X
xij = ai (1 i m)
j=1
Xm
xij = bj (1 j n)
i=1
xij 0 i, j
m
X n
X
donde se supone que ai = bj , puede escribirse
i=1 j=1
X
min cij xij
i,j
n
X
xij = ai (1 i m)
j=1
m
X
xij = bj (1 j n)
i=1
xij 0 i, j
m
X n
X
donde se verifica ai + bi = 0.
i=1 i=1
Flujo de mnimo costo 135
Sea G = (V, E) el grafo definido por V = {d1 , d2 , . . . , dm , l1 , l2 , . . . , ln } (un vertice para cada deposito y cada
localidad) y E = {(di , lj ) / 1 i m, 1 j n} y sea (a1 , . . . , am , b1 , . . . , bn ) el vector que representa
la oferta y la demanda, cuyas coordenadas suman cero. Sea xij el flujo de la rama (di , lj ). Como
n
X
x(di , V ) = xij
j=1
x(V, di ) = 0
x(lj , V ) = 0
Xm
x(V, lj ) = xij
i=1
las ecuaciones
n
X
xij = ai (1 i m)
j=1
m
X
xij = bj (1 j n)
i=1
se escriben
x(di , V ) x(V, di ) = ai (1 i m)
x(lj , V ) x(V, lj ) = bj (1 j n)
Esto muestra que el problema del transporte es un problema de flujo de mnimo costo.
Ejemplo 1.5. Un avion recorre las ciudades 1,2,3 y 4 en ese orden. Para cada i < j sea uij el n umero
de personas que desean viajar de i a j y sea cij el costo del pasaje de i a j. Sea r el numero de pasajeros
que caben en el avion. El objetivo es determinar la cantidad de pasajes xij de i a j que conviene vender de
P P
manera que cij xij sea maximo, es decir, tal que (cij )xij sea mnimo sujeto a las restricciones
x12 + x13 + x14 r
x13 + x14 + x23 + x24 r
x14 + x24 + x34 r
0 xij uij
(al partir de cada ciudad la cantidad de pasajeros a bordo del avion debe ser a lo sumo r).
Agregando a cada desigualdad una variable de holgura podemos escribir las restricciones en la forma
x12 + x13 + x14 + s1 = r
x13 + x14 + x23 + x24 + s2 = r
x14 + x24 + x34 + s3 = r
0 xij uij
0 si
Escribimos el sistema
x12 + x13 + x14 + s1 = r
x13 + x14 + x23 + x24 + s2 = r
x14 + x24 + x34 + s3 = r
en la forma Ax = b, donde
1 1 1 0 0 0 1 0 0 | r
[A | b] = 0 1 1 1 1 0 0 1 0 | r
0 0 1 0 1 1 0 0 1 | r
136 Optimizaci
on Combinatoria
y x = (x12 , x13 , x14 , x23 , x24 , x34 , s1 , s2 , s3 ). Como A es una matriz de coeficientes ceros y unos tal que en
cada columna los unos aparecen en forma consecutiva, aplicando la transformacion de filas
min c0 x
A0 x = b0
0xu
con u = (u12 , u13 , u14 , u23 , u24 , u34 , , , ) (ya que las variables de holgura no tienen restricciones de
capacidad), c0 = (c12 , c13 , c14 , c23 , c24 , c34 , 0, 0, 0) y donde A0 es una matriz de incidencia vertice-
rama de algun grafo y la suma de las coordenadas de b0 es cero. Luego, este problema tambien puede
plantearse como un problema de flujo de mnimo costo.
Ejemplo 1.6. El problema de maximo flujo visto en el captulo anterior es un caso particular del problema
de flujo de mnimo costo. En efecto, agregando al grafo una rama de t a s con capacidad uts = el problema
de maximo flujo puede plantearse en la forma
min xts
x(v, V ) x(V, v) = 0 (v V )
0 xe ue
Sea G = (V, E) un grafo dirigido donde cada rama e tiene asignada una capacidad ue (0 <Xue ) y
un costo ce y cada vertice v tiene asignado un n
umero real bv . Supongamos ademas que bv = 0 y
v
consideremos el problema de hallar un flujo x en G de mnimo costo sujeto a las restricciones
x(v, V ) x(V, v) = bv v V
0 xe ue e E
En esta seccion hallaremos condiciones necesarias y suficientes para que una solucion factible sea optima.
Para ello usaremos el teorema de holgura complementaria (captulo 1, teorema 4.9.).
Teorema 2.1. Sea x una solucion factible. Entonces x es una solucion optima si y solo si existe (yv )vV
que verifica las dos siguientes condiciones
i) xvw > 0 = cvw + yv yw 0
ii) xvw < uvw = cvw + yv yw 0
Flujo de mnimo costo 137
Demostraci
on: Supongamos primero que uvw < para todo (v, w) E y escribamos el problema en la
forma
min cx
Ax = b
(1)
x u
x 0
donde A es la matriz de incidencia vertice-rama de G. Agregando una variable de holgura para cada
condicion xe ue , es decir, reemplazando cada condicion xe ue por la ecuacion xe + se = ue , el problema
es equivalente al problema de programacion lineal en forma standard
donde I es la matriz identidad que tiene una fila y una columna para cada rama e E. El problema dual,
con variables (y, z) es
max (y, z).(b, u)
A 0 (D)
(y, z). (c, 0)
I I
es decir,
max by + uz
yA + zI c
zI 0
Recordemos que A tiene una columna por cada rama de G y que en la columna correspondiente a una
rama (v, w) los coeficientes de A son todos nulos salvo los correspondientes a las filas v y w que son 1 y -1
respectivamente. Luego, las restricciones del dual son
Dado (yv )vV , si cvw = cvw + yv yw ((v, w) E) entonces (y, z) es una solucion factible de (D) si y solo si
o, equivalentemente,
zvw min {cvw , 0} ((v, w) E)
Ademas, si (y, z) es una solucion optima de (D) entonces zvw = min {cvw , 0} para todo (v, w) E. En efecto,
supongamos que zvw < min {cvw , 0} para alg un (v, w) E. Sea > 0 tal que zvw + 0 y zvw + cvw .
Sea z 0 el vector definido por
ze si e 6= (v, w)
ze0 =
zvw + si e = (v, w)
Entonces (y, z 0 ) es una solucion factible del dual y by +uz 0 = by +uz +uvw . > by +uz, lo que contradice
la optimalidad de (y, z).
Ahora estamos en condiciones de probar que si x es una solucion factible de (1) entonces x es una solucion
optima si y solo si existe (yv )vV que verifica las condiciones i) y ii).
138 Optimizaci
on Combinatoria
(=) Supongamos que x es una solucion optima de (1) y sea s = u x (recordemos que estamos suponiendo
que uvw < para todo (v, w) E). Entonces (x, s) es una solucion optima de (P). Sea (y, z) una solucion
optima del dual y sea cvw = cvw + yv yw para cada (v, w) E. Entonces las condiciones i) y ii) pueden
escribirse
i) xvw > 0 = cvw 0
ii) xvw < uvw = cvw 0
Como (y, z) es una solucion optima de (D) se verifica que zvw = min {cvw , 0} para todo (v, w) E y ademas,
por el teorema de holgura complementaria se tiene que
A 0
(x, s) (c, 0) (y, z). =0
I I
Como A tiene una columna por cada rama de G y en la columna correspondiente a una rama (v, w) los
coeficientes de A son todos nulos salvo los correspondientes a las filas v y w que son 1 y -1 respectivamente,
esto es equivalente a
xvw [cvw + yv yw zvw ] = 0
svw .zvw = 0
es decir,
xvw [cvw zvw ] = 0
svw .zvw = 0
Luego, si xvw > 0 entonces cvw = zvw = min {cvw , 0} de donde cvw 0 y si xvw < uvw entonces svw > 0
con lo cual 0 = zvw = min {cvw , 0} de donde cvw 0, es decir, se satisfacen i) y ii).
(=) Supongamos ahora que existe (yv )vV que verifica i) y ii). Sean c y z los vectores definidos por
Entonces (y, z) es una solucion factible del dual. Luego, por el teorema de holgura complementaria, para ver
que x es optimo basta mostrar que (x, s) e (y, z) satisfacen la condicion de holgura complementaria
A 0
(x, s) (c, 0) (y, z). =0
I I
es decir, satisfacen
xvw [cvw zvw ] = 0
svw .zvw = 0
Si xvw = 0 entonces claramente se satisface la primera ecuacion y, como xvw = 0 < uvw la condicion ii)
garantiza que cvw 0, de donde zvw = min {cvw , 0} = 0 y por lo tanto tambien se satisface la segunda
ecuacion.
Si xvw = uvw entonces svw = 0 (luego se satisface la segunda ecuacion) y como vale xvw = uvw > 0, por la
condicion i) resulta que cvw 0, de donde zvw = min {cvw , 0} = cvw y por lo tanto tambien se satisface la
primera ecuacion.
Por u
ltimo, si 0 < xvw < uvw entonces por i) y ii) resulta que cvw = 0 con lo cual zvw = min {cvw , 0} = 0 y
por lo tanto tambien en este caso se satisfacen ambas ecuaciones.
Sea L = {(v, w) E / uvw = }. Entonces las condiciones xvw uvw en (1) son superfluas para (v, w) L
y no tiene sentido agregar variables de holgura para ellas. En este caso (1) es equivalente a
min cx
Ax = b
x u (e E L)
x 0
Sea n = #E y sea k = #(E L). Ahora, agregando una variable de holgura para cada una de las k
condiciones xe ue (e E L), es decir, reemplazando cada una de estas condiciones por la igualdad
xe + se = ue , el problema es equivalente a
donde I 0 tiene una fila por cada rama e E L, una columna por cada rama e E y es la matriz que
resulta de eliminar en I las filas correspondientes a las ramas e L (donde I es la matriz identidad que
tiene una fila y una columna por cada rama e E), el vector u0 resulta de eliminar en u las coordenadas ue
(e L) y la matriz Ik es la matriz identidad que tiene una fila y una columna por cada rama de capacidad
finita, es decir, por cada una de las k ramas de E L.
Por ejemplo, si el grafo es
1
2
e3
e1 e2
4 e5
e4
3 e6 5
y e1 , e3 , e5 y e6 son las ramas de capacidad finita (es decir, L = {e2 , e4 }) entonces agregando una variable
de holgura para cada rama e / L el problema puede plantearse en la forma
6
X
min cei xei + 0.se1 + 0.se3 + 0.se5 + 0.se6
i=1
xe1
1 0 1 0 0 0 b1
xe2
0 1 0 0 1 0 b2
x
1 1 0 1 0 1 . e3 = b 3
xe4
0 0 1 1 0 0 b4
xe5
0 0 0 0 1 1 b5
xe6
xe1 + se1 = ue1
xe3 + se3 = ue3
xe5 + se5 = ue5
xe6 + se6 = ue6
xe 0 (e E)
se 0 (e E L)
140 Optimizaci
on Combinatoria
es decir,
zvw min {cvw , 0} ((v, w) E L)
cvw 0 ((v, w) L)
donde cvw = cvw + yv uw y vale
Si (y, z) es una solucion optima del dual entonces zvw = min {cvw , 0} para toda rama (v, w) E L y
cvw 0 para toda rama (v, w) L.
(=) Supongamos que x es una solucion optima de (1) y, para cada e E L, sea se = ue xe . Entonces
(x, s) es optimo de (P). Si (y, z) es una solucion optima del dual entonces se verifican las condiciones de
holgura complementaria, que en este caso son
xvw [cvw zvw ] = 0 ((v, w) E L)
xvw .cvw = 0 ((v, w) L)
svw .zvw = 0 ((v, w) E L)
Verifiquemos que esto implica que valen las condiciones i) y ii):
i) si xvw > 0 entonces cvw 0 (para (v, w) E L la demostracion es la misma que en el caso en que todas
las capacidades eran finitas y para (v, w) L vale porque de la segunda ecuacion resulta que cvw = 0).
ii) si xvw < uvw entonces cvw 0 (para (v, w) L vale ya que (y, z) es una solucion factible del dual cuyas
restricciones son
zvw min {cvw , 0} ((v, w) E L)
cvw 0 ((v, w) L)
y para (v, w) E L la demostracion es igual que en el caso u < ).
(=) Supongamos ahora que existe (yv )vV que verifica i) y ii). Sean c y z los vectores definidos por
cvw = cvw + yv yw ((v, w) E)
zvw = min {cvw , 0} ((v, w) E L)
Luego (y, z) es una solucion factible del dual (ya que si (v, w) L entonces xvw < uvw de donde cvw 0).
Entonces, por el teorema de holgura complementaria, para ver que x es optimo basta mostrar que (x, s) e
(y, z) satisfacen las condiciones de holgura complementaria
xvw [cvw zvw ] = 0 ((v, w) E L)
xvw .cvw = 0 ((v, w) L)
svw .zvw = 0 ((v, w) E L)
La validez de la primera y tercera ecuacion se prueba de la misma manera que en el caso u < .
Para la segunda basta ver que si xvw > 0, con (v, w) L, entonces cvw = 0: si xvw > 0 entonces, por i), se
tiene que cvw 0 y como (v, w) L entonces uvw = de donde xvw < uvw . Luego, por ii), cvw 0. Por
lo tanto, cvw = 0.
min c.x
x(v, V ) x(V, v) = bv v V
0 xe ue e E
142 Optimizaci
on Combinatoria
Observacion 3.1. Sea P un camino aumentativo de v a w y sea un n umero real positivo tal que
min{ue xe / e P directa} y min{xe / e P inversa}. Sea x = (x0e ) el nuevo flujo obtenido
0
sumando a cada xe tal que e P es directa y restando a cada xe tal que e P es inversa, es decir,
(
xe + si e P es directa
0
xe = xe si e P es inversa
xe si e
/P
Entonces x0 verifica 0 x0e ue para todo e E y
X X X X
c.x0 = ce x0e = ce xe + ce (xe + ) + ce (xe ) =
eE eP
/ eP / eP /
e directa e inversa
X X X
= ce xe + ce ce = c.x + .c(P)
eE eP / eP /
e directa e inversa
Si ademas P es un circuito, entonces tambien vale que x0 (v, V ) x0 (V, v) = bv v V . Por lo tanto, si P
es un circuito aumentativo de costo negativo entonces el nuevo flujo x0 es factible y verifica c.x0 < c.x. Esto
muestra que si x es un flujo optimo en G entonces G no contiene circuitos aumentativos de costo negativo.
Mostraremos ahora que vale la recproca. Para ello construmos, a partir de G y x, un nuevo grafo G(x)
llamado el grafo residual, donde cada rama tiene asignado un costo. Los vertices del grafo residual son los
vertices de G y las ramas y sus respectivos costos estan definidos en la forma:
a) para cada rama (v, w) de G tal que xvw < uvw creamos una rama (v, w) en G(x) con costo c0vw = cvw .
b) para cada rama (v, w) de G tal que xvw > 0 creamos una rama (w, v) en G(x) con costo c0wv = cvw .
Es decir, para cada (v, w) E tal que xvw = 0, como en este caso vale xvw = 0 < uvw , creamos una rama
direccion v w en G(x) con costo c0vw = cvw , para cada (v, w) E tal que xvw = uvw , como en este caso
xvw = uvw > 0, creamos una rama direccion w v en G(x) con costo c0wv = cvw y para cada (v, w) E
tal que 0 < xvw < uvw creamos dos ramas en G(x), una con direccion v w con costo c0vw = cvw y otra
con direccion w v y costo c0wv = cvw .
Ejemplo 3.2. Sea G el grafo
2
3
1
5 4
Flujo de mnimo costo 143
Para cada rama (i, j) de G denotemos por uij a su capacidad y por cij a su costo. Supongamos que x es un
flujo en G que satisface 0 < x12 < u12 , x23 = u23 , x13 = 0, x52 = u52 , 0 < x43 < u43 , x41 = u41 , x15 = 0 y
x54 = 0 Entonces el grafo residual G(x), donde en cada rama hemos indicado su costo, sera
2
c 12 c23
c12
c 13 3
1
c 52
c43
c 15
c 41
c 43
c 54 4
5
tal que c(P) = c((P)) para todo circuito aumentativo P de G. Por razones de claridad, no definiremos
formalmente esta funcion sino que la mostraremos en los dos siguientes ejemplos.
Ejemplo 3.3. En el grafo del ejemplo 3.2., si P es el circuito aumentativo indicado con trazo grueso
2
3
1
5 4
3
1
5 4
144 Optimizaci
on Combinatoria
x(v, V ) x(V, v) = bv v V
0 xe ue e E
que estudiamos en el captulo 3 y para encontrar un circuito aumentativo de costo negativo en G basta
encontrar un circuito dirigido de costo negativo en G(x) (lo cual puede hacerse utilizando el algoritmo
descripto en la seccion 9 del captulo 2) y luego tomar su imagen inversa por .
Flujo de mnimo costo 145
4. Eliminaci
on de la cota superior.
x(v, V ) x(V, v) = bv v V
0 xe ue e E
min c.x
Ax = b
0x u
donde I 0 es la matriz que resulta de eliminar en la matriz identidad que tiene una fila y una columna por
cada rama e E aquellas filas correspondientes a las ramas e L, el vector u0 resulta de eliminar en u las
coordenadas ue (e L) y la matriz Ik es la matriz identidad que tiene una fila y una columna
por cada rama
A 0
de capacidad finita, es decir, por cada rama e E L. Pero ahora la nueva matriz no es una
I 0 Ik
0
matriz de incidencia vertice-rama y la suma
de las coordenadas del vector (b, u ) no tiene porque ser nula.
x
Veamos como encontrar un sistema A0 . = b0 que sea equivalente a
s
A 0 x b
=
I0 Ik s u0
y donde la matriz A0 sea una matriz de incidencia vertice rama y la suma de las coordenadas del vector b0
sea cero.
A 0
La matriz D = posee n + k columnas (una para cada e E y una para cada e E L) y posee
I 0 Ik
m + k filas (una para cada v V y una para cada e E L).
Examinemos los coeficientes de esta matriz en cada columna. Supongamos que la columna es una de las n
primeras y que e = (v, w) E es la correspondiente rama . Si e / L entonces los u
nicos coeficientes no nulos
en esa columna son los que corresponden a las filas v, w y e = (v, w), que son 1, -1 y 1 respectivamente (es
decir, dve = 1, dwe = 1, dee = 1 y die = 0 para i 6= v, w, e) y si e L entonces los unicos coeficientes no
nulos en esa columna son los que corresponden a las filas v y w, que son 1 y -1 respectivamente (es decir,
dve = 1, dwe = 1 y die = 0 para i 6= v, w). Si, en cambio, la columna es una de las k u ltimas, entonces
corresponde a una rama e E L y en ese caso el u nico coeficiente no nulo en esa columna es el que
corresponde a la fila e que vale 1 (es decir, dee = 1 y die = 0 para i 6= e).
146 Optimizaci
on Combinatoria
A 0 | b
Haciendo en la matriz ampliada del sistema la transformacion de filas
I0 Ik | u0
X
Fu0 = Fu + Fe
eEL /
u es la punta de e
para cada u V que sea la punta de una rama en E L y Fe0 = Fe para cada e E L se obtiene una
matriz (A0 | b0 ) donde A0 tiene en cada columna un 1 y un -1 y los restantes coeficientes nulos y la suma de las
coordenadas de b0 es igual a la suma de las coordenadas de b y por lo tanto es cero. En efecto, examinemos
ahora los coeficientes de A0 en cada columna.
Afirmaci on:
i) Si la columna es una de las n primeras y que e = (v, w) E es la correspondiente rama.
a) Si e / L entonces los u
nicos coeficientes no nulos en esa columna son los que corresponden a las filas v y
e = (v, w), que son 1 y -1 respectivamente.
b) Si e L entonces los unicos coeficientes no nulos en esa columna son los que corresponden a las filas v y
w, que son 1 y -1 respectivamente.
ii) Si la columna es una de las k u ltimas y e = (v, w) E L es la correspondiente rama entonces los
u
nicos coeficientes no nulos en esa columna son los que corresponden a las filas w y e = (v, w) que son 1 y
-1 respectivamente.
Demostraci
on:
i) a) Como dve = 1, dwe = 1, dee = 1 y die = 0 para i 6= v, w, e y la transformacion de filas es
X
Fu0 = Fu + F e0
e0 EL /
u es la punta de e0
para cada u V que sea la punta de una rama en E L y Fe00 = Fe0 para cada e0 E L, entonces
X
die + de0 e si i V , i 6= w
e 0 EL /
i es la punta de e0
X
a0ie = d + de0 e si i = w
we
e0 EL /
w es la punta de e0
die si i E L
(
die + 0 si i V , i 6= w
= dwe + 1 si i = w
die si i E L
1 si iV, i=v
0 si i V , i 6= v, w
= 0 si iV, i=w
0
si i E L, i 6= e
1 si i E L, i = e
Dejamos como tarea al lector la demostracion de i) b) y ii).
Ahora examinemos la columna b0 . Para cada w V , la fila w de b0 es
X
bw + uvw si w es la punta de alguna rama en E L
b0w = v / (v,w)EL
bw si no
Flujo de mnimo costo 147
e4
3 e6 5
6
X
min cei xei + 0.se1 + 0.se3 + 0.se5 + 0.se6
i=1
xe1
1 0 1 0 0 0 b1
xe2
0 1 0 0 1 0 b
x 2
1 1 0 1 0 1 . e3 = b 3
xe4
0 0 1 1 0 0 b4
xe5
0 0 0 0 1 1 b5
xe6
xe1 + se1 = ue1
xe3 + se3 = ue3
xe5 + se5 = ue5
xe6 + se6 = ue6
xe 0 (e E) y se 0 (e E L)
lo que puede escribirse
6
X
min cei xei + 0.se1 + 0.se3 + 0.se5 + 0.se6
i=1
xe1
1 0 1 0 0 0 0 0 0 0 b1
xe2
0 1 0 0 1 0 0 0 0 0 b
x 2
1 1 0 1 0 1 0 0 0 0 e3 b 3
x
0 0 1 1 0 0 0 0 0 0 e4 b 4
xe5
0 0 0 0 1 1 0 0 0 0. = b
xe6 5
1 0 0 0 0 0 1 0 0 0 u
s e1
0 0 1 0 0 0 0 1 0 0 e1 ue3
se 3
0 0 0 0 1 0 0 0 1 0 ue5
se 5
0 0 0 0 0 1 0 0 0 1 ue6
se 6
xe 0 (e E) y se 0 (e E L)
Haciendo la transformacion de filas X
Fu0 = Fu + Fe
eEL /
u es la punta de e
Fe0 = Fe
se obtiene la matriz
1 0 1 0 0 0 0 0 0 0 | b1
0 1 0 0 1 0 0 0 0 0 | b2
0 1 0 1 0 1 1 0 0 0 | b3 + ue1
0 0 0 1 0 0 0 1 0 0 | b4 + ue3
0 0
(A | b ) = 0 0 0 0 0 0 0 0 1 1 | b5 + ue5 + ue6
1 0 0 0 0 0 1 0 0 0 | ue1
0 0 1 0 0 0 0 1 0 0 | ue3
0 0 0 0 1 0 0 0 1 0 | ue5
0 0 0 0 0 1 0 0 0 1 | ue6
6
X
min cei xei + 0.se1 + 0.se3 + 0.se5 + 0.se6
i=1
xe1
1 0 1 0 0 0 0 0 0 0 b1
xe2
0 1 0 0 1 0 0 0 0 0 b2
x
0 1 0 1 0 1 1 0 0 0 e3 b3 + ue1
xe4
0 0 0 1 0 0 0 1 0 0 b4 + ue3
xe5
0 0 0 0 0 0 0 0 1 1 . = b5 + ue5 + ue6
xe6
1 0 0 0 0 0 1 0 0 0 ue1
se 1
0 0 1 0 0 0 0 1 0 0 ue3
se 3
0 0 0 0 1 0 0 0 1 0 ue5
se 5
0 0 0 0 0 1 0 0 0 1 ue6
se 6
xe 0 (e E)
se 0 (e E L)
que puede pensarse como un problema de flujo de mnimo costo en el grafo G0 , donde ninguna rama tiene
restricciones de capacidad
1
e3 2
e1 e2
4 e5
e4
3 5
e6
En efecto, basta tomar para los vertices de G0 el orden 1, 2, 3, 4, 5, e1 , e3 , e5 , e6 y para las ramas el orden
(1, e1 ), e2 , (1, e3 ), e4 , (2, e5 ), (3, e6 ), (3, e1 ), (4, e3 ), (5, e5 ), (5, e6 ) (con lo cual A0 resulta la matriz de incidencia
vertice rama de G0 ) y llamar xe1 al flujo de la rama (1, e1 ), xe2 al flujo de la rama e2 , xe3 al flujo de la rama
(1, e3 ), xe4 al flujo de la rama e4 , xe5 al flujo de la rama (2, e5 ), xe6 al flujo de la rama (3, e6 ), se1 al flujo de
la rama (3, e1 ), se3 al flujo de la rama (4, e3 ), se5 al flujo de la rama (5, e5 ) y se6 al flujo de la rama (5, e6 ).
En este caso el grafo G es conexo y por lo tanto el grafo G0 tambien lo es.
150 Optimizaci
on Combinatoria
5. El m
etodo simplex para un grafo conexo.
Veremos ahora otro algoritmo para resolver el problema del flujo de mnimo costo que puede aplicarse en el
caso en que el grafo G es conexo. Este algoritmo es similar al algoritmo simplex que vimos en el captulo 1.
El papel que antes jugaban las soluciones basicas factibles lo jugaran ahora las tree solutions (ver definicion
5.1. mas abajo) y el que jugaba el correspondiente vector (i1 , . . . , im ) lo jugara un spanning tree de G.
Notemos que cuando E es conexo entonces existe alg un spanning tree de G (ver captulo 2).
Por lo visto en la seccion anterior y teniendo en cuenta la observacion 4.1., podemos suponer que las ramas
no tienen restricciones de capacidad.
Sea G = (V, E) un grafo dirigido y conexo donde cada vertice
Xv tiene asignado un n
umero real bv y cada
rama e E tiene asignado un costo ce . Supondremos que bv = 0. Describiremos un algoritmo que
v
resuelve el problema de programacion lineal en forma standard
min c.x
x(v, V ) x(V, v) = bv v V (2)
xe 0 e E
Definicion 5.1. Diremos que x es una tree solution si es una solucion factible de (2) y existe un spanning
tree T de G tal que xe = 0 para todo e E / e
/ T.
Como dijimos antes, las tree solutions jugaran un papel similar al de las soluciones basicas factibles (ver
definiciones 3.5. y 3.12., captulo 1). Notemos que si x es una tree solution y T es un spanning tree tal
que xe = 0 para e / T , podra ocurrir que xe = 0 para alg
un e T . En este caso diremos que x es una
tree solution degenerada. Las tree solutions degeneradas son el analogo a las soluciones basicas factibles
degeneradas (ver definicion 3.9 del captulo 1).
El siguiente resultado es el analogo al teorema fundamental de la programacion lineal (ver teorema 3.13,
captulo 1).
Teorema 5.2. Se verifican
i) Si (2) tiene una solucion factible entonces tiene una tree solution.
ii) Si (2) tiene una solucion optima entonces tiene una tree solution que es optima.
Demostraci on: i) Sea x una solucion factible de (2).
Si x no es una tree solution entonces E 0 = {e E / xe > 0} contiene por lo menos un ciclo. En efecto, si x no
es una tree solution y E 0 no contiene ciclos, entonce (V, E 0 ) es acclico pero no puede ser un spanning tree de
G. Luego debe ser disconexo. Entonces podemos agregarle ramas de manera que siga siendo acclico hasta
obtener un spanning tree T de G. Observando que xe = 0 para cada una de las ramas e que no pertenecen
a T (ya que toda rama de E 0 es una rama de T ) resulta que T es un spanning tree de G que satisface xe = 0
e / T . Pero esto no puede ocurrir ya que x no era una tree solution. Luego E 0 contiene al menos un ciclo
C.
Sea = min {xe / e C} y sea e0 tal que xe0 = . Luego > 0 y, como no hay restricciones de capacidad,
restando al flujo de las ramas de C que tienen la misma direccion que e0 y sumando al flujo de las ramas
de C que tienen direccion contraria a e0 obtenemos una nueva solucion factible x0 que satisface x0e0 = 0.
Ademas, como x0e = xe para toda rama e / C y C esta contenido en E 0 entonces x0e = 0 e / E 0 . Luego
{e E / x0e > 0} es un subconjunto de E 0 y por lo tanto todo ciclo contenido en el es un ciclo contenido en
E 0 . Como ademas e0 / {e E / x0e > 0} entonces C no es un ciclo contenido en {e E / x0e > 0}.
En resumen, a partir de x hemos construdo una solucion factible x0 tal que {e E / x0e > 0} contiene por
lo menos un ciclo menos que {e E / xe > 0}. Iterando este procedimiento, en un n umero finito de pasos
Flujo de mnimo costo 151
obtendremos una solucion factible x tal que {e E / xe > 0} no contenga ciclos y por lo tanto x sera una
tree solution.
ii) Ahora supongamos que x es una solucion optima de (2).
Si x no es una tree solution entonces {e E / xe > 0} contiene un ciclo C. Como x es optimo el costo
de C debe ser cero. En efecto, si C tuviese costo no nulo entonces, al no haber restricciones de capacidad,
recorriendo C en alguna de las dos direcciones tendramos un circuito aumentativo de costo negativo, lo que
contradice la optimalidad de x (ver observacion 3.1.). Luego, procediendo como en i) podemos encontrar
una solucion factible x0 tal que {e E / x0e > 0} contiene por lo menos un ciclo menos que {e E / xe > 0}
y como c(C) = 0 entonces cx = cx0 , es decir, x0 es tambien una solucion optima de (2). Iterando este
procedimiento un n umero finito de veces obtendremos una tree solution optima.
Fijemos un vertice s en G al que llamaremos raz. Dado un spanning tree T de G, si h es una rama de T
denotaremos por R(T, h) al conjunto formado por la raz s y todos aquellos vertices v de G distintos de s
tales que el u
nico camino en T de s a v no contiene a la rama h. Notemos que s R(T, h).
Lema 5.3. Si v y w son vertices de G y h = (p, q) es una rama de T entonces
{h} si p R(T, h)
{(v, w) T / v R(T, h), w / R(T, h)} =
si p
/ R(T, h)
y
{h} si p / R(T, h)
{(w, v) T / v R(T, h), w / R(T, h)} =
si p R(T, h)
Demostraci on: Probemos la primera iguladad. Si v R(T, h), w / R(T, h) y (v, w) T , entonces el u
nico
camino en T de s a v no contiene a h y el u
nico camino en T de s a w s. Luego, el unico camino en T de s
a v no puede pasar por w y como (v, w) T agregandole la rama (v, w) se obtiene un camino en T de s a
w. Por unicidad, ese debe ser el u
nico camino en T de s a w y como ese camino contiene a h y el camino de
s a v no, entonces debe ser h = (v, w).
Luego, {(v, w) T / v R(T, h), w / R(T, h)} {h} y vale la otra inclusion si y solo si p R(T, h) y
q/ R(T, h).
Luego el resultado se sigue observando que
p R(T, h) y q
/ R(T, h) p R(T, h)
En efecto, si p R(T, h) entonces el u
nico camino en T de s a p no contiene a h. Luego, agregando a ese
camino la rama h T se obtiene el unico camino en T de s a q. Luego el camino en T de s a q contiene a h
y por lo tanto q
/ R(T, h).
La segunda igualdad, que dejamos a cargo del lector, se prueba de manera analoga.
Proposicion 5.4. Sea x una tree solution y sea T un spanning tree de G tal que xe = 0 e
/ T . Entonces
x queda determinada por T .
Demostraci
on: Como xe = 0 e
/ T , para conocer x basta conocer xh para cada h T . Sea h = (p, q) T .
Entonces X
bv si p R(T, h)
vR(T,h)
xh = X
bv si p
/ R(T, h)
vR(T,h)
Luego,
X X X X
bv = xvw xwv =
vR(T,h) vR(T,h) w / (v,w)T w / (w,v)T
X X X X
= xvw + xvw
vR(T,h) wR(T ,h) / vR(T,h) wR(T
/ ,h) /
(v,w)T (v,w)T
X X X X
xwv xwv =
vR(T,h) wR(T ,h) / vR(T,h) wR(T
/ ,h) /
(w,v)T (w,v)T
X X X X
= xvw xwv =
vR(T,h) wR(T
/ ,h) / vR(T,h) wR(T
/ ,h) /
(v,w)T (w,v)T
X X
= xvw xwv
vR(T ,h), wR(T
/ ,h) / vR(T ,h), wR(T
/ ,h) /
(v,w)T (w,v)T
e1 e4 e7
4
1
e2 e6 5
6 e3
7
el unico camino P de 2 a 5 es (e1 , e2 , e4 , e5 , e7 ). En este camino las ramas e4 y e7 son directas y las ramas
e1 , e2 y e5 son inversas. Luego, el u
nico camino P en T de 5 a 2 es el camino (e7 , e5 , e4 , e2 , e1 ) cuyas ramas
directas son e1 , e2 y e5 y cuyas ramas inversas son e4 y e7 .
Observaci on 5.7. Si v y w son dos vertices de G entonces el costo del u
nico camino P en T de v a w es
yw yv . En efecto, esto es claro si v = s o w = s ya que ys = 0 por definicion. Supongamos entonces que
v, w 6= s y sea C el u
nico camino en T de s a v. Entonces yv = c(C).
Si la situacion es
s
v
Flujo de mnimo costo 153
v
s
entonces el u
nico camino de s a w es C seguido de P. Luego, yw = c(C) + c(P) = yv + c(P) y por lo tanto
c(P) = yw yv . Por u
ltimo, si la situacion es
v
s
entonces el u
nico camino de s a w seguido de P es un camino de s a v y por lo tanto debe ser el camino
C. Luego debe ser yw + c(P) = c(C) = yv , es decir, yw c(P) = yv y por lo tanto tambien en este caso
c(P) = yw yv .
Recordemos que si (yv )vV verifica las condiciones del teorema 2.1 entonces x es una solucion optima del
problema. Como en este caso no hay restricciones de capacidad, es decir, ue = para todo e E, entonces
xe < ue e E. Luego las condiciones resultan ser
i) xvw > 0 = cvw + yv yw 0
ii) cvw + yv yw 0 para todo (v, w) E
Proposici on 5.8. Si (yv )vV verifica
i) cvw + yv yw = 0 para todo (v, w) T
ii) cvw + yv yw 0 para todo (v, w) /T
entonces x es optimo.
Demostraci on: Veamos que i) y ii) implican i) y ii). Como xe = 0 e
/ T , si xvw > 0 entonces (v, w) T .
Luego, por i) cvw + yv yw = 0 y por lo tanto vale i).
Veamos ahora que vale ii). Dado (v, w) E, si (v, w) T entonces cvw + yv yw = 0 y si (v, w) / T entonces
cvw + yv yw 0.
Corolario 5.9. Para todo (v, w) T se verifica que cvw + yv yw = 0. Por lo tanto, si (yv )vV verifica
cvw + yv yw 0 para todo (v, w)
/ T entonces x es optimo.
Demostraci on: Sea (v, w) T . Por la observacion 5.7. el costo del unico camino en T de v a w es yw yv .
Pero como (v, w) T este camino debe ser (v, w) cuyo costo es cvw . Luego cvw = yw yv = 0 de donde
cvw + yv yw = 0. Luego, por la proposicion 5.8., si (yv )vV verifica cvw + yv yw 0 para todo (v, w)
/T
resulta que x es optimo.
Supongamos que para alguna rama (v, w) / T sea cvw + yv yw < 0. Entonces el grafo obtenido agregando
a T la rama (v, w) contiene un u
nico ciclo C.
w
s
154 Optimizaci
on Combinatoria
Si recorremos este ciclo en el sentido de (v, w) se tiene que su costo es cvw mas el costo del u
nico camino en
T de w a v, es decir, c(C) = cvw + yv yw (ver observacion 5.7.) y por lo tanto c(C) < 0.
Supongamos que existe al menos una rama inversa en C. Sea = min {xe /e C es inversa}. Entonces 0
y sumando al flujo de las ramas directas y restando al flujo de las ramas inversas obtenemos un nuevo
flujo factible x0 .
w
+
v
+
s
+
+
+
Si e0 C es la rama inversa tal que = xe0 entonces x0e0 = xe0 = 0. Si ahora consideramos el spanning
/ T0
tree T 0 que resulta de quitarle a T la rama e0 y agregarle la rama (v, w) entonces x0e = 0 para todo e
(luego, x0 es una tree solution) y, por la observacion 3.1. se tiene que
cx0 = cx + .c(C) cx
s w
e0
u
s
v
w
Descripci
on del algoritmo.
El algoritmo que describiremos solo se podra aplicar si conocemos una tree solution inicial y su correspon-
diente spanning tree. Veremos mas adelante como encontrar una tree solution inicial que sera lo analogo a
la fase 1 (ver seccion 8 del captulo 1).
Fijemos un vertice s de G. Sea x una tree solution y sea T un spanning tree tal que xe = 0 para todo e / T.
1. Para cada v V , v 6= s calcular el costo yv del u
nico camino en T de s a v, ys = 0.
2. Hallar (v, w)
/ T tal que cvw + yv yw < 0. Si no existe, STOP (en ese caso x es optimo, ver corolario
5.9.).
3. Formar el circuito C agregando a T la rama (v, w). Si recorriendo C en el sentido de (v, w) no hay ramas
inversas STOP (en este caso no existe min cx, ver observacion 5.10.).
4. Calcular = min {xe / e C es inversa}.
5. Si e0 C es una rama inversa tal que = xe0 , poner
yu si u R(T, e0 )
yu0 = yu + cvw + yv yw si u
/ R(T, e0 ) y v R(T, e0 )
yu (cvw + yv yw ) si u / R(T, e0 ) y v
/ R(T, e0 )
6. Actualizar x sumando al flujo de las ramas de C con la misma direccion de (v, w) y restando al flujo de
las ramas con direccion contraria a (v, w). Actualizar T reemplazandolo por el spanning tree que se obtiene
agregandole la rama (v, w) y quitandole la rama e0 y actualizar (yv ) poniendo yv = yv0 . GOTO 2.
Observaci on 5.10. Si no existe ninguna rama inversa en C entonces cualquiera sea > 0, si sumamos al
flujo de todas las ramas de C obtendremos un nuevo flujo factible x0 tal que cx0 = cx + c(C). Como c(C) < 0
esto significa que no existe min cx.
Observaci on 5.11. Si al comenzar una iteracion la tree solution x presente en ese momento satisface xe > 0
para toda rama inversa e C (lo que ocurre, por ejemplo, si x es una tree solution no degenerada) entonces
> 0. En tal caso, la tree solution x0 presente al comenzar la iteracion siguiente que se obtiene sumando
al flujo xe de las ramas e C con la misma direccion de (v, w) y restando al flujo xe de las ramas e con
direccion contraria a (v, w) satisface cx0 = cx + c(C) < cx. Si esto ocurriera en cada iteracion, entonces el
algoritmo terminara en un n umero finito de pasos ya que la cantidad de tree solutions es finita (ver corolario
5.5.). Pero si en alguna iteracion la tree solution presente x fuese degenerada entonces podra ocurrir que
fuese = 0, y por lo tanto cx = cx0 . En este caso el algoritmo podra entrar en un loop. Sin embargo, tal
como ocurre con el simplex, se puede modificar el algoritmo para que esto no ocurra. De esa manera, dado
que hay finitas tree solutions, el algoritmo termina en un n umero finito de pasos. Para mas detalles sobre
este tema ver [Ahuja et al].
min c0 x
x(v, V {s}) x(V {s}, v) = bv v V {s} (3)
x0
156 Optimizaci
on Combinatoria
es una solucion factible de (3) que verifica c0 x = 0. Pero como el valor del funcional en cualquier solucion
factible de (3) es mayor o igual que cero (pues el costo de las ramas es 0 o 1 y el flujo es no negativo) entonces
x es una solucion optima que satisface c0 x = 0.
b) Si x es una tree solution optima de (3) con spanning tree T 0 que verifica c0 x = 0 entonces
Xdebe ser xe = 0
0 0
para toda rama artificial e pues por la forma en que definimos c resulta que c x = xe y por lo
e artif icial
tanto si fuese xe > 0 para alguna rama artificial entonces resultara que c0 x > 0.
Luego, x es una solucion factible de (2) y las ramas que tienen flujo no nulo pertenecen al grafo que se
obtiene eliminando en T 0 las ramas artificiales que contenga y el vertice s.
Veamos ahora que el algoritmo definido por los pasos 1. a 9. nos da un spanning tree T de G tal que xe = 0
para toda e / T.
Flujo de mnimo costo 157
Primero observemos que al quitar las ramas artificiales de T 0 el grafo H resultante tiene como vertices a
todos los vertices de G y es acclico (ya que es un subgrafo de un spanning tree), pero el problema es que
podra no ser conexo.
En cada iteracion, el conjunto A que vamos formando es el conjunto de todos los vertices de G que estan en
la misma componente conexa que v del presente H. Ademas, en cada iteracion el grafo H es acclico pues lo
es el H inicial y cada rama que agregamos no forma ciclo con las del presente H: en efecto, las ramas que
se agregan tienen un vertice u A otro vertice w / A. Luego, si al agregar esa rama se formara un ciclo
entonces existira en H un camino de u a w. Pero como u A entonces existe un camino de v a u el cual,
seguido del camino de u a w nos dara un camino de v a w lo que contradice que w / A. Luego, cuando
A = V el grafo T = H que se tiene en ese momento es conexo y acclico y como partimos de un grafo cuyos
vertices son todos los vertices de G entonces es un spanning tree de G y como las ramas que tenan flujo no
nulo pertenecan al H inicial entonces xe = 0 para todo e / T , lo que muestra que x es una tree solution
con spanning tree T .
Finalmente observemos que si A 6= V entonces el paso 7. siempre se puede realizar. En efecto, sea w tal que
w/ A. Como G es conexo, sea P un camino en G de v a w. Entonces, como v A y w / A alguna rama e
de ese camino tiene un extremo en A y el otro en V A: sea P el camino
u r2
u1 u2
e r1 w
e2
e1 e3
er
u3 u r1
v
si u1
/ A entonces basta tomar e = e1 pues v A, si u1 A y u2 / A entonces basta tomar e = e2 , ..., si
ur2 A y ur1 / A entonces basta tomar e = er1 y si ur1 A entonces basta tomar e = er pues w / A.
Luego, la fase 1 puede describirse como sigue: aplicamos el algoritmo para resolver (3) tomando como tree
solution inicial la definida en la observaci
on 6.1.
Si al terminar el algoritmo obtenemos una tree solution optima de (3) x con spanning tree T 0 , que verifica
c0 x = 0 entonces obtenemos una tree solution x para G y su correspondiente spanning tree en la forma
descripta en la proposicion 6.2. y volvemos a aplicar el algoritmo, ahora para resolver (2) utilizando x como
tree solution inicial. En caso contrario el problema no tiene soluciones factibles.
las cantidades ofrecidas por los depositos son bv1 = 35, bv2 = 50 y bv3 = 40 respectivamente y las demandadas
por los clientes son bw1 = 45, bw2 = 20, bw3 = 30 y bw4 = 30 respectivamente, llamando xij a la
158 Optimizaci
on Combinatoria
cantidad de unidades que se transportan del deposito vi al cliente wj el problema puede plantearse en la
forma X
min cij xij
ij
X
xij bvi
j
X
xij = bwj
i
xij 0
Tal como vimos en el captulo anterior, agregando un cliente de ser necesario, podemos suponer que la
primera ecuacion de las restricciones es una igualdad. Luego podemos suponer que las restricciones son
X
xij = bvi
j
X
xij = bwj
i
xij 0
V = {v1 , v2 , v3 } {w1 , w2 , w3 , w4 }
y
E = {(vi , wj ) / 1 i 3, 1 j 4}
es decir, el grafo
v1 w1
w2
v2
w3
v3
w4
min cx
x(v, V ) x(V, v) = bv v V
xe 0 e E
El siguiente procedimiento, conocido como la regla del noroeste nos permite hallar una tree solution inicial
evitando la fase 1.
Consideremos la matriz
x11 x12 x13 x14
(xij ) = x21 x22 x23 x24
x31 x32 x33 x34
Queremos darle valores no negativos a xij de manera que la suma de los coeficientes de la i-esima fila sea
bvi y la suma de los de la j-esima columna sea bwj . El procedimiento es el siguiente:
1. Ponemos Fi = bvi (1 i 3), Cj = bwj (1 j 4).
2. Consideremos la submatriz U de (xij ) formada por las filas y columnas que todava no han sido fijadas.
Flujo de mnimo costo 159
3. Sea xrs el coeficiente de U que se encuentra mas al noroeste. Entonces actualizamos (xij ) poniendo
xrs = min{Fr , Cs }. Si min{Fr , Cs } = Fr tambien ponemos xrj = 0 para todo xrj que aun no tenga valor
asignado. En caso contrario, ponemos xis = 0 para todo xis que aun no tenga valor asignado.
4. Actualizamos Fr y Cs en la forma Fr = Fr xrs , Cs = Cs xrs . Si Fi = 0 = Cj para todo i, j STOP.
En caso contrario, GOTO 2.
Aplicando esto a nuestro ejemplo obtenemos:
1. F1 = 35, F2 = 50, F3 = 40, C1 = 45, C2 = 20, C3 = 30, C4 = 30
2.
x11 x12 x13 x14
U = x21 x22 x23 x24
x31 x32 x33 x34
3. r = s = 1. Ponemos x11 = min{F1 , C1 } = F1 = 35 y x1j = 0 para todo j 6= 1. Ahora
35 0 0 0
(xij ) = x21 x22 x23 x24
x31 x32 x33 x34
4. F1 = 0, F2 = 0, F3 = 30, C1 = 0, C2 = 0, C3 = 0, C4 = 30
2. Ahora U = ( x34 )
3. r = 3, s = 4. Ponemos x34 = min{F3 , C4 } = F3 = 30 y x3j = 0 para todo x3j que no tenga valor
asignado. Ahora
35 0 0 0
(xij ) = 10 20 20 0
0 0 10 30
4. F1 = 0, F2 = 0, F3 = 0, C1 = 0, C2 = 0, C3 = 0, C4 = 0
De esta manera obtenemos la tree solution inicial
s = v1 35
w1
10
20 w2
v2
20
w3
10
v3
30 w4
donde en cada rama hemos indicado el valor de su flujo. Elijamos cualquier vertice como raz s de este
spanning tree T , por ejemplo s = v1 . Ahora pongamos ys = 0 y calculemos yu para cada u 6= s. Por el
corolario 5.9. para cada i, j tal que (vi , wj ) T se verifica cij + yvi ywj = 0 y ademas 0 = ys = yv1 . Luego,
(yu )uV debe ser solucion del sistema
Como por la u ltima ecuacion yv1 = 0 entonces de la primera resulta que yw1 = 8, de la segunda que yv2 = 1,
de la tercera y cuarta que yw2 = 11, yw3 = 12, de la quinta que yv3 = 4 y de la sexta que yw4 = 1.
Ahora calculemos cij = cij + yvi ywj . para i, j tal que (vi , wj )
/ T . Dejamos a cargo del lector verificar
que c12 = 5, c13 = 2, c14 = 8, c24 = 5, c31 = 2, c32 = 6.
Elegimos e / T tal que ce < 0. Por ejemplo, e = (v3 , w2 ) y formemos el circuito C que resulta agregando e a
T . Recorriendo C en el sentido de e = (v3 , w2 ) las ramas inversas son (v2 , w2 ) con flujo x22 = 20 y (v3 , w3 )
con flujo x33 = 10. Ahora actualizamos el flujo sumando = min{xe / e C es inversa } = 10 al flujo de las
ramas directas y restando al flujo de las ramas inversas de C y luego eliminamos de T la rama (v3 , w3 ) que
ahora tiene flujo nulo y le agregamos la rama (v3 , w2 ). De esta manera obtenemos la nueva tree solution
Flujo de mnimo costo 161
s = v1 35
w1
10
10 w2
v2
30
w3
10
v3
30 w4
Dejamos a cargo del lector el calculo de los nuevos valores de (yu ) y verificar que los nuevos cij son c12 = 5,
c13 = 2, c14 = 2, c24 = 1, c31 = 8, c33 = 6.
Ahora elegimos e / T tal que ce < 0, por ejemplo, e = (v1 , w2 ) y repitiendo el procedimiento anterior (en
este caso = 10, la rama que se elimina es (v2 , w2 ) y la que se agrega es (v1 , w2 ) ) obtenemos la nueva tree
solution
s = v1 25
w1
10
20 w2
v2
30
w3
10
v3 30 w4
Nuevamente dejamos a cargo del lector la actualizacion de (yu ) y verificar que los nuevos valores de cij son
c13 = 2, c14 = 7, c22 = 5, c24 = 4, c31 = 3, c33 = 1.
Eligiendo ahora e = (v1 , w3 ) y repitiendo el procedimiento (ahora = 25, la rama que se elimina es (v1 , w1 )
y la que se agrega es (v1 , w3 )) se obtiene la tree solution
s = v1 w1
10
45 25 w2
v2
5
w3
10
v3
30 w4
que resulta ser optima ya que cij 0 para todo i, j tal que (vi , wj )
/ T.
En este ejemplo hemos usado el hecho de que si T es un spanning tree de un grafo conexo G entonces el
sistema
yw yv = cvw (v, w) T
Proposici on 7.1. Sea A la matriz de incidencia vertice-rama de un grafo conexo G con m vertices y sea
B IRm(m1) la submatriz de A formada por las columnas de A que corresponden a las ramas de un
spanning tree T de G. Entonces existe una matriz B 0 obtenida permutando algunas filas y columnas de B
tal que B 0 es triangular y vale rg A = rg B = rg B 0 = m 1.
Demostracion: Como T es un arbol entonces tiene al menos una hoja u y sea e la u
nica rama que incide
en u. Luego, en la fila u, B tiene una u
nica componente no nula, en la columna e , que vale 1 o -1.
162 Optimizaci
on Combinatoria
donde B10 es la matriz de incidencia del arbol que resulta de suprimir en T la hoja u y la rama e. Luego, B1 es
una matriz de incidencia vertice-rama de un arbol y podemos repetir el procedimiento con B1 . Permutando
si es necesario una fila y una columna de B1 podemos obtener la matriz
..
B2 .
0 0 1
Captulo 5
Programaci
on lineal entera
1. Introducci
on.
Un problema de programacion lineal entera es un problema de programacion lineal con la restriccion adicional
de que algunas de las variables deben tomar valores enteros. Cuando todas las variables deben tomar valores
enteros decimos que se trata de un problema de programacion lineal entera puro, en caso contrario decimos
que es mixto. Diremos que una variable es binaria si solo puede tomar los valores 0 y 1.
Una gran variedad de problemas combinatorios pueden ser planteados como problemas de programacion
lineal entera. Veamos algunos ejemplos.
Se desea cargar en una mochila xj unidades del producto j (1 j n). Supongamos que cada unidad del
producto j tiene asignado un peso pj y un valor vj . Queremos determinar la carga de maximo valor con
la condicion de que el peso total de la carga de la mochila no supere un dado peso P , es decir, queremos
resolver el problema X
max vj xj
j
X
pj xj P
j
xj 0, xj entero
Si ademas agregamos la condicion de que todas las variables xj sean binarias esto resuelve el problema de
elegir un subconjunto de productos con maximo valor cuyo peso total no supere P .
Un centro industrial posee una usina con tres generadores. Supongamos que cada generador i puede operar
a niveles xi de kw/h, 0 xi ai y que conocemos una funcion yi = yi (xi ) que calcula la cantidad de
kilogramos de vapor por hora consumidos en funcion del nivel xi de kw/h al que opera el generador i.
Supongamos ademas que la funcion yi es lineal en el intervalo (0, ai ] y tiene una discontinuidad en el origen,
donde vale cero, es decir, que
ci xi + bi si xi > 0
yi (xi ) =
0 si xi = 0
Esta discontinuidad se debe a que cuando el generador no esta funcionando xi = 0 = yi (xi ) pero para
comenzar a funcionar necesita una cantidad fija bi de vapor para que se ponga en marcha la turbina.
Sea C la cantidad de kw/h requeridos en un momento dado. Queremos determinar cual es el nivel xi al que
debe operarse cada generador i para producir los kw/h requeridos de modo que la cantidad total de consumo
de vapor sea mnima, es decir, queremos resolver el problema
X
min yi (xi )
i
x1 + x2 + x3 = C
0 xi ai
Notemos que este no es un problema de programacion lineal ya que el funcional no es una funcion lineal.
Para resolverlo planteamos un problema auxiliar introduciendo tres variables binarias i que valdran 1 si el
164 Optimizaci
on Combinatoria
generador i esta funcionando y 0 si no. Dejamos a cargo del lector verificar que si (x, ) es una solucion
optima del problema auxiliar X
min ci xi + bi i
i
x1 + x2 + x3 = C
0 xi ai i
0 i 1, i entero
entonces x es una solucion optima del problema original.
Ejemplo 1.3. Condicion either ... or.
Consideremos el problema
max x1 + x2
5x1 + 2x2 10 o x1 + 2x2 4 (1)
xi 0
Observemos que este no es un problema de programacion lineal ya que el conjunto de soluciones factibles no
es convexo:
5 x 1+2 x 2 = 10
x 1+ 2 x = 4
2
Sin embargo, podemos convertirlo en un problema de programacion lineal entera introduciendo una variable
binaria y una constante c adecuada.
Veamos como hacer esto: sea c una constante que satisface
para todo x1 , x2 0. Por ejemplo, en este caso podemos tomar c = 15 ya que dados x1 , x2 0, si
5x1 + 2x2 10 entonces x1 2 y x2 5 de donde x1 + 2x2 12 4 + 15 y si x1 + 2x2 4 entonces x1 4
y x2 2 de donde 5x1 + 2x2 24 10 + 15.
Ahora consideramos el problema de programacion lineal entera
max x1 + x2
5x1 + 2x2 10 + c
x1 + 2x2 4 + c(1 ) (2)
xi 0
0 1, entero
Si (x1 , x2 , ) es una solucion optima de (2), como = 0 o 1 entonces se tiene que (x1 , x2 ) es una solucion
optima de (1). En efecto, si = 0 entonces 5x1 + 2x2 10 y si = 1 entonces x1 + 2x2 4, de donde
resulta que (x1 , x2 ) es una solucion factible de (1). Veamos que es optima. Sea (x1 , x2 ) una solucion factible
de (1). Por la forma en la que elegimos c se tiene
Programaci
on lineal entera 165
i) si 5x1 + 2x2 10 entonces x1 + 2x2 4 + c. Luego, (x1 , x2 , 0) es una solucion factible de (2) y por lo
tanto x1 + x2 x1 + x2 .
ii) si x1 + 2x2 4 entonces 5x1 + 2x2 10 + c. Luego, (x1 , x2 , 1) es una solucion factible de (2) y por lo
tanto x1 + x2 x1 + x2 .
Consideremos el problema
X
min fj (xj )
j
Ax = b
x0
Si fuera fj (xj ) = cj xj se tratara de un problema de programacion lineal. Pero supongamos que las funciones
fj sean contnuas pero no lineales. En tal caso, a cada fj la podemos aproximar por trozos lineales como
indica el siguiente grafico
a+1M1+2M2
a+1M1 2
a+1M1+2M2+3M3 3
1
a
M1 M2 M3
donde Mi > 0 y en cada trozo lineal hemos indicado su pendiente i . Veamos como podemos describir esto.
Hacemos el reemplazo xj = y1 + y2 + y3 , fj = a + 1 y1 + 2 y2 + 3 y3 .
Con las restricciones
0 yi Mi
y1 M1 1
M2 2 y2 M2 1
y3 M3 2
0 i 1, i entero
resulta que
y2 > 0 = y1 = M1
y3 > 0 = y2 = M2
Luego, como xj = y1 + y2 + y3 se tiene que
i) 0 xj M1 y2 = 0 = y3
ii) M1 < xj M1 + M2 y2 > 0, y3 = 0
iii) M1 + M2 < xj M1 + M2 + M3 y3 > 0
En efecto,
i) Supongamos que 0 xj M1 . Si fuese y2 > 0 entonces y1 = M1 de donde xj = M1 +y2 +y3 > M1 . Luego
debe ser y2 = 0. Pero entonces debe ser y3 = 0 ya que si y3 > 0 entonces y2 = M2 > 0. Recprocamente, si
y2 = 0 = y3 entonces xj = y1 y como 0 y1 M1 entonces 0 xj M1 .
166 Optimizaci
on Combinatoria
ii) Supongamos que M1 < xj M1 + M2 . Si fuese y3 > 0 entonces y2 > M2 > 0 y por lo tanto y1 = M1 .
Pero entonces xj = M1 + M2 + y3 > M1 + M2 . Luego debe ser y3 = 0 y, por i), tambien debe ser y2 > 0.
Recprocamente, si y2 > 0 e y3 = 0 entonces y1 = M1 , de donde xj = M1 + y2 y como 0 < y2 M2 entonces
M1 < xj M1 + M2 .
Dejamos al lector la tarea de verificar la validez de iii).
Esto implica que para xj tal que 0 xj M1 estamos reemplazando xj por y1 y fj por a + 1 y1 , es decir,
por el primer trozo lineal, para xj tal que M1 < xj M1 + M2 estamos reemplazando xj por M1 + y2
con 0 < y2 M2 y fj por a + 1 M1 + 2 y2 , es decir, por el segundo trozo lineal y, para xj tal que
M1 + M2 < xj M1 + M2 + M3 estamos reemplazando xj por M1 + M2 + y3 con 0 < y3 M3 y fj por
a + 1 M1 + 2 M2 + 3 y3 , es decir, por el tercer trozo lineal.
Ejemplo 1.5. Variables discretas.
Supongamos que en un problema de programacion lineal queremos agregar la restriccion de que una variable
x solo pueda tomar un numero finito de valores a1 , . . . , ak . Esto se puede describir mediante la introduccion
de k variables binarias 1 , . . . , k y reemplazando x por a1 1 + + ak k con las restricciones
1 + + k = 1
0 i 1 i entero
xj 0 xj entero
Programaci
on lineal entera 167
En la practica este problema no puede resolverse con la condicion de que los valores de xj sean enteros
porque el n umero de columnas de la matriz A = ||aij || es enorme (la cantidad n de patterns es el cardinal
P
del conjunto de m-uplas (a1 , . . . , am ) tales que ai wi 200). Lo que se hace, en general, es resolver el
problema sin la restriccion de que xj sea entero y luego se redondea el resultado. A un as no es facil hallar
la solucion cuando n es muy grande. En ese caso se procede de la siguiente manera:
Como el problema que queremos resolver es
X
min xj
j
X
aij xj bi (3)
j
xj 0
xj , si 0
es decir, en la forma X
min xj + 0s1 + + 0sm
j
x
( A I ) =b
s
x, s 0
entonces el problema dual de (3) resulta ser
max yb
y. ( A I ) ( 1, . . . , 1, 0, . . . , 0 )
| {z } | {z }
n m
es decir,
max yb
y.Aj 1 (4)
y 0
donde Aj es la j-esima columna de A. Ademas, las condiciones de holgura complementaria son
(1 y. Aj ).xj = 0 (1 j n)
yi .si = 0 (1 i m)
Luego, si x es una solucion optima del problema primal e y es el correspondiente optimo del dual, entonces
y 0 e y.Aj 1. Ademas, si x e y son soluciones de los problemas primal y dual respectivamente, y
satisfacen las condiciones de holgura complementaria entonces son optimos.
Supongamos que hemos resuelto el problema utilizando en lugar de la matriz A la submatriz formada por
un subconjunto relativamente peque no {Aj1 , . . . , Ajr } de columnas de A obteniendo una solucion optima
(uj1 , . . . , ujr ) y que v = (v1 , . . . , vm ) es el correspondiente optimo del dual de este nuevo problema.
168 Optimizaci
on Combinatoria
(1 y. Ajt ).ujt = 0 (1 t r)
yi .si = 0 (1 i m)
de donde resulta que u y v satisfacen las condiciones de holgura complementaria del problema original. Luego
u es una solucion optima de (3).
Veamos como determinar si v.Aj 1 para todo 1 j n y que hacer si esto no se satisface.
En primer lugar, resolvemos el problema de la mochila
X
max vi zi
i
X
wi zi 200 (5)
i
zi 0 zi entero
P P
Si el optimo (z 1 , . . . , z m ) de (5) satisface vi z i 1, todos los patterns (a1j , . . . , amj ) satisfacen vi aij 1,
es decir, v.Aj 1 para todo j como queramos (notar que todo pattern es una solucion factible de (5)). En
caso contrario, al terminar el algoritmo para el problema reducido que utiliza, en lugar de la matriz A, la
submatriz formada por las columnas Aj1 , . . . , Ajr de A, lo continuamos, ahora incorporando la columna
1
z1
.
..
zm
(ver captulo 1, seccion 10: utilizando el algoritmo simplex revisado es posible incorporar una columna en
cualquier momento). Como (z 1 , . . . , z m ) es una solucion factible de (5) entonces es un pattern y por lo tanto
P
alguna de las columnas de A, y como estamos suponiendo que vi z i > 1 entonces no es ninguna de las
columnas j1 , . . . , jr . Luego, al continuar el algoritmo incorporando esta columna lo que estamos haciendo es
repetir el proceso anterior, ahora para un problema reducido que utiliza r +1 columnas de A. Repetimos este
procedimiento hasta que el optimo v correspondiente al optimo del problema reducido verifique v.Aj 1
para todo 1 j n.
Ejemplo 1.7. Job scheduling.
Los tubos de acero se elaboran en cuatro etapas sucesivas: laminacion, ajuste, tratamiento termico y roscado.
Se agrupan en lotes, cada uno conteniendo todos los tubos con una misma especificacion tecnica. Cada lote
pasa por las cuatro etapas y, en cada etapa, el orden de procesamiento de los lotes no tiene porque coincidir.
Ademas, entre dos etapas puede haber un stock intermedio.
Supongamos que hay n lotes y sea pik (1 i n, 1 k 4) el tiempo de procesamiento del lote i en la
etapa k. Supongamos ademas que el procesamiento se inicia en el instante cero y sea z el instante en que se
terminan de procesar todos los lotes. Se desea determinar en que instante xik se debe iniciar el proceso del
lote i en la etapa k (1 i n, 1 k 4) de manera tal que el valor de z sea mnimo. Las restricciones a
tener en cuenta son:
i) el procesamiento de un lote no puede iniciarse en una etapa si no ha sido terminado su procesamiento en
la etapa anterior.
Programaci
on lineal entera 169
ii) dos lotes no pueden procesarse simult aneamente en una misma etapa, es decir, para cada par de lotes
i 6= j, el lote i debe haber salido de la etapa k antes de que entre en ella el lote j o viceversa.
min z
xi1 + pi1 xi2
xi2 + pi2 xi3
xi3 + pi3 xi4
xi4 + pi4 z
xik + pik xjk o xjk + pjk xik (i 6= j)
xik 0
Notemos que es la condicion
la que hace que este sea un problema de programacion lineal entera. Historicamente, el planteo del problema
de scheduling llamo la atencion por la simplicidad de su solucion en el caso en que haya dos etapas (ver [Jo,
1954]).
No se ha encontrado una solucion simple para tres o mas etapas. En el caso de dos o tres etapas la solucion
optima tiene la particularidad de que el orden de procesamiento de los lotes es el mismo en todas las etapas.
Supongamos que queremos pintar las distintas regiones de un mapa que esta dibujado sobre un plano de
manera tal que regiones adyacentes esten pintadas de colores distintos. La siguiente figura muestra un
ejemplo donde se necesitan cuatro colores.
Durante 150 a nos se conjeturo que cualquier mapa se poda pintar, con la mencionada restriccion, con a
lo sumo cuatro colores. El esfuerzo hecho para resolver el problema fue uno de los principales motivos del
desarrollo de la teora de grafos. Finalmente, en 1976 se demostro esta conjetura (ver [Ap-Ha, 1978]).
Sea G = (V, E) un grafo no dirigido. Colorear el grafo significa asignar un color a cada vertice i de manera
tal que i y j tengan colores distintos para toda rama (i, j) E.
El mnimo n umero de colores necesarios para colorear a G se llama el numero cromatico de G.
Todo mapa se puede representar en un grafo planar no dirigido (para la definicion de grafo planar ver seccion
3 del captulo 4) donde cada vertice representa una region del mapa y dos vertices estan unidos por una
rama si y solo si las regiones que representan son adyacentes. El teorema de los cuatro colores afirma que el
numero cromatico de cualquier grafo planar es a lo sumo cuatro.
Supongamos ahora que tenemos un grafo no dirigido cualquiera (no necesariamente planar) y queremos ver
si podemos colorearlo con a lo sumo cuatro colores. Sean 0, 1, 2, 3 los cuatro colores. Entonces estos colores
170 Optimizaci
on Combinatoria
son suficientes si y solo si para cada vertice i existe xi {0, 1, 2, 3} (el color asignado al vertice i) tal que
xi 6= xj para todo (i, j) E.
Observando que xi 6= xj si y solo si xi > xj o xj > xi si y solo si 1 xi xj o 1 xj xi , el problema se
traduce en determinar si
1 xi xj o 1 xj xi ((i, j) E)
(6)
0 xi 3, xi entero
es factible. Sean sij , tij ((i, j) E) nuevas variables y consideremos el problema
min z
X
z= sij + tij
(i,j)E
(7)
1 xi xj + sij o 1 xj xi + tij ((i, j) E)
sij , tij 0
0 xi 3, xi entero
Entonces (6) es factible si y solo si (7) tiene una solucion optima tal que z = 0.
Ejemplo 1.9. El problema del viajante.
Un viajante debe visitar las ciudades 1, 2, . . . , n partiendo de la ciudad 0, pasando por cada una de las
ciudades 1, 2, . . . , n una y solo una vez y volviendo luego a la ciudad 0. Sea cij el costo de viajar de la ciudad
i a la ciudad j (0 i, j n). Si no hay camino de i a j tomamos cij = .
A cada una de las posibles maneras de hacer el recorrido la llamamos un circuito Hamiltoniano. Definimos
el costo de un tal circuito como la suma de los costos de los tramos que lo componen. El problema consiste
en hallar un circuito Hamiltoniano de mnimo costo.
Representamos la situacion en un grafo dirigido completo G = (V, E) donde
V = {0, 1, 2, . . . , n}
y asignamos costo cij a cada rama (i, j).
Dado un circuito Hamiltoniano C (es decir, un circuito dirigido en G que pasa por cada vertice una y solo
una vez), para cada (i, j) sea n
ij = 1 si (i, j) C
P 0 si no
Entonces el costo de C es cij ij .
Observemos que para cada vertice i hay una sola rama de C cuya cola es i y una sola rama de C cuya punta
es i. Luego se satisface X
ij = 1 (0 i n)
j
X (8)
ij = 1 (0 j n)
i
Supongamos ahora que para cada (i, j) tenemos definido un ij tal que ij = 0 o ij = 1 y de manera tal
que valga (8).
Si el conjunto de ramas (i, j) tales que ij = 1 fuese un circuito entonces podramos pensar a cada circuito
Hamiltoniano como una solucion factible de
X
ij = 1 (0 i n)
j
X
ij = 1 (0 j n) (9)
i
0 ij 1, ij entero
Programaci
on lineal entera 171
P
cuyo costo es cij ij . Lamentablemente esto no es as, como lo muestra el siguiente ejemplo.
Sea V = {0, 1, 2, 3, 4, 5} y tomemos
01 = 20 = 12 = 34 = 45 = 53 = 1
{(0, 1), (2, 0), (1, 2), (3, 4), (4, 5), (5, 3)}
En este caso ij (0 i, j 5) es una solucion factible de (9) pero el conjunto de ramas (i, j) tales que ij = 1
no forman un circuito sino dos subcircuitos:
0 3
1
4
5
2
Pero agregando la ingeniosa condicion
ui uj + nij n 1 (1 i, j n, i 6= j)
donde ui (1 i n) son n umeros reales nos permitira plantear el problema del viajante por programacion
lineal entera. Esto se debe a que si ij es una solucion factible de (9) entonces existen ui satisfaciendo esta
nueva condicion si y solo si el conjunto de ramas (i, j) tales que ij = 1 es un circuito. En tal caso el costo
P
de ese circuito es cij ij.
Afirmaci
on. El problema de programacion lineal entera
X
min cij ij
X
ij = 1 (0 i n)
j
X
ij = 1 (0 j n) (10)
i
ui uj + nij n 1 (1 i, j n, i 6= j)
0 ij 1, ij entero
Sea ui = 1 si i es la primera ciudad visitada, ui = 2 si i es la segunda ciudad visitada, etc. Por ejemplo, si
n = 5 y el circuito es
0 2 5 3 1 4 0
172 Optimizaci
on Combinatoria
entonces
u1 = 4, u2 = 1, u3 = 3, u4 = 5, u5 = 2
Entonces
ui uj si (i, j)
/C
ui uj + nij =
1 + n si (i, j) C
ya que si (i, j)
/ C entonces ij = 0 y si (i, j) C entonces el viajante visita j justo despues de visitar i, de
donde uj = ui + 1 y como (i, j) C entonces ij = 1.
Luego, como 1 ui n entonces ui uj + nij n 1 para todo i 6= j (1 i, j n).
Esto muestra que cada circuito Hamiltoniano determina una solucion factible de (10).
Recprocamente, supongamos ahora que tenemos una solucion factible de (10). Probaremos que el conjunto
de ramas C = {(i, j) / ij = 1} es un circuito Hamiltoniano. Como cada ij es cero o uno y valen
X
ij = 1 (0 i n)
j
X
ij = 1 (0 j n)
i
ya que cada ui aparece una vez sumando y una vez restando. Ademas, como las ramas de E forman un
subcircuito de C entonces ij = 1 para todo (i, j) E. Por lo tanto,
X
nij = kn
(i,j)E
de donde X X
kn = 0 + kn = ui uj + nij =
(i,j)E (i,j)E
X
= ui uj + nij k(n 1)
(i,j)E
con lo cual se tiene que kn k(n 1), lo que es un absurdo pues k > 0. Luego, cada solucion factible de
(10) determina un circuito Hamiltoniano.
Ejemplo 1.10. Cuadrados latinos ortogonales.
Supongamos que queremos comparar el rendimiento de n variedades de trigo. Si plantamos cada variedad en
una franja del terreno podra ocurrir que el trigo plantado en la primera franja tuviera un alto rendimiento
Programaci
on lineal entera 173
debido a que esa zona del terreno es mas fertil que las otras y no porque esa variedad de trigo sea en realidad
la de mayor rendimiento. Para evitar que las diferencias en la fertilidad del suelo influyan en los resultados
de nuestro experimento, conviene dividir el terreno en n2 parcelas y plantar cada una de las n variedades de
trigo en n parcelas de manera que cada franja (horizontal o vertical) del terreno contenga las n variedades.
Por ejemplo, para n = 3, las variedades a, b y c podran disponerse en la forma
a b c
b c a
c a b
Un cuadrado latino de n n es una disposicion de n smbolos en una matriz de n n de manera tal que
cada smbolo aparezca exactamente una vez en cada fila y en cada columna.
El nombre de cuadrado latino tiene se debe a que Euler utilizaba como smbolos las letras a, b, c . . .
Es facil ver que para cualquier n siempre existe un cuadrado latino de n n. En efecto, basta tomar la
disposicion
1 2 3 ... n 1 n
2 3 4 ... n 1
3 4 5 ... 1 2
. .. .. .. .. ..
.. . . . . .
n 2 n 1 n ... n 4 n 3
n 1 n 1 ... n 3 n 2
n 1 2 ... n 2 n1
Supongamos ahora que queremos estudiar el comportamiento de las tres variedades de trigo a, b, c cuando
se les aplica cada uno de los fertilizantes , , . Para que nuestro experimento no se vea afectado por las
posibles variaciones en la fertilidad del suelo, debemos disponer cada uno de los 9 pares (variedad de trigo,
fertilizante) en las 9 parcelas de manera en cada fila y en cada columna aparezcan todas las variedades de
trigo y todos los fertilizantes, es decir, de manera que tanto las primeras coordenadas como las segundas
formen un cuadrado latino.
Si A = ||aij || y B = ||bij || son dos cuadrados latinos de n n, la matriz de n n cuyo coeficiente en el lugar
ij es el par (aij , bij ) se llama la superposicion de A con B. Por lo tanto, lo que necesitamos es construr
dos cuadrados latinos (uno para las variedades de trigo y otro para los fertilizantes) de forma tal que la
superposicion de ambos contenga todos los posibles pares (variedad de trigo, fertilizante). Por ejemplo, si
consideramos los cuadrados latinos
a b c
b c a
c a b
vemos que su superposicion contiene todos los posibles pares (variedad de trigo, fertilizante)
(a, ) (b, ) (c, )
(b, ) (c, ) (a, )
(c, ) (a, ) (b, )
Se puede demostrar que para todo n 2 hay a lo sumo n 1 cuadrados latinos ortogonales de n n. Si
para un dado n hay exactamente n 1 cuadrados latinos ortogonales decimos que para n hay un sistema
completo. Se sabe que para los n que son potencias de primos siempre hay un sistema completo pero, en
general, para aquellos n que no son potencia de un primo (salvo para algunos casos particulares) no se sabe
a
un si hay o no un sistema completo.
A continuacion daremos un planteo por programacion lineal entera para resolver el problema de determinar,
para un n dado, un par de cuadrados latinos ortogonales de n n.
Supongamos que tenemos dos cuadrados latinos ortogonales A = ||aij ||, B = ||bij ||. Entonces su super-
posicion es la matriz C cuyo coeficiente en el lugar ij es el par (aij , bij ). Sin perdida de generalidad podemos
suponer que aij , bij {1, 2, . . . , n}.
n
1 si aij = k y bij = s
Para cada i, j, k, s (1 i, j, k, s n) sea ijks =
0 si no
Como A y B son cuadrados latinos entonces cada k aparece en una u nica fila y en una u
nica columna de A
y cada s aparece en una u
nica fila y en una u
nica columna de B. Luego se verifican las condiciones
Esto muestra que a cada par de cuadrados latinos le podemos asociar una solucion factible de (11). Notemos
que el sistema lineal en (11) tiene 6n2 ecuaciones con n4 incognitas.
Recprocamente, supongamos que ijks (1 i, j, k, s n) es una solucion factible de (11). Entonces, como
cada ijks es cero o uno resulta que los ijks verifican las condiciones 1) a 6).
Sean A = ||aij || y B = ||bij || las matrices definidas por
Notemos que la validez de la condicion 1) garantiza que A y B estan bien definidas. Ademas, la validez de
las condiciones 2) a 6) implican que A y B son cuadrados latinos ortogonales. Veremos que la condicion 2)
implica que en cada fila de A cada smbolo aparece exactamente una vez y dejamos el resto a cargo del lector.
Dado i, supongamos que existen j 6= j 0 tales que aij = aij 0 . Sean k = aij , s = bij y s0 = bij 0 . Entonces
(aij , bij ) = (k, s) y (aij 0 , bij 0 ) = (k, s0 ), de donde ijks = 1 = ij 0 ks0 , lo que contradice 2).
Esto muestra que podemos construr los dos cuadrados latinos ortogonales buscados a partir de una solucion
factible de (11).
La dificultad de este problema radica en el hecho de que el tama no del sistema lineal en (11) es muy
2 4
grande (6n ecuaciones con n incognitas) y el tiempo de ejecucion del algoritmo que resuelve problemas de
programacion lineal entera crece exponencialmente con el tama no del problema. Por ejemplo, para n = 10
tendramos un sistema con 600 ecuaciones y 10000 incognitas.
Ejemplo 1.11. El problema SAT (satisfiability).
Sean x1 , . . . , xn variables que solo pueden tomar los valores de verdad V (verdadero) o F (falso). A estas
variables las llamaremos variables l ogicas. Consideremos el conjunto de todas las expresiones que pueden
obtenerse a partir de las variables logicas x1 , . . . , xn utilizando los conectivos logicos , y . A los elementos
de este conjunto los llamaremos expresiones booleanas. Notemos que conectando dos expresiones booleanas
con , o obtenemos otra expresion booleana, es decir, los conectivos logicos definen operaciones en este
conjunto.
Cuando en una expresion booleana sustituimos cada una de las variables por un valor de verdad obtenemos
un valor de verdad para la expresion booleana. Por ejemplo, cuando sustituimos x2 , x3 y x4 por V y x1 por
F en la expresion booleana (x1 x3 ) (x4 x2 ) x3 obtenemos el valor V pero cuando sustituimos x1 , x2
y x3 por V y x4 por F obtenemos el valor F.
Una cl ausula es una expresion booleana donde las variables solo estan conectadas por o . Luego, la ex-
presion booleana anterior es una conjuncion de tres clausulas. Si una expresion booleana es una conjuncion
de clausulas, entonces, para cualquier sustitucion de las variables por V o F, sera V si y solo si todas las
clausulas lo son.
Consideremos la conjuncion de cinco clausulas
: (x1 x2 x3 ) ( x1 x2 ) ( x2 x3 ) ( x3 x1 ) ( x1 x2 x3 )
Dejamos a cargo del lector verificar que, cualquiera sea la sustitucion que hagamos en las variables, el valor
de verdad de obtenido es F. Esto muestra que, dada una expresion booleana, tiene sentido el problema de
determinar si existe alguna asignacion de V o F a las variables tal que la expresion resulte verdadera. Este
problema se conoce como el problema de satisfabilidad (SAT).
Una manera de resolver este problema consiste en hallar el valor de verdad de la expresion booleana para
cada una de las posibles sustituciones de las variables por V o F pero eso significara, en el caso de n variables,
hallar el valor de verdad de la expresion en cada uno de los 2n casos posibles.
Veremos una forma de resolver este problema por programacion lineal entera. Esto no significa que este
metodo sea mejor que el anterior ya que no hay ning un algoritmo conocido de complejidad polinomial que
resuelva los problemas de programacion lineal entera.
176 Optimizaci
on Combinatoria
Como toda expresion booleana es equivalente a una conjuncion de clausulas nos limitaremos al caso en que
nuestra expresion es de esa forma. Supongamos que queremos determinar si existe alguna asignacion de V
o F a las variables x1 , . . . , x4 tal que la expresion
resulte verdadera.
Como es verdadera sii cada una de sus clausulas lo es entonces el problema es equivalente a determinar si
existe alguna asignacion de V o F a las variables x1 , . . . , x4 tal que todas las clausulas sean verdaderas.
Con la convencion
xi = 1 si y solo si xi es V
xi = 0 si y solo si xi es F
y teniendo en cuenta que xi es V sii xi es F sii xi = 0 sii 1 xi = 1 resulta que existe una asignacion de
V o F a x1 , . . . , x4 de manera tal que todas las clausulas sean verdaderas sii existen x1 , . . . , x4 {0, 1} tales
que
x1 + x2 + (1 x3 ) 1
(1 x1 ) + x3 + (1 x4 ) 1
x2 + (1 x3 ) + x4 1
(1 x1 ) + (1 x2 ) + (1 x3 ) 1
x1 + x2 + x3 + x4 1
x1 + x2 + (1 x3 ) 1
(1 x1 ) + x3 + (1 x4 ) 1
x2 + (1 x3 ) + x4 1
(1 x1 ) + (1 x2 ) + (1 x3 ) 1
x1 + x2 + x3 + x4 1
0 xi 1 xi entero
max z
x1 + x2 + (1 x3 ) z
(1 x1 ) + x3 + (1 x4 ) 1
x2 + (1 x3 ) + x4 1
(1 x1 ) + (1 x2 ) + (1 x3 ) 1
x1 + x2 + x3 + x4 1
0 xi 1 xi entero
2. El m
etodo de redondeo.
Supongamos que para resolver un problema de programacion lineal entera nos olvidamos de la restriccion
entera, lo resolvemos como un problema de programacion lineal y luego redondeamos la solucion hallada
tomando la solucion entera mas proxima que sea factible. En general, esto funciona bien cuando las compo-
nentes de la solucion optima son grandes. El siguiente ejemplo muestra lo que puede ocurrir si la solucion
optima es pequena.
Ejemplo 2.1. Consideremos el problema de programacion lineal entera
En este caso la solucion optima es (x1 , x2 ) = (0, 3) con valor del funcional 21.0 + 11.3 = 33.
En cambio, si nos olvidamos de la restriccion entera, la solucion optima es (x1 , x2 ) = ( 13
7 , 0). Redondeando
por arriba obtenemos (2, 0) que no es una solucion factible y redondeando por abajo obtenemos la solucion
factible (1, 0) con valor del funcional 21.1 + 11.0 = 21, que esta lejos del valor del funcional en el optimo.
3. El m
etodo de branch and bound.
Definicion 3.1. Un arbol dirigido con raz es un grafo dirigido, conexo y acclico que tiene un vertice
distinguido s al que llamamos raz tal que para cualquier otro vertice v hay un camino dirigido de s a v.
Observaci
on 3.2. Si (u, v) es una rama de un arbol dirigido con raz entonces (v, u) no lo es.
Definici on 3.3. Si (u, v) es una rama de un arbol dirigido con raz diremos que u es el padre de v y que
v es el hijo de u. Dado un vertice u, el conjunto de vertices v tales que existe un camino dirigido de u a
v se llama la descendencia de u. Decimos que el arbol es binario si cada vertice que no sea una hoja (ver
definicion 2.3. del captulo 2) tiene exactamente dos hijos (notemos que las hojas son los vertices que no
tienen hijos). Al conjunto de hijos de la raz lo llamamos el primer nivel, al conjunto de nietos de la raz (es
decir, al conjunto de hijos de los hijos de la raz) lo llamamos el segundo nivel, etc.
Ejemplo 3.4. El grafo
s
primer nivel
segundo nivel
tercer nivel
cuarto nivel
Describiremos un algoritmo, conocido como branch and bound, que resuelve este problema. El procedimiento
utiliza una mezcla de backtracking (volver al vertice anterior para examinar alguno de sus hijos que todava
no ha sido examinado) y un criterio particular de poda que consiste en eliminar toda la descendencia de un
vertice x cuando se satisfaga que c(x) c(h) para alguna hoja h encontrada previamente (es decir, cuando
ninguna hoja descendiente de x puede ser la solucion optima del problema).
Descripci
on del algoritmo.
0. L = {s}, c = .
1. Si x es, de los elementos de L, el u
ltimo que ingreso, L = L {x}. Calcular c(x). Si c(x) c, goto 4.
2. Si x no es una hoja, L = L { hijos de x}, goto 4.
3. h = x, c = c(x).
4. Si L 6= goto 1.
5. STOP.
x y
u v w
k z
a
h
0
b h5
h4
h3
h2
h1
h6 h7
donde c(s) = 3, c(x) = 4, c(y) = 4, c(z) = 4, c(u) = 7, c(v) = 8, c(w) = 7, c(k) = 10, c(a) = 12, c(b) = 13,
c(h0 ) = 8, c(h1 ) = 11, c(h2 ) = 9, c(h3 ) = 6, c(h4 ) = 8 y c(h5 ) = 11, c(h6 ) = 14, c(h7 ) = 14.
0. L = {s}, c = .
1. L = , c(s) = 3.
2. L = {x, y}, goto 4.
4. L 6= , goto 1.
1. L = {x}, c(y) = 4 < = c.
2. L = {x, v, z, w}, goto 4.
4. L 6= , goto 1.
1. L = {x, v, z}, c(w) = 7 < = c.
2. L = {x, v, z, h4 , h5 }, goto 4.
4. L 6= , goto 1.
1. L = {x, v, z, h4 }, c(h5 ) = 11 < = c.
3. h = h5 , c = 11.
4. L 6= , goto 1.
1. L = {x, v, z}, c(h4 ) = 8 < 11 = c.
3. h = h4 , c = 8.
4. L 6= , goto 1.
1. L = {x, v}, c(z) = 4 < 8 = c.
Programaci
on lineal entera 179
2. L = {x, v, h3 }, goto 4.
4. L 6= , goto 1.
1. L = {x, v}, c(h3 ) = 6 < 8 = c.
3. h = h3 , c = 6.
4. L 6= , goto 1.
1. L = {x}, c(v) = 8 6 = c, goto 4.
4. L 6= , goto 1.
1. L = , c(x) = 4 < 6 = c.
2. L = {u}, goto 4.
4. L 6= , goto 1.
1. L = , c(u) = 7 6 = c, goto 4.
4. L 6= .
5. STOP.
El siguiente grafico es una interpretacion de los pasos seguidos por el algoritmo en nuestro ejemplo.
s
x y
w
u
v z
poda
poda
h5
h4
h3
Los vertices son examinados en el orden en que indican las flechas punteadas descendentes. Cada flecha
punteada ascendente indica un backtracking. El valor de c en cada iteracion del algoritmo es el costo de
la hoja mas barata encontrada hasta el momento y h guarda la informacion de cual es la hoja cuyo costo
es c (cuando el algoritmo encuentra una hoja de costo menor que el valor de c presente en ese momento,
actualiza c y h).
Si al examinar un nodo i resulta que c(i) c entonces toda su descendencia es podada ya que ninguna hoja
que sea un descendiente de i puede tener costo menor que c, es decir, costo menor que el de la hoja mas
barata hallada hasta ese momento.
Como una hoja no es examinada por el algoritmo solo cuando es seguro que no puede ser una solucion optima
entonces en alguna iteracion del algoritmo una hoja de mnimo costo es examinada. Cuando el algoritmo
encuentra la primer hoja de mnimo costo los valores de h y c son actualizados ya que su costo es menor
que el valor de c que estaba presente en ese momento, y a partir de all c y h permanecen constantes hasta
terminar el algoritmo ya que ninguna otra hoja encontrada mas tarde puede tener costo menor que el de
esta hoja de mnimo costo. Luego, al terminar el algoritmo la hoja que se encuentra almacenada en h es una
hoja de mnimo costo y c = c(h).
Luego, en este caso, la hoja de mnimo costo es h = h3 , con costo c = 6.
En este ejemplo la funcion c(x) estaba dada explcitamente. Esto no es as en general, sino que es una funcion
que se debera calcular.
180 Optimizaci
on Combinatoria
En el caso en que la funcion c satisfaga c(x) c(y) para toda rama (x, y), podemos resolver el problema de
hallar una hoja de maximo costo utilizando el algoritmo que resulta de reemplazar, en el paso 0., c = por
c = y, en el paso 1., la condicion c(x) c por la condicion c(x) c, es decir, el algoritmo
0. L = {s}, c = .
1. Sea x es el u
ltimo vertice que ingreso en L, L = L {x}. Calcular c(x). Si c(x) c, goto 4.
2. Si x no es una hoja, L = L { hijos de x}, goto 4.
3. h = x, c = c(x).
4. Si L 6= goto 1.
5. STOP.
4. Aplicaci
on al problema de programaci
on lineal entera.
Consideremos el problema de programacion lineal
min cx
Ax b (12)
0 xj uj (1 j n)
donde uj < para todo j y consideremos el problema de programacion lineal entera que resulta de agregar
a (12) la restriccion adicional
xi entero (1 i m) (13)
donde m n es un n umero natural dado. Resolveremos este problema de programacion lineal entera
generando un arbol binario dirigido cuya raz sera el problema (12) y los restantes vertices seran subproblemas
que resulten de agregar a (12) ciertas resticciones del tipo xj k o xj k +1 para algunos j. Las hojas seran
los subproblemas cuyas solucion optima verifica la restriccion (13) y los subproblemas que no sean factibles.
Para cada vertice u definiremos c(u) como el valor del funcional en la solucion optima del subproblema u
si este es factible y definiremos c(u) = si el subproblema u no es factible. La funcion c(u) verificara
c(u) c(v) para toda rama (u, v) del arbol. Usaremos el metodo de branch and bound para encontrar una
hoja de mnimo costo y eso nos dara la solucion del problema de programacion lineal entera.
Observaci on 4.1. La condicion 0 xj uj asegura que el poliedro definido por las restricciones es
acotado. Como tambien es cerrado (pues es interseccion finita de de semiespacios del tipo {x / a.x b} o
{x / a.x b} que son cerrados) entonces es compacto. Luego, si (12) es factible entonces siempre existe
una solucion optima ya que el funcional es una funcion contnua y toda funcion contnua sobre un compacto
alcanza su maximo y su mnimo. Lo mismo vale para cualquier subproblema que resulte de agregar a (12)
restricciones del tipo xj k o xj k + 1 para algunos j.
Observaci on 4.2. Si z es el valor del funcional en una solucion optima de un problema u de programacion
lineal y z es el valor del funcional en el optimo de cualquier subproblema v que se obtenga agregandole
una restriccion a u entonces z z ya que toda solucion optima del subproblema v es una solucion factible
del problema u. Notemos tambien que si el problema fuese maximizar el funcional en lugar de minimizarlo
entonces tendramos que z z.
Veamos ahora con mas detalle como construr el arbol.
La raz s del arbol es el problema (12). Notemos que toda solucion factible del problema de programacion
lineal entera es una solucion factible de s. Supongamos que hemos construdo una parte del arbol donde
cada vertice es un subproblema que resulta de agregar a (12) restricciones del tipo xj k o xj k + 1 para
algunos j, donde k es un entero no negativo y tal que toda solucion factible del problema de programacion
Programaci
on lineal entera 181
lineal entera es una solucion factible de alguna hoja de este subarbol. Para cada subproblema u que sea una
hoja del subarbol que tenemos construdo hasta ahora (es decir, cada vertice u que no tenga hijos) hacemos
lo siguiente:
Si u tiene una solucion optima que no satisface (13), sea j (1 j m) el primer ndice para el cual xj no es
entero y sea r un entero tal que r < xj < r + 1. Entonces creamos dos hijos de u, uno agregando al problema
u la restriccion xj r y el otro agregando a u la restriccion xj r + 1. Notemos que si una solucion factible
del problema de programacion lineal entera es una solucion factible de u entonces es una solucion factible
de alguno de los hijos de u ya que, como r es entero, si la j-esima coordenada de esta solucion es entera
entonces o bien es menor o igual que r o bien es mayor o igual que r + 1.
Si en cambio u tiene una solucion optima que satisface (13) o si no tiene soluciones factibles (notar que, por
la observacion 4.1., si u es factible entonces necesariamente tiene una solucion optima) entonces no creamos
ningun hijo de u.
De esta manera obtenemos un arbol binario dirigido con raz s cuyas hojas son los subproblemas cuyas
solucion optima verifica la restriccion (13) y los subproblemas que no sean factibles. Ademas, toda solucion
factible del problema de programacion lineal entera es una solucion factible de alguna hoja del arbol.
Para cada vertice u de este arbol definimos c(u) como el valor del funcional en la solucion optima del
subproblema u si este es factible y c(u) = si no. Debido a la forma en que hemos construdo el arbol esta
funcion satisface c(u) c(v) para toda rama (u, v) del arbol ya que si (u, v) es una rama del arbol entonces
v es un subproblema que se obtuvo agreagando una restriccion a u (ver observacion 4.2.). De esta manera, el
costo de una hoja que corresponda a un problema factible sera el valor del funcional en una solucion factible
del problema de programacion lineal entera. Como las soluciones factibles del problema de programacion
lineal entera son las soluciones factibles de cada una de las hojas del arbol entonces una hoja de mnimo
costo sera una solucion optima del problema de programacion lineal entera.
Para hallar una hoja de mnimo costo utilizaremos el metodo de branch and bound, pero en lugar de generar
todo el arbol y luego aplicar el algoritmo, en cada paso del algoritmo calcularemos solo los vertices y los
costos que necesitemos. Es decir, cada vez que realizamos el paso 1. debemos resolver el subproblema x para
el u
ltimo vertice x que ingreso en L y en el caso en que no sea una hoja generamos los dos hijos de x que
ingresaremos en L en el siguiente paso. De esta manera evitamos calcular las ramas que luego el algoritmo
podara.
En el caso en que el problema sea de maximizacion entonces la funcion c(u) se define como el valor del
funcional en el subproblema u si u es factible y como c(u) = si no y satisface c(u) c(v) para toda
rama (u, v) del arbol (ver observacion 4.2.). En este caso lo que buscamos es una hoja de maximo costo.
0. L = {s}, c =
donde la raz del arbol es el problema
1. L = . Calculamos c(s). Para ello resolvemos el problema s. En este caso una solucion optima es
(x1 , x2 , x3 ) = ( 38 , 83 , 0) y el valor del funcional en ella es 16. Luego c(s) = 16. Como c(s) es mayor que
c = vamos a 2.
2. s no es una hoja, ya que x1 no es entero. Como 2 < x1 < 3, los hijos de s son los subproblemas u1 y u2
que resultan de agregar al problema s las restricciones x1 2 y x1 3 respectivamente. Es decir,
4. L 6= , vamos a 1.
4. L 6= , vamos a 1.
1. L = {u3 }. Calculamos c(u5 ). Una solucion optima de u5 es (x1 , x2 , x3 ) = (0, 0, 78 ) y el valor del funcional
en ella es c(u5 ) = 14 + 67 . Como c(u5 ) es mayor que c = vamos a 2.
2. u5 no es una hoja ya que x3 no es entero. Como 1 < x1 < 2 los hijos de u5 son los subproblemas u7 y
u8 que resultan de agregar al problema u5 las restricciones x3 1 y x3 2 respectivamente. Es decir,
4. L 6= , vamos a 1.
4. L 6= , vamos a 1.
1. L = {u3 }. Calculamos c(u7 ). Una solucion optima de u7 es (x1 , x2 , x3 ) = (0, 0, 1) y el valor del funcional
en ella es c(u7 ) = 13. Como c(u7 ) es mayor que c = vamos a 2.
3. h = u7 , c = c(u7 ) = 13
4. L 6= , vamos a 1.
1. L = . Calculamos c(u3 ). Una solucion optima de u3 es (x1 , x2 , x3 ) = (2, 37 , 0) y el valor del funcional en
ella es c(u3 ) = 13. Como c(u3 ) es menor o igual que c = 13 vamos a 4.
4. Como L = , vamos a 5.
5. STOP.
Luego, la hoja de maximo costo es h = u7 con costo c = 13. Esto significa que una solucion optima del
problema de programacion lineal entera que queramos resolver es (x1 , x2 , x3 ) = (0, 0, 1) y el valor del
funcional en ella es c(u7 ) = 13.
Problema s
8 , 8 ,
sol: ( 0)
3 3
c ( s ) = 16
x1 2 x1 3
Problema u 1 Problema u 2
2
sol: ( 2 , 2 , ) no es factible
7
5
c ( u 1 ) = 15 +
7
c(u2)=
x3 0 x3 1
Problema u 3 Problema u 4
sol: ( 2 ,
7 ,0) sol: ( 1
, 1 ,1)
3 3 3
c ( u 3) = 13 c ( u 4 ) = 15
x1 0 x1 1
Problema u 5 Problema u 6
sol: ( 0 , 0 ,
8
) no es factible
7
c ( u6 ) =
6
c ( u 5 ) = 14 +
7
x3 1 x3 2
Problema u 7 Problema u 8
sol: ( 0 , 0 , 1 ) no es factible
c ( u 7) = 13 c(u8)=
5. Aplicaci
on de branch and bound al problema del viajante.
Como vimos, el problema del viajante puede plantearse por programacion lineal entera (ver ejemplo 1.9.) y
por lo tanto resolverse utilizando el metodo de branch and bound en la forma descripta en la seccion anterior.
Veremos ahora otro algoritmo para resolver este problema, esencialmente distinto pero que tambien utiliza
el metodo de branch and bound.
Sea G = (V, E) un grafo completo dirigido, donde V = {1, . . . , n} y donde cada rama (i, j) de G tiene
asignado un costo cij tal que 0 cij .
Recordemos que un circuito Hamiltoniano C es un ciclo dirigido en G que pasa por cada vertice una y solo
una vez. El costo c(C) del circuito se define como la suma de los costos de las ramas que lo forman, es decir,
X
c(C) = cij
(i,j)C
se traduzca en hallar una hoja de mnimo costo. De ahora en mas, la palabra circuito significara circuito
Hamiltoniano.
La raz del arbol sera el problema del viajante, es decir, hallar un circuito C tal que c(C) sea mnimo.
Supongamos que hemos construdo una parte del arbol donde cada vertice es un subproblema que resulta
de agregar a su vertice padre la restriccion (i, j) C o la restriccion (i, j)
/ C, para cierta rama (i, j) E.
Para cada subproblema u que sea una hoja del subarbol que tenemos construdo hasta ahora hacemos lo
siguiente:
Sea Au = {e E / e C es una restriccion de u}.
Si #Au < n 1 entonces elegimos convenientemente una rama (i, j) E y generamos dos hijos de u, uno
agregando a u la restriccion (i, j) C y el otro agregando a u la restriccion (i, j) / C.
Si, en cambio, #Au = n 1 entonces no generamos ning un hijo de u.
Veamos en un ejemplo cual es la manera en que se eligen las ramas (i, j) que definen las restricciones de
los subproblemas, como calcular el costo de cada vertice del arbol que se genera y la razon por la cual el
problema se traduce en encontrar una hoja de mnimo costo.
En lo que sigue, por n umero entenderemos un n umero real o infinito. Sea G el grafo completo dirigido con
los n = 7 vertices 1, 2, . . . 7. Supongamos que el costo de cada rama (i, j) de G (1 i, j 7) esta dado por
la matriz
3 93 13 33 9 57
4 77 42 21 16 34
45 17 36 16 28 25
||cij || = 39 90 80 56 7 91
28 46 88 33 25 57
3 88 18 46 92 7
44 26 33 27 84 39
Paso 1. Definimos la raz s del arbol como el problema de hallar un circuito C tal que c(C) sea mnimo.
Paso 2. Calculamos el costo y generamos los hijos de cada nodo u que sea una hoja del subarbol que tenemos
construdo hasta ahora y que satisfaga que #Au < n 1.
El subarbol que tenemos construdo hasta ahora tiene un solo nodo (la raz s), que es una hoja. Como
#As = 0 < 6 = n 1 pues As = , para calcular c(s) y generar los hijos de s procedemos de la siguiente
manera:
Asociamos a s la matriz ||cij (s)|| = ||cij || y consideremos la matriz D1 que se obtiene restando un n umero no
negativo k1 a cada coeficiente de la fila 1 de ||cij (s)|| de manera que cada coeficiente de la nueva matriz sea no
negativo. Como cada circuito C pasa una sola vez por el vertice 1 entonces existe un u nico j, 1 j 7, j 6= 1
tal que la rama (1, j) C. Luego el costo de cualquier circuito C calculado utilizando la nueva matriz de
costos D1 es igual a c(C) k1 ya que la u nica rama cuyo costo sufrio una modificacion es la rama (1, j) cuyo
costo fue disminuido en k1 .
Hacemos esto con el maximo valor posible de k1 , en este caso k1 = 3, para que la nueva matriz D1 tenga
al menos un coeficiente nulo en la primera fila. Ahora consideremos la matriz D2 que se obtiene restando
un numero no negativo k2 a cada coeficiente de la fila 2 de D1 de manera que cada coeficiente de la nueva
matriz sea no negativo. Como cada circuito C pasa una sola vez por el vertice 2 entonces existe un u nico j,
1 j 7, j 6= 2 tal que la rama (2, j) C. Luego el costo de cualquier circuito C calculado utilizando la
nueva matriz de costos D2 es igual al costo de C calculado usando la matriz de costos D1 menos k2 , lo que
es igual a c(C) k1 k2 .
Hacemos esto con el maximo valor posible de k2 , en este caso k2 = 4. De esta manera D2 tiene al menos un
coeficiente nulo en cada una de las dos primeras filas.
186 Optimizaci
on Combinatoria
que tiene al menos un coeficiente nulo en cada fila. El costo de cualquier circuito C calculado utilizando la
nueva matriz de costos Dn es c(C) k1 k2 k7 , donde k1 = 3, k2 = 4, k3 = 16, k4 = 7, k5 = 25,
k6 = 3 y k7 = 26. Ahora, para cada j, (1 j 7) restamos un n umero no negativo rj a cada coeficiente
de la columna j de Dn de manera que cada coeficiente de la nueva matriz sea no negativo. Eligiendo rj el
maximo valor posible, en este caso r1 = 0, r2 = 0, r3 = 7, r4 = 1, r5 = 0, r6 = 0 y r7 = 4, obtenemos la
matriz
0 83 9 30 6 50
0 66 37 17 12 26
29 1 19 0 12 5
0
||cij (s)|| = 32 83 66 49 0 80
3 21 56 7 0 28
0 85 8 42 89 0
18 0 0 0 58 13
que tiene al menos un coeficiente nulo en cada fila y en cada columna. El costo de cualquier circuito C
calculado utilizando la nueva matriz de costos ||c0ij (s)|| definido por
X
c0 (C, s) = c0ij (s)
(i,j)C
Ahora generamos dos hijos u1 y v1 de s, eligiendo una rama (i1 , j1 ) E tal que el coeficiente c0i1 j1 (s)
correspondiente a la fila i1 y a la columna j1 de ||c0ij (s)|| sea nulo, y tomando como u1 el subproblema que
resulta de agregar al problema s la condicion de que (i1 , j1 ) pertenezca al circuito y como v1 el que resulta
de agregar a s la condicion de que (i1 , j1 ) no pertenezca al circuito. Supongamos que en este caso elegimos
(i1 , j1 ) = (4, 6). Entonces el subproblema u1 es el de hallar un circuito de mnimo costo que contenga a la
rama (4, 6) y v1 el de hallar un circuito de mnimo costo que no la contenga.
Paso 3. Calculamos el costo y generamos los hijos de cada nodo u que sea una hoja del subarbol que tenemos
construdo hasta ahora y que satisfaga que #Au < n 1.
El subarbol que tenemos construdo hasta ahora consiste de la raz s y sus dos hijos, u1 y v1 . Las hojas son,
por lo tanto, u1 y v1 .
Como #Au1 = 1 < 6 = n 1 pues Au1 = {(i1 , j1 )}, para calcular c(u1 ) y luego generar sus hijos le asociamos
al problema u1 la matriz de costos ||cij (u1 )|| que se obtiene reemplazando en ||c0ij (s)|| el coeficiente c0j1 i1 (s)
por y eliminando la fila i1 y la columna j1 .
Si C es un circuito que contiene a la rama (i1 , j1 ) entonces para todo j 6= j1 la rama (i1 , j) no puede
pertenecer a C, para todo i 6= i1 la rama (i, j1 ) no puede pertenecer a C. Como ademas c0i1 j1 = 0 eso
significa que no necesitamos guardar la informacion sobre la fila i1 y la columna j1 de ||c0ij (s)|| y por eso
Programaci
on lineal entera 187
son eliminadas. Como ademas la rama (j1 , i1 ) no puede pertenecer al circuito, para evitar que esto pudiera
ocurrir reemplazamos el coeficiente c0j1 i1 (s) por .
Como eliminaremos una fila y una columna, utilizaremos una tabla de doble entrada en lugar de la notacion
matricial con el objeto de no perder la informacion de a cuales ramas corresponden los distintos costos (el
costo de cada rama (i, j) seg
un ||cij (u1 )|| es el valor correspondiente a la fila i y la columna j).
En nuestro ejemplo la matriz ||cij (u1 )|| correspondiente a u1 es
col 1 col 2 col 3 col 4 col 5 col 7
f ila 1 0 83 9 30 50
f ila 2 0 66 37 17 26
f ila 3 29 1 19 0 5
f ila 5 3 21 56 7 28
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58
y X
c0 (C, u1 ) = c0ij (u1 )
(i,j)C
(i,j)6=(i1 ,j1 )
Notemos que c(C, u1 ) y c0 (C, u1 ) estan bien definidos pues si C es un circuito que contiene a la rama (i1 , j1 )
entonces para todo (i, j) C, (i, j) 6= (i1 , j1 ) vale que i 6= i1 , que j 6= j1 y que (i, j) 6= (j1 , i1 ).
188 Optimizaci
on Combinatoria
Como ||cij (u1 )|| fue construda eliminando la fila i1 y la columna j1 de ||c0ij (s)|| y reemplazando c0j1 i1 (s) por
entonces para todo (i, j) C, (i, j) 6= (i1 , j1 ) existen los coeficientes cij (u1 ) y c0ij (u1 ) y vale
X X
c0ij (s) = cij (u1 ) = c(C, u1 )
(i,j)C (i,j)C
(i,j)6=(i1 ,j1 ) (i,j)6=(i1 ,j1 )
Ahora cosideremos el problema v1 . Como #Av1 = 0 < 6 = n 1 pues Av1 = , para calcular c(v1 ) y luego
generar sus hijos le asociamos al problema v1 la matriz de costos ||cij (v1 )|| que se obtiene reemplazando
en ||c0ij (s)|| el coeficiente c0i1 j1 (s) por . Esto garantiza que la rama (i1 , j1 ) no pertenecera al circuito
(recordemos que v1 es el problema de hallar un circuito de mnimo costo que no contenga esa rama).
Ahora generamos la matriz ||c0ij (v1 )|| que se obtiene restando a cada coeficiente de la fila i de ||cij (v1 )||
el maximo n umero no negativo ki y luego restando a cada coeficiente de la columna j el maximo n umero
no negativo rj , de manera que cada coeficiente de la nueva matriz resulte ser no negativo y definimos
P P
c(v1 ) = c(s) + ki + rj . Luego, c(v1 ) c(s). Notemos que ||c0ij (v1 )|| tiene un coeficiente nulo en cada
fila y cada columna.
En nuestro caso resulta que k4 = 32, ki = 0 para i 6= 4 y rj = 0 para todo j, de donde ||c0ij (v1 )|| es la matriz
Si C es un circuito que no contiene a la rama (i1 , j1 ) (es decir, una solucion factible de v1 ) entonces para
todo (i, j) C vale que (i, j) 6= (i1 , j1 ) de donde c0ij (s) = cij (v1 ) para todo (i, j) C (ya que ||cij (v1 )|| se
obtuvo reemplazando en ||c0ij (s)|| el coeficiente c0i1 j1 (s) por ).
Sean X
c(C, v1 ) = cij (v1 )
(i,j)C
y X
c0 (C, v1 ) = c0ij (v1 )
(i,j)C
Ahora se tiene que c0 (C, v1 ) = c(C, v1 ) 32 y como c0ij (s) = cij (v1 ) para todo (i, j) C entonces
X
c(C) = c0 (C, s) + c(s) = c0ij (s) + c(s) =
(i,j)C
X
= cij (v1 ) + c(s) = c(C, v1 ) + c(s) = c0 (C, v1 ) + 32 + c(s) =
(i,j)C
Ahora generamos los hijos de u1 a partir de la matriz ||c0ij (u1 )||. Elegimos una rama (i2 , j2 ) de G tal que el
coeficiente correspondiente a la fila i2 y a la columna j2 de ||c0ij (u1 )|| sea nulo, por ejemplo, (i2 , j2 ) = (3, 5),
y generamos dos hijos u2 y v2 de u1 , el primero sera el subproblema que resulta de agregar al problema u1
la condicion de que (i2 , j2 ) pertenezca al circuito y el segundo el que resulta de agregar a u1 la condicion de
que (i2 , j2 ) no pertenezca al circuito.
Finalmente, generamos los hijos de v1 a partir de la matriz ||c0ij (v1 )||. Elegimos una rama (i3 , j3 ) de G tal que
el coeficiente correspondiente a la fila i3 y a la columna j3 de ||c0ij (v1 )|| sea nulo, por ejemplo, (i3 , j3 ) = (2, 1)
y generamos dos hijos u3 y v3 de v1 , el primero sera el subproblema que resulta de agregar al problema v1
la condicion de que (i3 , j3 ) pertenezca al circuito y el segundo el que resulta de agregar a v1 la condicion de
que (i3 , j3 ) no pertenezca al circuito.
Paso 4. Calculamos el costo y generamos los hijos de cada nodo u que sea una hoja del subarbol que tenemos
construdo hasta ahora y que satisfaga que #Au < n 1.
El subarbol que tenemos construdo hasta ahora consiste de la raz s, sus dos hijos u1 y v1 , los hijos u2 y v2
de u1 y los hijos u3 y v3 de v1 . Las hojas son, por lo tanto, u2 , v2 , u3 y v3 .
Comencemos por los hijos de u1 , que son u2 y v2 . Como #Au2 = 2 < 6 = n 1 pues Au2 = {(i1 , j1 ), (i2 , j2 )},
para calcular c(u2 ) y luego generar sus hijos le asociamos a u2 la matriz de costos ||cij (u2 )|| que se obtiene
reemplazando en ||c0ij (u1 )|| el coeficiente c0j2 i2 (u1 ) por y eliminando la fila i2 y la columna j2 y como
#Av2 = 1 < 6 = n 1 pues Av2 = {(i1 , j1 )}, para calcular c(v2 ) y luego generar sus hijos le asociamos a v2
la matriz de costos ||cij (v2 )|| que se obtiene reemplazando en ||c0ij (u1 )|| el coeficiente c0i2 j2 (u1 ) por .
Restando primero a cada coeficiente de la fila i de ||cij (u2 )|| el maximo n umero no negativo ki y luego a
cada coeficiente de la columna j el maximo numero no negativo rj , de manera que cada coeficiente de la
nueva matriz sea no negativo, obtenemos la matriz ||c0ij (u2 )|| que tiene un coeficiente nulo en cada fila y cada
P P
columna y como antes definimos c(u2 ) = c(u1 ) + ki + rj . Luego c(u2 ) c(u1 ).
En nuestro ejemplo ki = 0 = rj para todo i, j de donde ||c0ij (u2 )|| = ||cij (u2 )|| y por lo tanto se tiene que
c(u2 ) = c(u1 ) + 0 = c(u1 ) = 99.
Dejamos a cargo del lector verificar que si C es un circuito que contiene a las ramas (i1 , j1 ) e (i2 , j2 ) (es decir,
una solucion factible de u2 ), definiendo
X
c0 (C, u2 ) = c0ij (u2 )
(i,j)C
(i,j)6=(i1 ,j1 )
(i,j)6=(i2 ,j2 )
X
resulta que c(C) = c0 (C, u2 ) + c(u2 ) y c0 (C, u2 ) = c0ij (u2 ).
(i,j)C
(i,j)A
/ u
2
De manera analoga, restando primero a cada coeficiente de la fila i de ||cij (v2 )|| el maximo n umero no
negativo ki y luego a cada coeficiente de la columna j el maximo n umero no negativo rj , de manera que
cada coeficiente de la nueva matriz sea no negativo, obtenemos la matriz ||c0ij (v2 )|| que tiene un coeficiente
P P
nulo en cada fila y cada columna y definimos c(v2 ) = c(u1 ) + ki + rj . Luego c(v2 ) c(u1 ).
En nuestro caso, k3 = 1, ki = 0 para i 6= 3, r5 = 17 y rj = 0 para j 6= 5 de donde ||c0ij (v2 )|| es la matriz
col 1 col 2 col 3 col 4 col 5 col 7
f ila 1 0 83 9 13 50
f ila 2 0 66 37 0 26
f ila 3 28 0 18 4
f ila 5 0 18 53 4 25
f ila 6 0 85 8 72 0
f ila 7 18 0 0 0 41
X
resulta que c(C) = c0 (C, v2 ) + c(v2 ) y c0 (C, v2 ) = c0ij (v2 ).
(i,j)C
(i,j)A
/ v2
Ahora consideremos los hijos de v1 , que son u3 y v3 . Como #Au3 = 1 < 6 = n 1 pues Au3 = {(i3 , j3 )},
para calcular c(u3 ) y luego generar sus hijos le asociamos a u3 la matriz de costos ||cij (u3 )|| que se obtiene
Programaci
on lineal entera 191
reemplazando en ||c0ij (v1 )|| el coeficiente c0j3 i3 (v1 ) por y eliminando la fila i3 y la columna j3 y como
#Av3 = 0 < 6 = n 1 pues Av3 = , para calcular c(v3 ) y luego generar sus hijos le asociamos a v3 la matriz
de costos ||cij (v3 )|| que se obtiene reemplazando en ||c0ij (v1 )|| el coeficiente c0i3 j3 (v1 ) por .
En nuestro ejemplo, ||cij (u3 )|| es la matriz
col 2 col 3 col 4 col 5 col 6 col 7
f ila 1 83 9 30 6 50
f ila 3 1 19 0 12 5
f ila 4 51 34 17 48
f ila 5 21 56 7 0 28
f ila 6 85 8 89 0
f ila 7 0 0 0 58 13
Restando primero a cada coeficiente de la fila i de ||cij (u3 )|| el maximo n umero no negativo ki y luego a
cada coeficiente de la columna j el maximo numero no negativo rj , de manera que cada coeficiente de la
nueva matriz sea no negativo, obtenemos la matriz ||c0ij (u3 )|| que tiene un coeficiente nulo en cada fila y cada
P P
columna y definimos c(u3 ) = c(v1 ) + ki + rj . Luego c(u3 ) c(v1 ).
En nuestro caso, k1 = 6, k4 = 17, ki = 0 para i 6= 1, 4, y rj = 0 para todo j de donde ||c0ij (u3 )|| es la matriz
col 2 col 3 col 4 col 5 col 6 col 7
f ila 1 77 3 24 0 44
f ila 3 1 19 0 12 5
f ila 4 34 17 0 31
f ila 5 21 56 7 0 28
f ila 6 85 8 89 0
f ila 7 0 0 0 58 13
X
se tiene que c(C) = c0 (C, u3 ) + c(u3 ) y c0 (C, u3 ) = c0ij (u3 )
(i,j)C
(i,j)A
/ u3
Analogamente, restando primero a cada coeficiente de la fila i de ||cij (v3 )|| el maximo n
umero no negativo ki
y luego a cada coeficiente de la columna j el maximo n
umero no negativo rj , de manera que cada coeficiente
0
de la nueva matriz sea no negativo, obtenemos la matriz ||cij (v3 )|| que tiene un coeficiente nulo en cada fila
P P
y cada columna y definimos c(v3 ) = c(v1 ) + ki + rj . Luego c(v3 ) c(v1 ).
En nuestro caso, k2 = 12, ki = 0 para i 6= 2, y rj = 0 para todo j de donde ||c0ij (v3 )|| es la matriz
192 Optimizaci
on Combinatoria
X
resulta que c(C) = c0 (C, v3 ) + c(v3 ) y c0 (C, v3 ) = c0ij (v3 ).
(i,j)C
(i,j)A
/ v3
Ahora deberamos generar los hijos de u2 , v2 , u3 y v3 e ir al paso 5, cosa que no haremos porque calculamos
que a estas alturas el lector ya ha comprendido el procedimiento y su paciencia esta a punto de agotarse.
Resumiendo: hasta ahora, en cada paso calculamos el costo y generamos los hijos de cada vertice u que sea
una hoja del subarbol que se tiene hasta ese momento y que satisfaga que #Au < n 1, asociando a u una
matriz ||c0ij (u)|| que tiene un cero en cada fila y en cada columna y satisface:
Si Au = {e E / e C es una restriccion de u}, para cualquier solucion factible C de u se tiene que
donde X
c0 (C, u) = c0ij (u)
(i,j)C
(i,j)A
/ u
Ademas, el costo c(u) de u que calculamos satisface que c(u) c(v) para cada hijo v de u.
Finalmente, veamos ahora como procedemos cuando tenemos una hoja u del subarbol generado hasta el
momento que satisface #Au = n1. En este caso, no generamos ning un hijo de u y para calcular c(u) primero
determinamos si u es o no es factible. Si es factible entonces calculamos c(u) con el mismo procedimiento de
antes. En cambio, si no es factible, ponemos c(u) = .
De esta manera obtenemos un arbol binario con raz donde cada nodo u tiene asignado un costo c(u) en
forma tal que vale c(u) c(v) si (u, v) es una rama del arbol. Las hojas de este arbol son los vertices h tales
que #Ah = n 1. Ademas, para cada hoja h del arbol que sea un problema factible tenemos definida una
matriz ||c0ij (h)|| que tiene un cero en cada fila y cada columna y satisface:
Si Ah = {e E / e C es una restriccion de h}, para cualquier solucion factible C de h se tiene que
donde X
c0 (C, h) = c0ij (h)
(i,j)C
(i,j)A
/ h
Notemos que determinar si una hoja h del arbol es factible es facil porque si #Ah = n 1 entonces hay
n 1 ramas que necesariamente deben pertenecer a cualquier solucion factible de h. Por la foma en que
Programaci
on lineal entera 193
fuimos procediendo (cada vez que agregamos una restriccion del tipo (i, j) C eliminamos la fila i y la
columna j), no puede haber en Ah dos ramas con la misma punta ni dos ramas con la misma cola. Luego,
los conjuntos {i / (i, j) Ah } y {j / (i, j) Ah } tienen n 1 elementos cada uno. Por lo tanto, existe un
u
nico i0 y un u nico j0 tales que i0 / {i / (i, j) Ah } y j0
/ {j / (i, j) Ah }. Notemos que si C es una
solucion factible de h entonces tiene n ramas, verifica que para cada i entre 1 y n hay una y solo una rama
de C cuya cola sea i y una y solo una rama de C cuya punta sea i y las n 1 ramas de Ah deben ser ramas
de C. Esto muestra que el u nico camino P que podra ser una solucion factible de h es aquel cuyas ramas
son las n 1 ramas pertenecientes a Ah y la rama (i0 , j0 ) (ya que si agregamos una rama (i, j) con i 6= i0
o j 6= j0 a las ramas pertenecientes a Ah ese camino no tendra ninguna rama cuya punta es i0 o ninguna
rama cuya cola es j0 ). Por otra parte, como P no contiene dos ramas con la misma punta ni dos ramas con
la misma cola, entonces es un circuito (en cuyo caso es la u nica solucion factible de h) o bien consiste de dos
o mas subcircuitos (en cuyo caso h no es factible), cosa que puede chequearse facilmente.
Veamos ahora que la solucion al problema del viajante es la hoja de mnimo costo.
Si h es una hoja factible entonces #Ah = n 1. Como cada vez que agregamos una restriccion del tipo
(i, j) C eliminamos una fila y una columna y para obtener h hemos agregado n 1 de estas restricciones,
entonces ||c0ij (h)|| es una matriz de 1 1 que tiene un cero en cada fila y cada columna. Luego debe
ser ||c0ij (h)|| = ( 0 ) de donde c0 (C, h) = 0. Por lo tanto, si C es una solucion factible de h resulta que
c(C) = c0 (C, h) + c(h) = c(h).
Como las soluciones factibles del problema del viajante son las soluciones factibles de cada una de las hojas
del arbol y como el costo de dicha solucion factible coincide con el costo de su correspondiente hoja entonces
nuestro problema se traduce en encontrar una hoja de mnimo costo. Ademas, como vimos antes, si h es la
hoja de mnimo costo entonces tiene una u nica solucion factible que puede hallarse facilmente y que, por lo
dicho, resulta ser la solucion al problema del viajante.
Para hallar una hoja de mnimo costo, utilizamos el metodo de branch and bound y, como en el caso de
programacion lineal entera, en lugar de generar el arbol y luego aplicar el algoritmo, en cada paso calculamos
solo los vertices y los costos que necesitamos.
Ejemplo 5.3. Resolvamos el problema del viajante para el grafo completo de n = 4 vertices que tiene como
matriz de costos a la matriz
4 99 23
8 86 55
||cij || =
6 24 20
12 87 22
Iniciamos el algoritmo poniendo c = .
Primero calculamos ||c0ij (s)|| y c(s) y obtenemos
0 85 5
0 68 33
||c0ij (s)|| =
0 18 0
0 75 0
y c(s) = 54 < = c.
Ahora generamos uno de los hijos de s, que denotaremos por p1 , agregando la restriccion (4, 1) C. Se tiene
entonces que ||cij (p1 )|| es la matriz
col 2 col 3 col 4
f ila 1 0 85
f ila 2 68 33
f ila 3 18 0
194 Optimizaci
on Combinatoria
de donde ||c0ij (p2 )|| = ||cij (p1 )|| y c(p2 ) = 122 < = c.
Ahora generamos uno de los hijos de p2 , al que denotaremos por p3 , obtenido agregandole a p2 la restriccion
(1, 2) C. Como #Ap3 = 3 = n 1 entonces para calcular su costo primero debemos ver si es factible.
Como Ap3 = {(4, 1), (2, 3), (1, 2)} entonces {i / (i, j) Ap3 } = {4, 2, 1} y {j / (i, j) Ap3 } = {1, 3, 2}. Por
lo tanto, el u nico i0 entre 1 y 4 tal que i0 / {i / (i, j) Ap3 } es i0 = 3 y el u
nico j0 entre 1 y 4 tal que
j0 / {j / (i, j) Ap3 } es j0 = 4 . Luego, el u
nico camino que podra ser una solucion factible de p3 es aquel
cuyas ramas son (4, 1), (2, 3), (1, 2) y (3, 4). Como este camino es un circuito entonces p3 es factible y su
u
nica solucion es el circuito 4 1 2 3 4.
Calculemos c(p3 ). Como ||cij (p3 )|| es la matriz
col 4
f ila 3 0
entonces ||c0ij (p3 )|| = ||cij (p3 )|| y c(p3 ) = 122 < = c. Como ademas p3 es una hoja entonces actualizamos
h y c poniendo h = p3 y c = 122.
Ahora hacemos un backtracking y volvemos a p2 para generar su otro hijo, que denotaremos por p4 , obtenido
agregando a p2 la restriccion (1, 2)
/ C. Como ||cij (p4 )|| es la matriz
col 2 col 4
f ila 1
f ila 3 0
y c(p4 ) = 122 = c, de modo que hacemos otro backtracking y volvemos a a p1 para generar su otro
hijo, que denotaremos por p5 , obtenido agregando a p1 la restriccion (2, 3)
/ C. Se tiene que ||cij (p5 )|| es la
matriz
col 2 col 3 col 4
f ila 1 0 50
f ila 2 0
f ila 3 18 0
y c(p5 ) = 172. Como c(p5 ) = 172 122 = c entonces podamos toda la descendencia de p5 y hacemos otro
backtracking para volver a s y generar su otro hijo, que denotaremos por p6 , obtenido agregando a s la
restriccion (4, 1)
/ C. Se tiene que ||cij (p6 )|| es la matriz
col 1 col 2 col 3 col 4
f ila 1 0 85 5
f ila 2 0 68 33
f ila 3 0 18 0
f ila 4 75 0
de donde ||c0ij (p6 )|| = ||cij (p6 )|| y c(p6 ) = 54 < 122 = c.
Ahora generamos uno de los hijos de p6 , al que denotaremos por p7 , obtenido agregandole a p6 la restriccion
(2, 1) C. Se tiene entonces que ||cij (p7 )|| es la matriz
col 2 col 3 col 4
f ila 1 85 5
f ila 3 18 0
f ila 4 75 0
de donde ||c0ij (p8 )|| = ||cij (p8 )|| y c(p8 ) = 77 < 122 = c.
Ahora generamos uno de los hijos de p8 , al que denotaremos por p9 , obtenido agregandole a p8 la restriccion
(4, 3) C.
Como #Ap9 = 3 = n 1, para calcular su costo debemos ver si es factible. Dejamos a cargo del lector
verificar que p9 es factible y que su u
nica solucion factible es el circuito 4 3 2 1 4.
Calculemos su costo. Como ||cij (p9 )|| es la matriz
col 4
f ila 1 0
entonces ||c0ij (p9 )|| = ||cij (p9 )|| y c(p9 ) = 77 < 122 = c. Como ademas p9 es una hoja actualizamos h y c
poniendo h = p9 y c = 77.
Ahora hacemos un backtracking y volvemos a p8 para generar su otro hijo, que denotaremos por p10 , obtenido
agregando a p8 la restriccion (4, 3)
/ C. Como ||cij (p10 )|| es la matriz
196 Optimizaci
on Combinatoria
col 3 col 4
f ila 1 80 0
f ila 4
col 3 col 4
f ila 1 80 0
f ila 4 0 0
y c(p10 ) = 77 = c, de modo que podamos toda su descendencia y hacemos otro backtracking volviendo
a p7 para generar su otro hijo, que denotaremos por p11 , obtenido agregando a p7 la restriccion (3, 2)
/ C.
Se tiene que ||cij (p11 )|| es la matriz
y c(p11 ) = 134. Como c(p11 ) = 134 77 = c entonces podamos toda la descendencia de p11 y hacemos otro
backtracking para volver a p6 y generar su otro hijo, que denotaremos por p12 , obtenido agregando a p6 la
restriccion (2, 1)
/ C. Se tiene que ||cij (p12 )|| es la matriz
y c(p12 ) = 87. Como c(p12 ) = 87 77 = c entonces podamos toda la descendencia de p12 y como ya hemos
examinado todos los hijos de todos los vertices a los que podemos llegar con backtracking, el algoritmo se
detiene.
Luego, la hoja de mnimo costo es h = p9 con costo c = 77, lo que significa que el circuito C de mnimo costo
es 4 3 2 1 4 con costo c(C) = 77. El subarbol generado por el algoritmo es
Programaci
on lineal entera 197
s
c ( s) = 54
(4,1) C
(4,1) C
p6 p
1
c ( p 6 ) = 54 c ( p1) = 122
(2,1) C
(2,1) C
(2,3) C (2,3) C
p12 p p p2
7 5
(3,2) C
(3,2) C
(1,2) (1,2) C
C
p p p p
11 8 4 3
(4,3) C
(4,3) C
p10 p9
c ( p10 ) = c ( p 9 ) = 77