Anda di halaman 1dari 197

1

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

c.x = 10x11 + 14x12 + 20x13 + 12x21 + 20x22 + 17x23

con las restricciones


x11 + x12 + x13 = 100
x21 + x22 + x23 = 200
x11 + x21 = 75
x12 + x22 = 125
x13 + x23 = 100
xij 0 i, j
Escrito matricialmente el problema es
min cx
Ax = b
x0
donde A y b son las matrices

1 1 1 0 0 0 100
0 0 0 1 1 1 200

A = 1 0 0 1 0 0 y b = 75

0 1 0 0 1 0 125
0 0 1 0 0 1 100
2 Optimizaci
on Combinatoria

ii) El problema de la mezcla o


ptima de producci
on.
Una panadera elabora pan de 4 tipos, utilizando 6 ingredientes. Sea aij la cantidad de kilos del ingrediente
i que se necesitan para elaborar un kilo de pan del tipo j y sea cj la ganancia de vender un kilo de pan del
tipo j (1 i 6, 1 j 4). Sabiendo que, en total, no pueden elaborarse mas de 100 kilos de pan al
da, y que diariamente se dispone de bi kilos del ingrediente i, se desea saber cu
antos kilos de cada tipo de
pan se deben elaborar por da para obtener la mayor ganancia.
Llamemos xj la cantidad de kg de pan del tipo j que se elaboraran por da. Queremos maximizar la funci on
lineal c.x = c1 x1 + c2 x2 + c3 x3 + c4 x4 , con las restricciones
a11 x1 + a12 x2 + a13 x3 + a14 x4 b1
a21 x1 + a22 x2 + a23 x3 + a24 x4 b2
a31 x1 + a32 x2 + a33 x3 + a34 x4 b3
a41 x1 + a42 x2 + a43 x3 + a44 x4 b4
a51 x1 + a52 x2 + a53 x3 + a54 x4 b5
a61 x1 + a62 x2 + a63 x3 + a64 x4 b6
x1 + x2 + x3 + x4 100
xj 0 j
es decir, queremos resolver el problema de programacion lineal
max cx
Ax b
x0


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

iii) El problema de la dieta.


Supongamos que queremos confeccionar una dieta con seis tipos de alimento, cada uno de ellos conteniendo
cuatro clases de vitaminas. Sea aij la cantidad de vitamina i contenida en el alimento j y sea cj el precio de un
kilo de alimento j. Queremos saber cu antos kilos xj de cada alimento j debemos inclur para garantizar que
la dieta contenga por lo menos bi unidades de vitamina i de manera tal que el costo total de los alimentos
sea mnimo. Es decir, queremos minimizar la funci on lineal c1 x1 + + c6 x6 sujeta a las restricciones
ai1 x1 + + ai6 x6 bi (1 i 4) y xj 0 (1 j 6). En otras palabras, queremos resolver el problema
de programacion lineal

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

puede ser reemplazada por 


ai1 x1 + + ain xn si = bi
si 0
Tambien observemos que si para alg un j no se pide la condici
on xj 0 entonces podemos reemplazar la
variable xj por yj zj agregando las condiciones yj 0 y zj 0.
Por u ltimo, max cx = min (c) x.
Todas estas observaciones muestran que cualquier problema de programacion lineal puede ser planteado en
la forma
min cx
Ax = b
x0
Esta forma de planteo del problema se denomina forma standard.

3. Teorema fundamental de la programaci


on lineal.
Definicion 3.1. Un hiperplano en IRn es una variedad lineal de codimension 1, es decir, {x IRn / a.x = k},
donde a = (a1 , . . . , an ) IRn , k IR y a.x = a1 x1 + + an xn .
Cada hiperplano determina dos semiespacios: {x IRn / a.x k} y {x IRn / a.x k}.
Un poliedro es la interseccion de un n umero finito de semiespacios.
Observaci on 3.2. Notemos que el conjunto {x IRn / ax = k} es un poliedro ya que puede escribirse
como interseccion de los semiespacios {x IRn / ax k} y {x IRn / ax k}. Ademas, es claro que la
interseccion de un n
umero finito de poliedros es un poliedro. Esto muestra que el conjunto de todos los x
que satisfacen las restricciones de un problema de programacion lineal es un poliedro. Luego, un problema
de programacion lineal consiste en maximizar o minimizar el valor de una funcion lineal sobre un poliedro.
Dado un problema de programacion lineal, si el problema tiene una soluci on optima entonces tiene una
soluci
on optima en un punto extremo del poliedro. Antes de dar la definici
on rigurosa de punto extremo,
veamos esto en un ejemplo.
Dado el problema de programacion lineal

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

Definicion 3.9. Una soluci


on b
asica x de Ax = b se dice degenerada sii #{j / xj 6= 0} < m (es decir, si
xik = 0 para alg
un 1 k m).
Observaci on 3.10. Sea x una soluci on b
asica de Ax = b y sean i1 , . . . , im tales que xj = 0 j 6= i1 , . . . , im
y las columnas i1 , . . . , im de A son linealmente independientes Entonces, si B es la submatriz de A formada
por las columnas i1 , . . . , im , resulta que B es inversible, xj = 0 j 6= i1 , . . . , im y
x
i1 b1
xi2 b
. = B 1 . .2
. ..
.
xim bm

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)

Esto dice que la aplicaci


on del conjunto de soluciones b
asicas de Ax = b en el conjunto de los subconjuntos
de m elementos del conjunto {1, 2, . . . , n} dada por

(x) = {i1 , . . . , im }

es inyectiva. En efecto, si (x) = (x ) = {i1 , . . . , im } entonces



0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)

y tambien 
0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)

pues b no depende de x sino solo de A, b y de i1 , . . . , im . Luego x = x .

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

max 3x1 x2 + 2x3


x1 + x2 x3 = 2
x1 + x2 = 1
x0

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

de donde resulta que


y z
i1 i1
yi2 zi2
. = B 1 .b = .
. .
. .
yim zim
Luego yi = zi para todo i, es decir, y = z. Esto muestra que x es un punto extremo de K.

(=) Sea x K un punto extremo. Probaremos que x es una soluci on b


asica. Sean i1 , . . . , ir tales que
xj = 0 j 6= i1 , . . . , ir y xi1 , . . . , xir 6= 0. Luego xik > 0 para todo k tal que 1 k r.
Si B es la submatriz de A formada por las columnas i1 , . . . , ir entonces, por la proposici on 3.8., basta ver
que las columnas de B son linealmente independientes.
Supongamos que las columnas de B son linealmente dependientes. Entonces existe w IRr tal que w 6= 0 y
B.w = 0. Sea v IRn definido por

ws si j = is (1 s r)
vj =
0 si j =
6 i1 , . . . , ir
Programaci
on lineal 7
 
xis
Entonces Av = 0 y v 6= 0. Sea k tal que 0 < k min / ws 6= 0 . Notemos que un tal k existe pues
1sr |ws |
xis > 0 (1 s r) y w 6= 0.
Sean y = x + k.v y z = x k.v. Entonces x = 12 y + 12 z, y 6= z y ademas y, z K. En efecto, es claro que
Ay = b = Az. Veamos
 que y, z
 0. Si j 6= i1 , . . . , ir entonces yj = 0 = zj . Sea entonces s tal que 1 s r.
xis
Como k min / ws 6= 0 , dado s = 1, . . . , r se tiene
1sr |ws |
x
i) si ws > 0 entonces k wiss . Luego k.ws xis de donde xis k.ws 0 y ademas xis + k.ws 0 ya que
xis > 0, k > 0 y ws > 0
x
ii) si ws < 0 entonces k iwss . Luego k.ws xis de donde xis + k.ws 0 y ademas xis k.ws 0 ya
que xis > 0, k > 0 y ws < 0
Luego yis = xis + k.ws 0 y zis = xis k.ws 0 para todo 1 s r.
Hemos probado entonces que existen y, z K, y 6= z tal que x = 12 y + 12 z. Absurdo, pues esto contradice
que x sea un punto extremo de K. Por lo tanto, las columnas de B son linealmente independientes.
Ahora estamos en condiciones de probar el teorema fundamental de la programacion lineal.
Teorema 3.14. Consideremos el problema de programacion lineal en forma standard

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

Sea v IRn definido por 


0 si j 6= i1 , . . . , ir
vj =
ws si j = is , 1 s r
8 Optimizaci
on Combinatoria

Entonces Av = 0 de donde y = x + .v verifica Ay = b y como



0 si j 6= i1 , . . . , ir
yj =
xis + .ws si j = is , 1 s r
entonces y 0.
Pero yj = 0 para j 6= i1 , . . . , ir y para alg
un is . Esto muestra que y es una soluci
on factible tal que r(y) < r.
Absurdo pues esto contradice la eleccion de r.
ii) Sea ahora r = min{r(x) / x es una soluci on optima } y sea x optimo tal que r(x) = r. Probaremos que
x es una soluci on basica. Si {j / xj 6= 0} = {i1 , . . . , ir } se tiene que xj = 0 j 6= i1 , . . . , ir y xj > 0
si j = i1 , . . . , ir . Como antes, basta ver que las columnas i1 , . . . , ir de A son linealmente independientes.
Supongamos que no. Sea B la submatriz de A formadas por esas columnas y sea w IRr , w 6= 0 tal que
Bw = 0. Sea v IRn como en i), es decir,

0 si j 6= i1 , . . . , ir
vj =
ws si j = is , 1 s r
Luego Av = 0.
Veamos ahora que cv = 0. En efecto, supongamos que cv 6= 0.
Primer caso: si cv > 0
Sea ( n o
xis
= max ws / ws > 0 si ws > 0
1 si ws 0 para todo s
Sea y = x + .v. Entonces Ay = b y cy = cx + .cv < cx pues < 0. Ademas y 0 pues yj = 0 para
j 6= i1 , . . . , ir y para 1 s r yis = xis + .ws 0 (para s tal que ws > 0 por la definici
on de y para s
tal que ws < 0 porque < 0). Absurdo pues esto contradice el hecho de que x es una soluci on optima.
Segundo caso: si cv < 0
Sea ahora
( n o
xis
= min ws / ws < 0 si ws < 0
1 si ws 0 para todo s
Tomando y = x + .v resulta que Ay = b y cy = cx + .cv < cx pues > 0 y ademas y 0. Nuevamente
esto es un absurdo pues x era optimo.
Luego, cv = 0. Sea ahora como en i) y sea tambien y = x + .v. Entonces resulta que Ay = b, y 0,
r(y) < r y cy = cx. Luego, y es una soluci
on optima tal que r(y) < r. Absurdo, esto contradice la elecci
on
de r.
Corolario 3.15. 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}.

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

< z0 c, z >=< a, z >= a.z = b = a.c =< a, c >=< z0 c, c >

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

El segmento que une z0 con c es ortogonal al segmento que une z con c.

||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

(A(x0 + ))i bi si y solo si (A)i 0

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

(A)i 0 para todo i I(x0 ) = c 0

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

para todo i / I(x0 ) / (A)i < 0.


Entonces para todo i / I(x0 ) es .(A)i (Ax0 )i bi (para los i tales que (A)i < 0 por la elecci
on de
y para los i tales que (A)i 0 porque (Ax0 )i bi > 0). Luego

bi (Ax0 )i + (A)i = (A(x0 + ))i

ii) Basta notar que (A(x0 + ))i = (Ax0 )i + (A)i


iii) (=) es inmediato a partir de ii). Veamos la otra implicacion. Supongamos que (A)i 0 para todo
i I(x0 ). Sea > 0 tal que i
/ I(x0 ) vale (A(x0 + ))i bi (su existencia esta garantizada por i)). Como
ademas (A(x0 + ))i bi para todo i I(x0 ) por ii) entonces es una direccion factible.
iv) Supongamos que x0 es un optimo de (P). Si es una direccion factible entonces existe > 0 tal que
A(x0 + ) b. Luego debe ser c(x0 + ) cx0 de donde resulta que c 0.
Recprocamente, si c 0 para toda direccion factible , sea x tal que Ax b. Veremos que cx cx0 .
Sea = x x0 . Entonces A(x0 + ) = Ax b. Luego es una direccion factible (con = 1). Por lo tanto
c(x x0 ) = c 0 y as cx cx0 .
v) (=) Supongamos que x0 es un optimo de (P). Si (A)i 0 para todo i I(x0 ) entonces es una
direccion factible por iii) y en consecuencia c 0 por iv).
(=) Por iii), para toda direccion factible es (A)i 0 para todo i I(x0 ). Luego, para toda direcci
on
factible vale c 0. Entonces x0 es un optimo de (P) por iv).
Ahora s estamos en condiciones de demostrar el teorema.
12 Optimizaci
on Combinatoria

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

(A)i 0 para todo i I(x0 ) = c 0


Si I(x0 ) = {i1 , . . . , ik }, sea U IRkn la submatriz formada por las filas i1 , . . . , ik de A. Entonces se tiene
que
U 0 (A)i 0 para todo i I(x0 )
Por lo tanto
U 0 = c 0
Entonces, por el lema de Farkas existe y IR , y 0, tal que c = y .U . Sea y IRm definido por
k

0 si j 6= i1 , . . . , ik
yj =
ys si j = is (1 s k)
Se tiene entonces que y 0 y que c = y.A. Esto muestra que y es una soluci on factible de (D).
Ademas, y.A.x0 = y.b. En efecto, si i I(x0 ) entonces (A.x0 )i = bi de donde yi .(A.x0 )i = yi .bi y si i
/ I(x0 )
entonces yi = 0 de donde yi .(A.x0 )i = 0 = yi .bi . Luego, c.x0 = y.Ax0 = y.b.
Por u
ltimo, veamos que y.b es un maximo de (D). Sea z una solucion factible de (D). Entonces z 0 y
c = z.A. Como b A.x0 y z 0 resulta que z.b z.A.x0 = c.x0 = y.b. Por lo tanto z.b y.b
Corolario 4.7. Los siguientes problemas son duales

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

Tomando y = (u, v, s) resulta

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.

on 4.8. Si x es una soluci


Observaci on factible de (P) e y es una soluci
on factible de (D) entonces yb cx.

Teorema 4.9. (Teorema de la holgura complementaria). Consideremos los problemas duales

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

Recprocamente, si x e y son factibles y para cada 1 j n se verifica

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.

Sean A IRmn , c IRn , b IRm y z0 IR.


14 Optimizaci
on Combinatoria

Consideremos el problema de programacion lineal

min z
z+cx = z0
Ax = b (2)
x0

donde las variables z y x toman valores en IR y IRn respectivamente.


Escribiendo matricialmente a (2) en la forma

min z
     
1 c z z0
. =
0 A x b
x0

consideremos la matriz ampliada  


1 c | z0
0 A | b
(a la que llamaremos tableau) donde llamaremos fila cero a la fila (1 c1 c2 cn z0 ) y filas 1, 2, . . . , m
a las restantes filas contadas de arriba hacia abajo. An alogamente llamaremos columna cero a la columna
1
y columnas 1, 2, . . . , n a las restantes columnas contadas de izquierda a derecha. Las soluciones del
0
sistema seran vectores (z, x) donde z es un n umero real y x = (x1 , . . . , xn ) es un vector de IRn .
El algoritmo simplex que vamos a describir resolvera este problema. Esto nos permitira resolver cualquier
problema de programacion lineal en forma standard

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

a coeficientes reales y = (0 , 1 , . . . , m ) es un vector de IRm+1 .


Programaci
on lineal 15

Definicion 5.1. Sea rs un coeficiente no nulo de . Llamaremos transformaci


on de la matriz ( | ) con
pivote rs a la sucesion de las operaciones elementales siguientes:

i) dividir la fila r por rs , es decir


1
Fr = .Fr
rs
is
ii) restar a cada fila i 6= r la fila r multiplicada por , es decir
rs
is
Fi = Fi .Fr (i 6= r)
rs

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

en la fila r y ceros en las restantes filas.


En efecto, basta observar que ( | ) es la matriz

columna s
0s
00 rs r0 ... 0s rs
0s
rs ... 0n 0s
rs rn | 0 0s
rs r



10 1s r0 ... 1s 1s
rs rs ... 1n 1s
rs rn | 1s
1 rs r
rs
.. .. .. ..
. ... . ... . | .


... rs
... rn
| 1
rs r
r0
rs rs rs
.. .. .. ..

. ... . ... . | .

m0 ms rs
r0 . . . ms ms
rs
rs . . . mn ms
rs
rn | m ms rs
r

on 5.3. Haciendo una transformacion pivote en la matriz


Observaci
 
1 c | z0
0 A | b

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

Ejemplo 5.4. Consideremos el problema de la forma


min z
z+cx = z0
Ax = b
x0
dado por
min z
z + 2x1 + x2 x4 = 2
3x1 + x2 2x3 + 2x4 = 1
2x1 + 3x2 + x3 + x4 = 2
x1 + x2 + x4 = 1
x1 , x2 , x3 , x4 0
cuyo tableau es

  1 2 1 0 1 | 2
1 c | z0 0 3 1 2 2 | 1
=
0 A | b 0 2 3 1 1 | 2
0 1 1 0 1 | 1
Hacemos primero una transformacion con pivote en un coeficiente ars de A, por ejemplo, ars = a11 = 3. En
la matriz se
nalaremos el pivote marcandolo con un asterisco.
Las operaciones de fila son:
2
F0 = F0 .F1
3
1
F1 = .F1
3
2
F2 = F2 .F1
3
1
F3 = F3 .F1
3
Por lo tanto

1 2 1 0 1 | 2 1 0 1/3 4/3 7/3 | 4/3

0 3 1 2 2 | 1 0 1 1/3 2/3 2/3 | 1/3

0 2 3 1 1 | 2 0 0 7/3 7/3 1/3 | 4/3
0 1 1 0 1 | 1 0 0 4/3 2/3 5/3 | 4/3
 
1 c | z0
Notemos que en esta u ltima matriz a la que, para confundir al lector, volvemos a llamar ,
0 A | b
la columna uno de A es el vector e1 y c1 = 0. Ahora hacemos en ella una transformacion con pivote en un
coeficiente ars de A, por ejemplo, ars = a24 = 1/3. Las operaciones de fila ahora son:
7/3
F0 = F0 F2
1/3
2/3
F1 = F1 .F2
1/3
1
F2 = .F2
1/3
5/3
F3 = F3 .F2
1/3
Programaci
on lineal 17

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

En general, consideremos el problema (2), es decir, el problema

min z
z+cx = z0
Ax = b (2)
x0

Supongamos que haciendo en el tableau  


1 c | z0
0 A | b
una sucesion de transformaciones pivote donde en cada una el pivote es alguno de los coeficientes de las filas
entre 1 y m y las columnas entre 1 y n de la matriz obtenida con la transformacion anterior, obtenemos el
tableau  
1 c | z0
0 A | b
y supongamos ademas que A contiene m columnas (llamadas unitarias) que permutadas convenientemente
forman la matriz identidad Im de mm, que las coordenadas de c correspondientes a esas columnas unitarias
son nulas y que b 0. Entonces, si el vector ek se encuentra en la columna ik de A , tomando x definido
por xj = 0 para j 6= i1 , . . . , im y (xi1 , . . . , xim ) = b se tiene que c x = 0 (pues ci1 = 0, . . . , cim = 0 y xj = 0
para j 6= i1 , . . . , im ). Ademas, si B es la submatriz de A formada por las columnas i1 , . . . im de A entonces,
como xj = 0 para j 6= i1 , . . . , im ,

xi1
.
A x = B . .. = B .b = b

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

y por lo tanto es soluci


on del sistema equivalente
     
1 c z z0
. =
0 A x b

Ademas, como b 0, entonces x 0.  


1 c
Por u ltimo, como las columnas 0, i1 , . . . , im de forman la matriz identidad Im+1 entonces las
  0 A
1 c
columnas 0, i1 , . . . , im de son linealmente independientes. Esto muestra que (z0 , x ) es una soluci
on
0 A
asica y factible de (2) y el valor del funcional en ella es z0 . Mas a
b un, x es una soluci
on b asica de Ax = b
(pues las columnas i1 , . . . , im de A forman la matriz identidad Im y A se obtuvo de A mediante una sucesi

on

de transformaciones pivote) que satisface x 0 y z0 = cx + z0 pues (z0 , x ) es una soluci on factible de (2).


1 c | z0
Si fuese el tableau obtenido por el algoritmo en una iteracion, entonces el tableau co-
0 A | b
rrespondiente a la iteracion siguiente se obtendr a a partir de el haciendo una transformacion con el pivote

elegido entre los coeficientes de A .
Programaci
on lineal 21
 
1 c | z 0
Si es el tableau as obtenido, es f acil ver que entonces A contiene m columnas unitarias y
0 A | b
que las coordenadas de c correspondientes a esas columnas unitarias son nulas. Si ahora el vector ek se en-
cuentra en la columna ik de A entonces tomando x definido por xj = 0 para j 6= i1 , . . . , im y (xi1 , . . . , xim ) = b
resulta que (z 0 , x) es una solucion b asica de (2), el valor del funcional en ella es z 0 , y que es factible si y s olo

si b 0. Luego, si elegimos el pivote para que resulte b 0 y z 0 z0 resulta que (z 0 , x) es una soluci on
basica y factible de (2) y el valor del funcional en ella es menor o igual que el valor del funcional en la
soluci asica y factible (z0 , x ) que tenamos presente en la iteracion anterior. Ademas, x es una soluci
on b on
basica de Ax = b que satisface x 0 t z 0 = cx + z0 . Luego, cualquiera sea z0 , x es una soluci on b asica y
factible del problema en forma standard
min cx
Ax = b
x0

que satisface cx = z 0 z0 z0 z0 = cx . Mas aun, si (z 0 , x) fuese una soluci


on optima de (2) entonces,
cualquiera sea z0 , x sera una soluci
on optima del problema en forma standard y el valor del funcional en
ella sera cx = z 0 z0 . En efecto, si x es una soluci
on factible del problema en forma standard entonces
tomando z = cx + z0 resulta que (z, x) es una soluci on factible de (2). Luego debe ser z 0 z, de donde
cx = z 0 z0 z z0 = cx.
Veamos ahora como debemos elegir el pivote ars para que valga b 0 y z 0 z0 . Como

b ais
i ars br para i 6= r
bi =
br para i = r
ars

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

on 5.6. No siempre se puede lograr transformar mediante operaciones pivote un sistema


Observaci
     
1 c z z0
. =
0 A x b

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.

6. Estructura general del algoritmo simplex.


Sean A IRmn una matriz de rango m, c IRn y sea b IRm . Denotaremos con Ik a la matriz identidad
de k k.
Definicion 6.1. Diremos que A contiene una matriz permutaci on de Im sii tiene m columnas que permutadas
convenientemente forman la matriz identidad de m m, es decir, si existen m columnas i1 , . . . , im de A tales
que la columna ik es el vector ek . En tal caso llamaremos a las columnas i1 , . . . , im de A columnas unitarias.
on 6.2. Diremos que el sistema lineal
Definici
     
1 c z z0
. =
0 A x b
o tambien que el tableau  
1 c | z0
0 A | b
esta en forma can
onica si valen las dos condiciones siguientes:
i) A contiene una matriz permutaci
on de Im , es decir, contiene m columnas unitarias i1 , . . . , im , , que forman
la mantriz identidad de m m.
ii) Las coordenadas de c correspondientes a las columnas unitarias i1 , . . . , im de A son nulas, es decir,
ci1 = 0, . . . , cim = 0.  
1 c
Notemos que estas dos condiciones son equivalentes a pedir que la matriz contenga una matriz
0 A
permutaci on de Im+1 .
Ejemplo 6.3. Si

1 0 1 0 1 1
A = 1 1 1 0 0 1 c = (2, 0, 1, 0, 0, 1) b = (2, 1, 1/2) y z0 = 1
1 0 0 1 0 2
Programaci
on lineal 23

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

que este en forma can


onica y tal que b 0 y obtendremos, mediante una transformacion pivote en la matriz
 
1 c | z0
0 A | b

otro sistema equivalente      


1 c z z0
. =
0 A x b
que tambien estara en forma can on 6.4), tal que b 0 y de manera que z0 z0 . El
onica (ver observaci
pivote sera un cierto coeficiente ars de A, donde r y s seran elegidos para que valgan b 0 y z0 z0 . De
esta manera el algoritmo encontrara, en cada iteracion, una soluci
on basica (z0 , x ) con el valor del funcional
en ella menor o igual que el valor del funcional en la soluci on anterior (z0 , x). El algoritmo solo se podr a
24 Optimizaci
on Combinatoria

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.

7. El algoritmo simplex en el caso can


onico.
Consideremos el problema
min z
z+cx = z0
Ax = b
x0
y supongamos que el sistema      
1 c z z0
. =
0 A x b
esta en forma can
onica y que b 0.
Recordemos que en la matriz ampliada del sistema
 
1 c | z0
0 A | b
 
1
hemos llamado fila cero a la fila (1 c1 c2 cn z0 ) y columna cero a la columna .
0
Sean F1 , . . . , Fm las restantes filas. Luego, si Ai denota la i-esima fila de A entonces Fi = (0 Ai bi ). De este
modo una transformacion con pivote en un coeficiente de la fila r y la columna s (1 r m, 1 s n)
es una transformacion con pivote en el coeficiente ars de A. Notemos que si hacemos una transformaci on
con pivote en un coeficiente de A en un sistema can onico el sistema que obtendremos volvera a ser can onico
Programaci
on lineal 25

(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.

on 7.1. Si 6 s tal que cs < 0 entonces (z0 , x) es una soluci


Proposici on optima de

min z
z+cx = z0
Ax = b
x0

donde x esta definido por 


0 si j 6= i1 , . . . , im
xj =
bk si j = ik (1 k m)
siendo ik la columna unitaria de A que corresponde al vector ek , que verifica ademas cik = 0
Demostraci on: Como cx = 0 (pues xj = 0 para todo j 6= i1 , . . . , im y ci1 , . . . , cim = 0) entonces (z0 , x) es
soluci
on de

z + cx = z0
Ax = b
x0

Supongamos que (z , x ) tambien sea soluci


on. Entonces z = z0 + cx z0 pues x 0 y, por hip
otesis,
c 0. Esto muestra que (z0 , x) es una solucion optima.
26 Optimizaci
on Combinatoria

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

no tiene ninguna soluci


on factible que sea optima.
Demostraci on: Supongamos que ais 0 para todo 1 i m y que existe una soluci
on factible optima
(z, x).
El sistema lineal es      
1 c z z0
. =
0 A x b
donde la columna ij de A es el vector ej (1 i m), ci1 = 0, . . . cim = 0 y b 0. Como (z, x) es soluci
on
entonces z = z0 + cx. Ademas, s 6= i1 , . . . im pues cs < 0.
Sea y 0 definido por (
1 si j = s
yj = aks si j = ik (1 k m)
0 en otro caso
Notemos que como ci1 = 0, . . . , cim = 0 entonces cy = cs ys = cs . Ademas, como la columna ij de A es el
vector ej entonces 
0 si k 6= j
akij =
1 si k = j
Luego, teniendo en cuenta que ys = 1 resulta que, 1 k m,

(Ay)k =ak1 y1 + + akn yn =


=aki1 yi1 + + akim yim + aks ys =
=yik + aks = aks + aks = 0

de donde Ay = 0. Tomando x = x + y se tiene que x 0 y Ax = b. Luego, si z = z0 + cx resulta que


(z , x ) es una soluci
on del sistema lineal y x 0.
Pero z = z0 + cx = z0 + cx + cy = z + cs < z, cosa que contradice el hecho de que (z, x) era una soluci
on
optima.

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 x2 3x3 + 2x5


x1 + 3x2 x3 + 2x5 = 7
2x2 + 4x3 + x4 = 12
4x2 + 3x3 + 8x5 + x6 = 10
x0
Para ello, lo escribimos en la forma equivalente

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

En este caso, el vector e1 esta en la columna 1 de A, el vector e2 en la columna 4 y el vector e3 en la columna


6. Es decir, i1 = 1, i2 = 4, i3 = 6. Luego, la matriz a la que aplicaremos el algoritmo es

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
Observemos que este sistema esta en forma canonica y que b 0, por lo tanto estamos en condiciones de
aplicar el algoritmo.
Ahora debemos determinar la fila r y la columna s del pivote. La columna s debe elegirse tal que cs < 0,
luego debe ser s = 3 (recordemos que la primera fila y la primera columna de la matriz
 
1 c | z0
0 A | b
28 Optimizaci
on Combinatoria

son la fila cero y la columna cero).


Ahora determinemos el r correspondiente a s = 3: la fila r se elige tal que
 
br bi
= min / ais > 0 =
ars ais
 
bi
= min / ai3 > 0 =
ai3
 
b2 b3 b2
= min , =
a23 a33 a23

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

La solucion (z0 , x) correspondiente es (9, 10, 0, 3, 0, 0, 1) con un valor del funcional z = 9.


Luego, x = (10, 0, 3, 0, 0, 1) es una soluci
on b
asica y factible del problema en forma standard dado y el valor
del funcional en x es z0 = 9, es decir, x2 3x3 + 2x5 = 9.
Como existe s tal que cs < 0, debemos hacer otra iteracion del algoritmo para obtener una nueva soluci on
con menor valor del funcional.
Con el mismo criterio usado anteriormente, elegimos s = 2 y r = 1 y hacemos las correspondientes operaciones
de fila y las actualizaciones de los ndices de las columnas unitarias 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
obteniendo
Programaci
on lineal 29


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

de donde resulta que x = (0, 4, 5, 0, 0, 11) es una soluci


on b
asica optima de

min x2 3x3 + 2x5


x1 + 3x2 x3 + 2x5 = 7
x2 + 4x3 + x4 = 12
4x2 + 3x3 + 8x5 + x6 = 10
x0

on el valor del funcional es z0 = 11, es decir, x2 3x3 + 2x5 = 11.


y en esa soluci
Ejemplo 7.4.
Veamos que si cambiamos ligeramente el sistema del ejemplo anterior los resultados son completamente
diferentes. Consideremos el sistema

min x2 3x3 + 2x5


x1 x3 + 2x5 = 7
2x2 + 4x3 + x4 = 12
4x2 + 3x3 + 8x5 + x6 = 10
x0
Ahora la matriz a la que debemos aplicar el algoritmo es

1 0 1 3 0 2 0 | 0
1 0 1 0 1 0 2 0 | 7

4 0 0 2 4 1 0 0 | 12
6 0 0 4 3 0 8 1 | 10
Haciendo la correspondiente transformacion pivote, el tableau

1 0 1 3 0 2 0 | 0
1 0 1 0 1 0 2 0 | 7

4 0 0 2 4 1 0 0 | 12
6 0 0 4 3 0 8 1 | 10
30 Optimizaci
on Combinatoria

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.

8. El algoritmo simplex en el caso general.


Consideremos ahora el problema

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 )

para el cual ahora valen i), ii) y iii).


En general, si el sistema dado no esta en forma canonica, encontrar un sistema equivalente que verifique i),
ii) y iii) no es tan sencillo. Describiremos ahora una forma de proceder en esta situaci
on que nos permitira
resolver el problema conocida como FASE 1.
Dado el problema
min z
z+cx = z0
Ax = b (2)
x0
Programaci
on lineal 31

donde (tal como vimos en la observaci


on 8.1., podemos suponer que) b 0, si este sistema no estuviera en
forma can
onica consideremos entonces el problema auxiliar

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.

Proposici on 8.3. Las siguientes condiciones son equivalentes


a) (2) es factible
b) (3) tiene una soluci
on optima (w, x, s) que satisface w = 0
Demostraci on: Veamos primero que a) implica b). Sea (z, x) una soluci on factible de (2) y sean w = 0,
x = x y s = 0. Entonces (w, x, s) es una soluci on factible de (3) que satisface w = 0. Veamos que es
optima: si (w , x , s ) es una soluci
on factible de (3) entonces w = s1 + + sm y si 0 para todo i. Luego
w 0 = w.
Veamos ahora que b) implica a). Supongamos que (3) tiene una soluci on optima de la forma (0, x, s).
Entonces s 0 y s1 + + sm = 0 de donde s = 0 y por lo tanto Ax = Ax + Is = b. Ademas, x 0. Luego
tomando z = z0 + cx y x = x resulta que (z, x) es una soluci on factible de (2).

Veamos ahora la FASE 2.


32 Optimizaci
on Combinatoria

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

debe ser un tableau de la forma  


1 d f | 0
0 A I | 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

Veremos que (x , s ) es una soluci


on de (4) si y solo si s = 0 y x es una soluci
on de (5).

Sea (x , s ) una solucion de (4). Entonces (0, x , s ) es una solucion de

w + d x + f s = 0
A x + I s = b
x, s 0

ya que d x + f s = 0. En efecto, si j = j1 , . . . , jr entonces xj = 0 y si j 6= j1 , . . . , jr entonces dj = 0, por


lo tanto d x = 0. An alogamente, si j = k1 , . . . , kt entonces sj = 0 y si j 6= k1 , . . . , kt entonces fj = 0, por lo

tanto f s = 0. Pero los sistemas

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

fue obtenida haciendo operaciones elementales de fila en la matriz


 
1 0n 1m | 0
0 A Im | b

Luego (0, x , s ) es soluci


on de
w + s1 + + sm = 0
Ax + Is = b
x, s 0
de donde
s1 + + sm = 0
Ax + Is = b
x , s 0
Entonces debe ser s = 0, y por lo tanto Ax = b. Luego s = 0 y y x es soluci
on de (5).
Recprocamente, si s = 0 y x es una soluci
on de (5) entonces Ax = b y x 0, de donde (0, x , 0) es una
soluci
on de
w + s1 + + sm = 0
Ax + Is = b
x, s 0
Luego es soluci
on del problema equivalente

w + d x + f s = 0
A x + I s = b
x, s 0

Por lo tanto d x = 0, de donde xj = 0 para j = j1 , . . . , jr (ya que para j 6= j1 , . . . , jr es dj = 0 y para


j = j1 , . . . , jr es dj > 0 y xj 0) y se tiene entonces que (x , s ) = (x , 0) es una soluci
on de (4) .
Hemos probado entonces que (x , s ) es una soluci
on de

A x + I s = b
xj = 0 j = j1 , . . . , jr
sj = 0 j = k1 , . . . , kt
x, s 0

si y solo si s = 0 y x es una soluci


on de

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

la biyeccion definida por


kl , . . . , sm )
(s1 , . . . , sm ) = (s1 , . . . , sc
donde (s1 , . . . , sc
kl , . . . , sm ) es el vector que resulta de eliminar en (s1 , . . . , sm ) las coordenadas k1 , . . . , kt .
Consideremos el tableau  
1 c 0 | z0
0 A I | b
que resulta de eliminar en  
1 c 0 | z0
0 A I | b
las columnas j1 , . . . , jr , n + k1 , . . . n + kr , es decir, el que resulta de la matriz

1 d f | 0
1 c 0 | z0
0 A I | b

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).

Ejemplo 8.4. Resolvamos el problema

min 2x1 +3x2 + 2x3 x4 + x5


3x1 3x2 +4x3 + 2x4 x5 = 1
x1 + x2 +x3 + 3x4 + x5 = 2
x0
Primero lo escribimos en la forma equivalente

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

FASE 1: consideremos el problema auxiliar

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

donde d = (4, 2, 5, 5, 0) y z0 = 3. Ahora aplicamos el simplex



1 4 2 5 5 0 0 0 | 3
6 0 3 3 4 2 1 1 0 | 1
7 0 1 1 1 3 1 0 1 | 2

1 1/4 7/4 0 5/2 5/4 5/4 0 | 7/4
3 0 3/4 3/4 1 1/2 1/4 1/4 0 | 1/4
7 0 1/4 7/4 0 5/2 5/4 1/4 1 | 7/4

1 7/2 11/2 5 0 5/2 5/2 0 | 1/2
4 0 3/2 3/2 2 1 1/2 1/2 0 | 1/2

7 0 7/2 11/2 5 0 5/2 3/2 1 | 1/2

1 0 0 0 0 0 1 1 | 0
4 0 6/11 0 7/11 1 2/11 1/11 3/11 | 7/11 =
2 0 7/11 1 10/11 0 5/11 3/11 2/11 | 1/11
 
1 d f | 0
=
0 A I | b
   
6/11 0 7/11 1 2/11 1/11 3/11
donde se tiene d = (0, 0, 0, 0, 0), f = (1, 1), A = , I =
7/11 1 10/11 0 5/11 3/11 2/11
y b = (7/11, 1/11).
FASE 2: Consideremos el tableau

1 d f | 0
1 c 0 | 0
0 A I | b
es decir,

1 0 0 0 0 0 1 1 | 0
1 2 3 2 1 1 0 0 | 0

4 0 6/11 0 7/11 1 2/11 1/11 3/11 | 7/11
2 0 7/11 1 10/11 0 5/11 3/11 2/11 | 1/11
y eliminemos las columnas correspondientes a los ndices j tales que dj > 0 y las columnas artificiales que
no son unitarias y luego descartemos la primera fila que es nula, obteniendo

1 2 3 2 1 1 | 0
4 0 6/11 0 7/11 1 2/11 | 7/11
2 0 7/11 1 10/11 0 5/11 | 1/11
Este tableau satisface i) y iii) pero no ii). Por lo tanto hacemos la transformacion de filas

F0 = F0 ci1 F1 ci2 F2 = F0 c4 F1 c2 F2 = F0 (1)F1 3F2


obteniendo el tableau equivalente

1 49/11 0 59/11 0 2/11 | 4/11
4 0 6/11 0 7/11 1 2/11 | 7/11
2 0 7/11 1 10/11 0 5/11 | 1/11

que esta en forma can


onica y volvemos a aplicar el simplex.

1 49/11 0 59/11 0 2/11 | 4/11
4 0 6/11 0 7/11 1 2/11 | 7/11
2 0 7/11 1 10/11 0 5/11 | 1/11
Programaci
on lineal 37


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

y ahora tomando x = 1 (u ) = (0, 0, 0, 3/5, 1/5) y s = (0, 0) se tiene que s = 0 y (z , x ) es la soluci


on
optima de
min z
z + cx = 0
Ax = b
x0
con un valor del funcional z = 2/5, y por lo tanto x = (0, 0, 0, 3/5, 1/5) es el optimo de

min 2x1 +3x2 + 2x3 x4 + x5


3x1 3x2 +4x3 + 2x4 x5 = 1
x1 + x2 +x3 + 3x4 + x5 = 2
x0

con un valor del funcional cx = 2x1 + 3x2 + 2x3 x4 + x5 = 2/5.


Ejemplo 8.5. Resolvamos ahora el problema

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

F0 = F0 ((1)F1 + 0F2 + 1/2F3 )


y actualizamos los valores de ij a la nueva situaci
on obteniendo

1 5/3 0 0 0 | 1/3
3 0 1/3 0 1 0 | 1/3

4 0 0 0 0 1 | 0
2 0 2/3 1 0 0 | 4/3
y volvemos a aplicar el simplex a este u
ltimo tableau:

1 5/3 0 0 0 | 1/3 1 0 5/2 0 0 | 3
3 0 1/3 0 1 0 | 1/3 3 0 0 1/2 1 0 | 1

4 0 0 0 0 1 | 0 4 0 0 0 0 1 | 0
2 0 2/3 1 0 0 | 4/3 1 0 1 3/2 0 0 | 2
on auxiliar: z = 3, (u , v ) = (2, 0, 1, 0).
Soluci
Ahora tomando x = 1 (u ) = (2, 0, 0, 1) y s = 1 (v ) = (0, 0, 0) resulta que s = 0 y (z , x ) es una
soluci
on de

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

es decir, x = (2, 0, 0, 1) es una soluci


on optima del problema

1
min x1 + x2 + 3x3 x4
2
x1 +x2 x4 = 1
x2 +2x3 + 2x4 = 2
2x1 + x2 4x3 4x4 = 0
x0

con un valor del funcional x1 + 12 x2 + 3x3 x4 = z = 3.


Esta soluci
on es degenerada (ver definici on 3.9.) porque #{j / xj 6= 0} = 2 < 3 = rg A, donde

1 1 0 1
A = 0 1 2 2
2 1 4 4

es la matriz del sistema.

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

Se tiene entonces que Ax = b, x 0 y c.x = z0 + z 0 = y.b pues z 0 = z0 y.b.


Consideremos los problemas primal y dual

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

y que (z0 , x ) es una soluci


on factible (respectivamente optima) de este problema si y solo si x es una soluci on

factible (respectivamente optima) de (P) y c.x
 = z 0 z 0 . En otras palabras, lo que estamos haciendo al
1 c | z0
aplicar el simplex al tableau es resolver (P) teniendo en cuenta que si x es la soluci on
0 A | b 
1 c | z0
factible de (P) correspondiente al tableau de una iteracion, entonces c.x = z 0 z0 .
0 A | b
Luego, en cada iteracion tenemos una soluci on factible x IRn de (P) y un vector y IRm tales que
c.x = z 0 z0 , y.b = c.x y c = c y.A.
 
1 c | z 0
Supongamos que sea el u
ltimo tableau obtenido por el algoritmo. Si alguna coordenada
0 A | b
de c es negativa entonces (P) no tiene optimo. Dejamos como tarea al lector verificar que eso implica que
(D) no es factible. Veamos ahora que sucede si c 0. Como 0 c = c y.A, entonces y.A c. Luego, en
este caso, x es una soluci on factible de (P), y es una soluci on factible de (D) y vale c.x = y.b de donde, por
la observaci on 4.10, se tiene que x es el optimo de (P) e y es el optimo de (D).
Recprocamente, supongamos ahora que en cada iteracion partimos de un tableau
 
1 c | z0
0 A | b

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

y supongamos que este tableau inicial est


a en forma can
onica y que c 0.
Programaci
on lineal 41

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

Este algoritmo solo se podr


a aplicar si el tableau inicial esta en forma can
onica y el vector de costos originales
es no negativo. En cada iteracion queremos, mediante una transformacion pivote en un tableau
 
1 c | z0
0 A | b
obtener un tableau equivalente
 
1 c | z 0
0 A | b
onica y tal que c 0 y z 0 z0 , hasta lograr que b sea no negativo. Veamos
que tambien estara en forma can
como hacer esto.
Supongamos que el tableau obtenido en una iteracion sea
 
1 c | z0
0 A | b

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.

Ejemplo 9.1. Resolvamos el problema

min 3x2 +x3


x2 + 2x3 +x4 = 1
x1 + x2 3x3 = 2
x0

utilizando el algoritmo dual.


El correspondiente tableau es

1 0 3 1 0 | 0
4 0 0 1 2 1 | 1
1 0 1 1 3 0 | 2
Elegimos r = 2 pues b2 < 0. Ahora elegimos s = 3 ya que
 
c3 cj
= max / a2j < 0
a23 a2j

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

Luego, x = (0, 7, 3, 0) es la soluci


on optima y el valor del funcional en esta soluci
on es 3x2 + x3 = 24.
Programaci
on lineal 43

Ejemplo 9.2. Supongamos que queremos resolver

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

entonces el tableau inicial sera  


1 c 0 | 0
0 A I | b
con c 0, resulta que lo podemos resolver aplicando el algoritmo dual.
Ejemplo 9.3. Evitar la FASE 1.

Cualquier problema de programacion lineal puede plantearse en la forma

min cx
Ax b
x0

Agregando variables de holgura se tiene el tableau


 
1 c 0 | 0
0 A I | b

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

Como z0 es optimo entonces c 0 y b 0. Supongamos que ahora queremos agregar la restricci


on

d1 x1 + + dn xn b0

al problema original. Si la presente soluci


on b
asica satisface esta desigualdad, no hay nada mas que hacer.
Pero si no, agregando la restriccion con su correspondiente variable de holgura y teniendo en cuenta los
cambios de variables que hayamos realizado, obtenemos el tableau

1 c 0m 0 | z0
0 A Im 0 | b
0 f g 1 | b0

donde g = (di1 , . . . , dim ) y f es el vector formado por las restantes componentes de d.


Ahora, cambiando la u ltima fila por ella menos una combinaci on lineal de las demas de modo que las
componentes de g se transformen en ceros, es decir, haciendo la operacion de filas


Fm+1 = Fm+1 g1 F1 gm Fm

obtenemos el tableau equivalente


1 c 0m 0 | z0
0 A Im 0 | b
0 f 0 1 | b0
que esta en forma can
onica y, como c 0, podemos aplicar el algoritmo dual.

10. El algoritmo simplex revisado.


n
Supongamos que queremos encontrar un algoritmo que calcule, dado n, el valor de 52 . Uno posible sera
Paso 1 x1 = 5
Paso 2 x2 = 5x1
Paso 3 x3 = 5x2
.. ..
. .
Paso 2n x2n = 5x2n 1

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

Observemos que dado un tableau  


1 c | z0
0 A | b
en forma can
onica, el siguiente tableau se obtiene haciendo una transformacion con pivote en cierto coeficiente
ars de A. Esto equivale a multiplicar a izquierda el tableau dado por la matriz inversible Urs IR(m+1)(m+1)

columna r
1 0 0 ... 0 0 cs /ar s 0 0 ... 0 0

0 1 0 ... 0 0 a1 s /ar s 0 0 ... 0 0

.. .. .. ..
. . . .

0 0 0 ... 0 1 ar1 s /ar s 0 0 ... 0 0
Urs =
0

0 0 ... 0 0 1/ar s 0 0 ... 0 0 fila r
0 0 0 ... 0 0 ar+1 s /ar s 1 0 ... 0 0

. .. .. ..
.. . . .

0 0 0 ... 0 0 am s /ar s 0 0 ... 0 1

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

Debemos guardar, ademas, el u


ltimo valor de (i1 , . . . , im ) para poder conocer la soluci
on b
asica optima al
terminar el algoritmo.
Dado el tableau Tk de un paso k
1 c1 ... cn | z0
i1 0 a11 ... a1n | b1

T k = i2 0 a21 ... a2n | b2
.. . .. .. ..
. .
. . . | .
im 0 am1 . . . amn | bm
 
z0
sean F0 (k) la fila cero (es decir, F0 (k) = (1, c, z0 ), Cs (k) la columna s, B(k) la columna y sea
b
I(k) = (i1 , . . . , im ).
Supongamos que el algoritmo ha realizado k pasos. Veamos como es el paso k + 1. A partir del tableau
Tk obtenido en el paso k, se calculan los valores de r y s que determinan el pivote. Llamemos Pk+1 a la
matriz Urs correspondiente a estos valores de r y s calculados en el paso k + 1. Multiplicando Tk a izquierda
por la matriz Pk+1 se obtiene el tableau Tk+1 del paso k + 1, es decir, Tk+1 = Pk+1 .Tk . Los valores de
I(k + 1) = (i1 , . . . , im ) se calculan a partir de los valores de I(k) = (i1 , . . . , im ) en la forma

ij si j 6= r
ij =
s si j = r

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 T0 el tableau inicial. Entonces

Tk+1 = Pk+1 .Tk = Pk+1 .Pk .Tk1 = = Pk+1 . . . P1 .T0

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.

Notemos que ahora no trabajamos con matrices de (m + 1) (n + 1) sino de (m + 1) (m + 1) y que solo


hacemos las operaciones indispensables y guardamos la menor cantidad de informacion en la memoria.
Observaci on 10.2. Errores de redondeo.
Como Ek se obtiene multiplicando Pk por Ek1 , en cada iteracion se producen errores de redondeo que se
arrastran. Para evitar que el error crezca demasiado conviene recalcular cada tanto la matriz Ek . Veamos
como hacer esto.
Si I(k) = (i1 , . . . , im ) y Cij (T0 ) y Cij (Tk ) denotan la columna ij del tableau inicial y del tableau del paso k
respectivamente, como Ek .T0 = Tk entonces
 
0
Ek .Cij (T0 ) = Cij (Tk ) =
ej

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

donde B es la submatriz de A formada por las columnas i1 , . . . , im e y = cB .B 1 , con cB = (ci1 , . . . , cim ).


En efecto, como  
1 c | z0
T0 =
0 A | b
entonces 1
1 1
1 ci1 ... cim
0
. 0
Ek = .
. Ci1 (T0 ) Cim (T0 ) = ... C (A) C (A) =
0 i1 im
0
0
 1    
1 cB 1 cB .B 1 1 y
= = =
0 B 0 B 1 0 B 1
ya que      
1 cB 1 cB .B 1 1 0
. = = Im+1
0 B 0 B 1 0 Im
 
1 y
Esto muestra que si el problema tiene solucion optima y E = es el valor de E que est
a presente
0 U
cuando el algoritmo para, entonces y es el optimo de

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.

11. Convergencia del algoritmo simplex.


Queremos ver si podemos asegurar que el algoritmo termina en un n umero finito de pasos. En cada iteraci
on
del algoritmo obtenemos una soluci on b
asica con el correspondiente valor del funcional menor o igual que
el valor del funcional en la soluci
on basica del paso anterior. Sabemos, por la proposici on 3.11., que la
48 Optimizaci
on Combinatoria

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

Luego, z 0 = z0 sii br = 0 sii la componente xir = xs de la nueva soluci on b


asica x es nula, donde ir = s es la
columna en la que se encuentra el vector er despues de hacer la transformacion con pivote en ars con la que
obtuvimos z 0 . Luego, la soluci on b
asica x es degenerada (ver definici
on 3.9.). Por lo tanto, si ninguna de las
soluciones b
asicas que se van obteniendo fuese degenerada entonces el valor de z0 se reducira estrictamente.
Sin embargo, no podemos asegurar que no existan soluciones degeneradas. Por ejemplo, si al elegir el pivote
se tuviera que  
br bt bi
= = min / ais > 0
ars ats ais
entonces haciendo una transformacion con pivote ars resulta

br
bt = bt ats =0
ars

y esto podra dar lugar a una soluci on b


asica degenerada si el pr
oximo pivote se eligiera en la fila t.
Luego podra ocurrir que el valor de z0 no cambiara durante k iteraciones. Supongamos que para alg un h
fuera I(h + k) = I(h), es decir, que luego de k iteraciones se repita el valor de (i1 , . . . , im ). Entonces la
soluci
on basica se repetira y por lo tanto el valor de z0 (luego, z0 debio haber sido constante a lo largo de
las k iteraciones). En este caso el algoritmo entrara en un loop:
Si I(h) = (i1 , . . . , im ) = I(h + k) entonces
1
1
0
Eh =
...
= Eh+k
Ci1 (T0 ) Cim (T0 )
0

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

(5, 6, 7) (1, 6, 7) (1, 2, 7) (3, 2, 7)

(3, 4, 7) (5, 4, 7) (5, 6, 7)


Programaci
on lineal 49

Esto muestra que en este caso el algoritmo entra en un loop.


Veamos ahora como cambiar ligeramente el criterio usado para elegir la fila del pivote de manera de garantizar
que el algoritmo no entre en un loop. Supongamos que el valor actual de I es (i1 , . . . , im ). Una vez elegido
s, elegimos r tal que
 
1 1
(br , r1 , . . . , rm ) = min (bl , l1 , . . . , lm ) / als > 0
ars als

siendo lj los coeficientes de la matriz B 1 , donde

B = (Ci1 (A) Cim (A))

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

Veamos que ahora podemos asegurar que el algoritmo termina en un n


umero finito de pasos.
Teorema 11.2. Si en cada iteracion del algoritmo simplex se elige la fila r del pivote con el criterio
 
1 1
(br , r1 , . . . , rm ) = min (bl , l1 , . . . , lm ) / als > 0
ars als
n

entonces el algoritmo termina en a lo sumo m iteraciones.
n

Demostraci on: Probaremos que I(k) 6= I(k ) si k 6= k . Como hay a lo sumo m posibles valores de I(k)
n

entonces habra a lo sumo m iteraciones.
Veremos primero que el vector (z0 , y), donde y = cB .B 1 siendo B la submatriz formada por las columnas
i1 , . . . , im de A (ver observaci
on 10.3.), crece estrictamente en el orden lexicogr
afico en cada iteraci
on del
algoritmo.
Sea  
1 c | z0
Th =
0 A | b
el tableau de un cierto paso h y sea  
1 c | z 0
Th+1 =
0 A | b
el tableau correspondiente al paso h + 1 obtenido de Th haciendo una transformacion con pivote en ars ,
donde r fue elegido seg
un el criterio
 
1 1
(br , r1 , . . . , rm ) = min (bl , l1 , . . . , lm ) / 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.

12. Consideraciones finales.


Consideremos el problema de programacion lineal
min z
z + cx = z0
Ax = b
x0
Programaci
on lineal 51

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

Si el optimo del problema que resolvimos se obtuvo en el paso k entonces


 
1 c | z 0
Tk = Ek .T0 =
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

Si no, podemos aplicar el algoritmo dual a este u


ltimo tableau.
Supongamos ahora que lo que queremos cambiar es el valor de c por, digamos, c . Ahora
   
1 c | z0 1 c | z0
T0 = y T0 =
0 A | b 0 A | b
y si  
1 c | z 0
Tk = Ek .T0 =
0 A | b
entonces  
1 c | z 0
Ek .T0 =
0 A | b
con b 0. Si c 0 entonces tenemos el optimo y si no, podemos aplicar el simplex a este tableau.

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

0.(z0 ) + j1 b1 + + jl1 bl1 + jl bl + jl+1 bl+1 + + jm bm 0

para todo j. Pero

0.(z0 ) + j1 b1 + + jl1 bl1 + jl bl + jl+1 bl+1 + + jm bm 0 =


= 0.(z0 ) + j1 b1 + + jl1 bl1 + jl (bl + ) + jl+1 bl+1 + + jm bm =
= bj + jl

Por lo tanto la base B sera la misma si y solo si bj + jl 0 para todo j.


Luego, si l = (1l , . . . , ml ) 0 cualquier no negativo es factible y si l 0 lo es cualquiera no positivo.
En cualquier otro caso, para que valga bj + jl 0 para todo j basta tomar
   
bj bj
max / jl > 0 min / jl < 0
jl jl

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

queremos que el tableau correspondiente al optimo sea


    
1 y 1 c | z0 1 c | z 0
Ek .T0 = =
0 B 1 0 A | b 0 A | b

y por lo tanto debe ser c 0 y cj = 0 para j = i1 , . . . , im Notemos que c = c y A, donde y = cB .B 1 y


cB = (ci1 , . . . , cim ) y que A = B 1 .A
Primer caso: Si l 6= i1 , . . . , im .
Programaci
on lineal 53

En este caso cB = cB de donde y = y. Para todo j 6= l es cj = cj (y A)j = cj (yA)j y para j = l es


cl = cl + (yA)l . Luego cj = 0 para j = i1 , . . . , im . Ademas c 0 sii cl + (yA)l 0 sii cl + 0.
Segundo caso: Si l = ir para alg
un 1 r m.
Dada una matriz U denotaremos por Fj (U ) y Cj (U ) a la fila y a la columna j de U respectivamente.
En este caso cB = (ci1 , . . . , cir + , . . . , cim ) = cB + er . Entonces

y = cB .B 1 = (cB + er )B 1 = cB B 1 + er B 1 = cB B 1 + Fr (B 1 )

Como y = cB .B 1 y c = c y A = c cB .B 1 A = c cB .A entonces cj = cj cB .Cj (A).


Luego, para todo 1 k m es cik = cik cB .Cik (A) = cik cB .ek = cik cik = 0.
on cj 0 para todo j 6= i1 , . . . , im .
Veamos ahora la condici

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

que esta en forma can


onica y satisface b 0. Notemos que ahora hay m ecuaciones y 2m inc ognitas.
En este caso el poliedro definido por las restricciones tiene aproximadamente 2m puntos extremos y el
algoritmo los recorre todos hasta llegar al optimo. Dejamos como tarea al lector verificar esta afirmaci
on
para m = 3.
55

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

Antes de continuar veamos algunos ejemplos.


Ejemplo 1.6. Consideremos el siguiente grafo dirigido G = (V, E), con vertices 1, 2, 3, 4 y 5 y ramas
e1 = (1, 2), e2 = (3, 4), e3 = (1, 3), e4 = (3, 1), e5 = (1, 5) y e6 = (5, 4), es decir V = {1, 2, 3, 4, 5} y
E = {(1, 2), (3, 4), (1, 3), (3, 1), (1, 5), (5, 4)}, al que representaremos graficamente en la forma
56 Optimizaci
on Combinatoria

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

Este es un grafo no dirigido, conexo y acclico. No es completo: (4, 5)


/ E. La sucesion (e1 , e2 , e3 , e5 ) es un
camino simple de 4 a 6.

Ejemplo 1.8. Consideremos el grafo

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

Ejemplo 1.10. El grafo

h1 m1

m 2
h2
m 3
h3 m4

m5
h4
m6
h5
m7

es bipartito. En este caso P = {h1 , h2 , h3 , h4 , h5 } y Q = {m1 , m2 , m3 , m4 , m5 , m6 , m7 }.


Definici
on 1.11. Sea G = (V, E) un grafo dirigido. Si (u, v) E diremos que u es la cola y que v es la
punta de la flecha (u, v).
A cada grafo dirigido G = (V, E) le podemos asociar una matriz que contiene toda la informacion sobre el
grafo. Esta matriz se llama la matriz de incidencia vertice-rama de G.
Si V = {v1 , . . . , vm } y E = {e1 , . . . , en }, la matriz de incidencia vertice-rama de G es la matriz ||aij || IRmn ,
definida por (
1 si vi es la cola de ej
aij = 1 si vi es la punta de ej
0 en otro caso
Ejemplo 1.12. Dado el grafo
v3

e
e1 5

e e4
v1 3
v4

e2
e6

v2

su matriz de incidencia vertice-rama es la matriz



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
Observaci on 1.13. La matriz de incidencia vertice-rama de un grafo G tiene, en cada columna, un 1, un
1 y el resto de los coeficientes nulos. Esto se debe a que cada rama tiene una sola cola y una sola punta.
Luego, en una matriz de incidencia vertice-rama la suma de todas las filas es cero.

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

i(u) = #{v V / (v, u) E} indegree de u

o(u) = #{v V / (u, v) E} outdegree de u

y definimos el grado de u como



i(u) + o(u) si G es dirigido
deg (u) =
i(u) si G es no dirigido

Tanto en el caso dirigido como no dirigido resulta que deg (u) es el n


umero de ramas que inciden en el vertice
u. (Observemos que si G es no dirigido entonces los conjuntos que definen i(u) y o(u) son iguales y por eso
no los contamos dos veces).

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.

Ejemplo 2.5. El grafo no dirigido

es una foresta compuesta por cuatro arboles. El primero tiene cuatro hojas, el segundo seis, el tercero una
y el cuarto cinco.

Ejemplo 2.6. El grafo dirigido

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.

Ejemplo 2.8. El grafo dirigido


Grafos y algoritmos 59

es un arbol binario. Tambien lo es el grafo

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

Ejemplo 3.2. El grafo

es planar ya que se puede representar en la forma

Ejemplo 3.3. No son planares


i) el grafo bipartito completo K3,3 de 3 3

ii) el grafo completo K5 de cinco vertices

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

divide al plano en cuatro regiones R1 , . . . , R4 . La cara R4 no es acotada.


Grafos y algoritmos 61

Ejemplo 3.5. El grafo

tiene una sola cara.


Un resultado clasico sobre el n
umero de caras, vertices y ramas de un grafo es el siguiente.
Teorema 3.6. (Euler) Sean V , E y F los conjuntos de vertices, ramas y caras de un grafo planar conexo.
Entonces #V #E + #F = 2.
Demostraci on: Por induccion en #F . Si #F = 1 tenemos un grafo conexo con una sola cara, es decir, un
arbol. En este caso, #E = #V 1. Luego #V #E + 1 = 2 como queramos ver.
Supongamos ahora que #F = n + 1 y que el teorema vale para todo grafo con n caras. Sea e una rama
que separa dos caras. Entonces el grafo que resulta de quitar esa rama es un grafo planar conexo que
tiene una cara menos, la misma cantidad de vertices y una rama menos. Entonces, por hipotesis inductiva
#V (#E 1) + (#F 1) = 2. Por lo tanto #V #E + #F = 2.
Recordemos que si un grafo G = (V, E) es 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

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

2#E 3(2 + #E #V ) = 6 + 3#E 3#V

de donde #E 3#V 6 = 3(#V 2) = 3(m 2) como habamos afirmado.

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 }.

Ejemplo 4.2. La tabla de adyacencia del grafo

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

Descripci on del algoritmo breadth-first search.


1. Hacer una lista de los elementos de V .
2. Marcar s en la lista, poner Q = {s} y p(u) = 1 para cada u V .
3. Si u Q es, de todos los elementos el primero que ingreso a Q, Q = Q {u}.
4. Para cada v A(u) que no este marcado en la lista, marcarlo y reemplazar Q por Q {v} y p(v) por u.
Llevar un registro del orden en que los elementos ingresan a Q.
5. Si Q = STOP.
6. goto 3.

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).

Ejemplo 4.4. Dado el grafo

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

El valor actual del vector p es (1, 1, 1, 1, 2, 3, 4, 1, 1, 1)


5. Q = . STOP
Dado t 6= 1, existe un camino de 1 a t sii t = 2, 3, 4, 5, 6, 7.
Como p(6) = 3 y p(3) = 1 entonces el camino de s = 1 a t = 6 hallado por el algoritmo es
1 3 6

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

El valor actual del vector p es (1, 1, 1, 1, 2, 2, 1)


5. Q 6=
6. volvemos a 3.
Tercera iteracion
3. u = 6, Q = Q {6} = {5}
4. A0 (u) = {3}, marcamos el 3, lo ponemos en la pila y reemplazamos p(3) por 6. El estado actual de la
lista y de la pila es
V = {1 , 2 , 3 , 4, 5 , 6 , 7} y Q = {5, 3}
El valor actual del vector p es (1, 1, 6, 1, 2, 2, 1)
5. Q 6=
6. volvemos a 3.
Cuarta iteracion
3. u = 3, Q = Q {3} = {5}
4. A0 (u) = {7}, marcamos 7, lo ponemos en la pila y reemplazamos p(7) por 3. El estado actual de la lista
y de la pila es
V = {1 , 2 , 3 , 4, 5 , 6 , 7 } y Q = {5, 7}
El valor actual del vector p es (1, 1, 6, 1, 2, 2, 3)
5. Q 6=
6. volvemos a 3.
Quinta iteracion
3. u = 7, Q = Q {7} = {5}
4. A0 (u) = {2}, no marcamos ning un vertice porque 2 ya esta marcado. El estado actual de la lista y de la
pila es
V = {1 , 2 , 3 , 4, 5 , 6 , 7 } y Q = {5}
El valor actual del vector p es (1, 1, 6, 1, 2, 2, 3).
5. Q 6=
6. volvemos a 3.
Sexta iteracion
3. u = 5, Q = Q {5} =
4. A0 (u) = {3}, no marcamos ning un vertice porque 3 ya esta marcado. El estado actual de la lista y de la
pila es
V = {1 , 2 , 3 , 4, 5 , 6 , 7 } y Q =
El valor actual del vector p es (1, 1, 6, 1, 2, 2, 3).
5. Q = . STOP.
Dado t 6= 1, existe un camino dirigido de 1 a t sii t = 2, 3, 5, 6, 7.
Como p(7) = 3, p(3) = 6, p(6) = 2 y p(2) = 1 entonces el camino de s = 1 a t = 7 hallado por el algoritmo
es 1 2 6 3 7.
Como antes, dejamos a cargo del lector la reconstruccion de los caminos a los restantes t hallados.
Complejidad del algoritmo.
Estimaremos ahora la complejidad del algoritmo search, es decir, la cantidad de operaciones que realiza el
algoritmo para obtener el output a partir de los datos de entrada.
Sea m = #V . El algoritmo realiza a lo sumo m iteraciones (pues cada vertice ingresa en Q a lo sumo una
vez: al ingresar un vertice, se lo marca y los vertices que estan marcados no se ingresan) y, en cada una de
ellas, se realizan a lo sumo c m operaciones, para una constante c > 0. Luego, el algoritmo realiza en total a
Grafos y algoritmos 67

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

Ejemplo 5.2. Si G es el grafo

entonces el grafo

es un spanning tree de G. Tambien lo es el grafo

Observaci on 5.3. Sea G un grafo conexo. Si G es un arbol, entonces G es un spanning tree de G y es


el u
nico posible. Pero si G no es un arbol, entonces contiene por lo menos un ciclo. Siguiendo la misma
idea que en la proposicion 2.10., podemos quitar una rama del ciclo de manera que el subgrafo resultante
siga siendo conexo y tenga un ciclo menos. Si este no es un grafo acclico, repetimos el procedimiento. De
esta manera luego de un n umero finito de pasos obtenemos un subgrafo conexo acclico de G. Como este
grafo fue obtenido quitando solo ramas y no vertices, entonces es un spanning tree de G. Esto muestra que
cualquier grafo conexo tiene un spanning tree.
Observaci on 5.4. Sea G = (V, E) un grafo conexo con m vertices. Si G0 = (V 0 , E 0 ) es un subgrafo conexo
y acclico de G con m 1 ramas entonces G0 es un spannig tree de G. En efecto, como G0 es un arbol con
68 Optimizaci
on Combinatoria

m 1 ramas, entonces #V 0 = m por la proposicion 2.9. Pero V 0 V , #V 0 = m = #V y E 0 E. Luego


V 0 = V y E 0 E.
Sea G un grafo no dirigido y conexo donde a cada rama e de G se le ha asignado un peso (e).

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

Entonces T dado por


5

13
7
100

2 10

es un spanning tree mnimo de G. La suma de los pesos de sus ramas es 137.

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

Entonces la solucion del problema consiste en hallar un spanning tree mnimo de G.

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

m = #V . El siguiente algoritmo, conocido como el algoritmo de Kruskal encuentra, en tiempo polinomial,


un spanning tree mnimo de G.
Descripci
on del algoritmo.
1. Ordenar las ramas de G de menor a mayor seg un el peso.
2. Elegir una rama de mnimo peso entre aquellas que todava no fueron elegidas y que no forman un ciclo
con las ya elegidas.
3. repetir 2. si el n
umero de ramas elegidas es menor que m 1.
Ejemplo 6.1. Apliquemos el algoritmo al grafo G con m = 8 vertices dado por

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

Como #{ ramas elegidas } = 1 < 8 1 = m 1, repetimos 2. Ahora elegimos e2 .


5
1 4
6

e
2
8

2
3
7
70 Optimizaci
on Combinatoria

Como #{ ramas elegidas } = 2 < 8 1 = m 1, repetimos 2.


Elegimos e3 ya que no forma ciclo con las ya elegidas.
5
1 4
6
e3
8

2
3
7

De la misma manera luego elegimos e4 , e5 y e6 . Hasta ahora el grafico es


5
1 e4 4
6

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

Como #{ ramas elegidas } = 7 = 8 1 = m 1, STOP.


El grafo determinado por las lneas gruesas es un spanning tree mnimo de G.
Para demostrar la validez del algoritmo necesitaremos probar antes un resultado, que tambien utilizaremos
luego para probar la validez del algoritmo de Prim que veremos en la seccion 7.
Definici
on 6.2. Sea G = (V, E) un grafo. Dado un subconjunto A de V definimos el conjunto

A = {(u, v) E u A y v V A}

El conjunto A se llama el corte definido por A.


Observaci
on 6.3. Si G es no dirigido entonces

A = {e E / un vertice de e pertenece a A y el otro a V A}

mientras que cuando G es dirigido

A = {e E / la cola de e pertenece a A y la punta de e pertenece a 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

Ejemplo 6.5. El conjunto A = {1, 2, 3, 4} define un corte en el grafo

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

Entonces existe k tal que ek A. En efecto, como e = (u, v) A entonces u A y v V A. Luego


si u1
/ A se sigue que e1 A
si u1 A y u2 / A entonces e2 A
..
.
si ur2 A y ur1 / A entonces er1 A
y, finalmente, si ur1 A entonces er A pues v
/ A.
Notemos que como ek A y U A = (U no cruza el corte) entonces se tiene que ek
/ U.
Sea T 0 el grafo que resulta de suprimir en T la rama ek y agregar la rama e. Veamos que T 0 es un spanning
tree de G. En efecto, como T es conexo entonces T 0 tambien lo es. Sea m = #V . Como T es un spanning
tree de G entonces tiene m 1 ramas. Luego T 0 tiene m 1 ramas y m vertices. Luego T 0 es un arbol
por la proposicion 2.10. y por lo tanto es un spanning tree de G. Ademas es mnimo porque (e) (ek )
(recordemos que e era de mnimo peso en A y que ek A).
As, U {e} es un subconjunto de ramas del spanning tree mnimo T 0 pues la rama ek que suprimimos no
perteneca a U .
72 Optimizaci
on Combinatoria

Validez del algoritmo.


Para cada k, consideremos el conjunto Uk = { ramas elegidas hasta la iteracion k}. Probaremos que,
cualquiera sea k, Uk es un subconjunto de ramas de un spanning tree mnimo Tk .
Iteracion k = 0: En este caso U0 = y basta tomar T0 como un spanning tree mnimo cualquiera.
Iteracion k = 1: sea U = U0 y sea e1 = (u1 , v1 ) E de mnimo peso. Entonces U1 = U {e1 }.
Sea A1 el corte definido por A1 = {u1 }. Como U un subconjunto de ramas de un mnimo spanning tree T0
de G que no cruza el corte y e1 A1 es de mnimo peso, entonces U1 = U0 {e1 } es un subconjunto de
ramas de un spanning tree mnimo T1 por el teorema 6.6.
Supongamos ahora que nuestra afirmacion es cierta para k, es decir, que Uk es un subconjunto de ramas de
un spanning tree mnimo Tk .
Iteracion k + 1: Sea U = Uk y sea ek+1 = (uk+1 , vk+1 ) / Uk de mnimo peso entre las ramas que no
pertenecen a Uk y que no forman ciclo con las ya elegidas. Entonces Uk+1 = U {ek+1 }.
Sea
Ak+1 = {v V / un camino en Uk de v a uk+1 } {uk+1 }
y sea Ak+1 el corte definido por Ak+1 .
Veamos que U no cruza el corte, es decir, que Ak+1 Uk = . Supongamos que no. Sea e Ak+1 Uk .
Luego e = (u, v) donde u Ak+1 , v
/ Ak+1 y (u, v) = e Uk . Como u Ak+1 entonces u = uk+1 o existe
un camino en Uk de u a uk+1 .

e Uk

u k+1
u
camino en U k

Luego, existe un camino en Uk de v a uk+1 . Absurdo, pues v / Ak+1 .


Luego, U es un subconjunto de ramas de un spanning tree mnimo Tk que no cruza el corte.
Por otra parte, ek+1 Ak+1 . En efecto, uk+1 Ak+1 y vk+1 / Ak+1 ya que si existiera un camino en Uk
uniendo vk+1 y uk+1 entonces ek+1 formara un ciclo con las ramas ya elegidas.
Ahora veamos que ek+1 es de mnimo peso en Ak+1 . Como ek+1 fue elegida de mnimo peso entre las ramas
que no pertenecan a Uk y que no formaban ciclo con las ya elegidas, basta ver que toda rama en Ak+1 no
pertenece a Uk y no forma ciclo con las ya elegidas.
Si e Ak+1 , entonces claramente e no pertenece a Uk pues Uk = U no cruza el corte. Veamos que no forma
ciclo con las ramas ya elegidas.
Si e = (u, v) con u Ak+1 , v / Ak+1 formara ciclo, entonces existira un camino en Uk uniendo u y v.
Ademas, existira un camino en Uk uniendo uk+1 y u pues u Ak+1 .

u v

u k+1

camino en U k

camino en U k

Por lo tanto existira un camino en Uk uniendo v y uk+1 , lo que contradice que v


/ Ak+1 .
Grafos y algoritmos 73

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.

Divide and conquer.


Supongamos que queremos ordenar de menor a mayor los n
umeros a1 , a2 , . . . , an .
1. Partimos el conjunto {a1 , . . . , an } en los subconjuntos de 2 = 21 elementos cada uno:

{a1 , a2 } {a3 , a4 } {a5 , a6 }

Ordenamos los elementos de cada uno de los subconjuntos de dos elementos.


2. Partimos el conjunto {a1 , . . . , an } en los subconjuntos de 4 = 22 elementos cada uno:

{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:

{a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 } {a9 , a10 , a11 , a12 , a13 , a14 , a15 , a16 }

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

Entonces, para encontrar el orden final habremos tenido que comparar

c1 con b1 , b2 , b3 , c2 con b3 , b4 , c3 con b4 , b5 , b6 y c4 con b6

Necesitamos 9 2.6 comparaciones.


74 Optimizaci
on Combinatoria

Ejemplo 6.8 Supongamos que sabemos que

b1 b2 b3 b4 b5

y que
c1 c2 c3 c4 c5

y supongamos que el orden final debe ser

b1 , c1 , b2 , c2 , b3 , c3 , b4 , c4 , b5 , c5

Entonces, para encontrar el orden final habremos tenido que comparar

c1 con b1 , b2 , c2 con b2 , b3 , c3 con b3 , b4 , c4 con b4 , b5 y c5 con b5

Necesitamos 9 2.5 comparaciones. Veamos ahora el caso general.


Veremos que para ordenar el conjunto {b1 , . . . , br , c1 , . . . , cr }, donde b1 b2 br y c1 c2 cr ,
se necesitan a lo sumo 2r comparaciones. Sea b0 = y sea xj definido por

r si cj > br
xj = 1 si j = 0

s si bs1 < cj bs , (1 s r)
Entonces par ordenar cj se necesitan a lo sumo xj xj1 + 1 comparaciones ya que cj debe ser comparado
con los xj xj1 + 1 n umeros bxj1 , . . . , bxj . En el ejemplo 6.7., para j = 3 resulta que xj1 = x2 = 4
(pues b3 < c2 b4 ) y xj = x3 = 6 pues b5 < c3 b6 y por lo tanto cj = c3 debe ser comparado con
bxj1 , . . . , bxj = b4 , b5 , b6 .
Luego, en total necesitaremos a lo sumo

x1 + (x2 x1 + 1) + (x3 x2 + 1) + + (xr xr1 + 1) = xr + r 1 2r

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

En este momento se tiene que t = 1 y c = 0.


Grafos y algoritmos 77

Primera iteracion: como t = 1 examinamos la rama e1 . Se comparan los valores de x2 y x4 correspondientes


a los vertices 2 y 4 que son los extremos de la rama de menor peso e1 .
Como x2 = 2 6= 4 = x4 entonces actualizamos los vectores x e y poniendo x2 = 2 = x4 e y1 = 2. Esto
significa que la rama e1 fue elegida y, al agregarla, los arboles 2 y 4 se fusionaron formando un solo arbol, el
arbol 2.
Ahora la foresta tiene seis arboles, cinco de ellos (los arboles 1, 3, 5, 6 y 7) formados por un vertice y ninguna
rama y el otro (el arbol 2) por los vertices 2 y 4 y la rama e1 .

3
2

e1
4 5

Actualizamos los valores de t y c poniendo t = 2 y c = 1.


Segunda iteracion: como t = 2 se comparan los valores de x1 y x2 correspondientes a los vertices 1 y 2 que
son los extremos de la rama e2 (que es la de menor peso entre las no elegidas hasta el momento).
Como x1 = 1 6= 2 = x2 entonces actualizamos los vectores x e y poniendo x2 = 1, x4 = 1, y1 = 1 e y2 = 1.
Esto significa que la rama e2 fue elegida y al agregarla se fusionaron los arboles 1 y 2 formando un solo arbol,
el arbol 1.
Ahora la foresta tiene cinco arboles. Cuatro de ellos (los arboles 3, 5, 6 y 7) estan formados por un vertice
y ninguna rama y el otro (el arbol 1) esta formado por los vertices 1, 2 y 4 y las ramas e1 y e2 .

3
2

e2 e1
4 5

Actualizamos los valores de t y c poniendo t = 3 y c = 2.


Tercera iteracion: como t = 3, se comparan los valores de x1 y x4 correspondientes a los vertices 1 y 4 que
son los extremos de la rama e3 (que es la de menor peso entre las no elegidas hasta el momento).
Como x1 = 2 = x4 entonces actualizamos los vectores x e y poniendo y3 = 0. Esto significa que la rama e3
fue descartada pues formaba ciclo con las ya elegidas. Ahora actualizamos t poniendo t = 4. Como t = 4, se
comparan los valores de x3 y x5 correspondientes a los vertices 3 y 5 que son los extremos de la rama e4 (que
es la de menor peso entre las no elegidas hasta el momento). Como x3 = 3 6= 5 = x5 entonces actualizamos
los vectores x e y poniendo x3 = 3, x5 = 3 e y4 = 3. Esto significa que la rama e4 fue elegida y al agregarla
se fusionaron los arboles 3 y 5 fomando un solo arbol, el arbol 3.
Ahora la foresta tiene cuatro arboles. Dos de ellos (los arboles 6 y 7) formados por un vertice y ninguna
rama, el arbol 1 formado por los vertices 1, 2 y 4 y las ramas e1 y e2 y el arbol 3 por los vertices 3 y 5 y la
rama e4 .
78 Optimizaci
on Combinatoria

3
2
e
4
e2 e1
4 5

Actualizamos los valores de t y c poniendo t = 5 y c = 3.


De manera analoga se ve que la foresta en las restantes iteraciones es como sigue
Foresta en la cuarta iteracion, donde se fusionan los arboles 1 y 3 al agregar la rama e5
e5 3
2
e
4
e2 e1
4 5

Foresta en la quinta iteracion, donde se fusionan los arboles 1 y 6 al agregar la rama e6


e5 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

Este es el mnimo spanning tree de G buscado.


Complejidad del algoritmo.
Sean m = #V y n = #E. Como en la primera iteracion se ordenan las n ramas y ademas, en cada iteracion
Grafos y algoritmos 79

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.

1. Ordenar las ramas de G de menor a mayor seg


un el peso.
2. Elegir un vertice inicial cualquiera u0 .
3. Sea U el subarbol formado hasta ahora. A
nadir una rama (u, v) a U de peso mnimo entre aquellas ramas
no pertenecientes a U que agregadas a U forman un subarbol de G.
4. repetir 3. si el n
umero de ramas del subarbol formado hasta ahora es menor que m 1.

Validez 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

c0j1 + cj1 j2 + + cjr1 jr + cjr n

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

Para u = 3, yv +cvu = y1 +c13 = 14 < = y3 = yu . Luego ponemos yu = yv +cvu , es decir, y3 = y1 +c13 = 14


y pu = v, es decir, p3 = 1.
Para u = 4, yv + cvu = y1 + c14 = 3 < = y4 = yu . Luego ponemos yu = yv + cvu , es decir, y4 = y1 + c14 = 3
y pu = v, es decir, p4 = 1.
Para u = 5, yv + cvu = y1 + c15 = 7 < = y5 = yu . Luego ponemos yu = yv + cvu , es decir, y5 = y1 + c15 = 7
y pu = v, es decir, p5 = 1.
Para u = 6, yv + cvu = y1 + c16 = 6 < = y6 = yu . Luego ponemos yu = yv + cvu , es decir, y6 = y1 + c16 = 6
y pu = v, es decir, p6 = 1.
Ahora (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, 5, 14, 3, 7, 6) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 1, 1, 1, 1, 1).
3. min {yw } = y4 . Luego A = {1, 4}
wA
/
4. A 6= V , goto 2.
Segunda iteracion:
2. v = 4
Para u = 2, yv + cvu = y4 + c42 = 4 < 5 = y2 = yu . Luego ponemos yu = yv + cvu , es decir, y2 = y4 + c42 = 4
y pu = v, es decir, p2 = 4.
Para u = 3, yv + cvu = y4 + c43 = 15 > 14 = y3 = yu .
Para u = 5, yv + cvu = y4 + c45 = 24 > 7 = y5 = yu .
Para u = 6, yv + cvu = y4 + c46 = 13 > 6 = y6 = yu .
Ahora (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, 4, 14, 3, 7, 6) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 4, 1, 1, 1, 1).
3. min {yw } = y2 . Luego A = {1, 4, 2}
wA
/
4. A 6= V , goto 2.
Tercera iteracion:
2. v = 2
Para u = 3, yv + cvu = y2 + c23 = 7 < 14 = y3 = yu . Ponemos y3 = 7, p3 = 2.
Para u = 5, yv + cvu = y2 + c25 = 8 > 7 = y5 = yu .
Para u = 6, yv + cvu = y2 + c26 = 5 < 6 = y6 = yu . Ponemos y6 = 5, p6 = 2
Ahora (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, 4, 7, 3, 7, 5) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 4, 2, 1, 1, 2).
3. min {yw } = y6 . Luego A = {1, 4, 2, 6}
wA
/
4. A 6= V , goto 2.
Cuarta iteracion:
2. v = 6
Para u = 3, yv + cvu = y6 + c63 = 8 > 7 = y3 = yu .
Para u = 5, yv + cvu = y6 + c65 = 6 < 7 = y5 = yu . Ponemos y5 = 6, p5 = 6.
Ahora (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, 4, 7, 3, 6, 5) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 4, 2, 1, 6, 2).
3. min {yw } = y5 . Luego A = {1, 4, 2, 6, 5}
wA
/
4. A 6= V , goto 2.
Quinta iteracion:
2. v = 5
Para u = 3, yv + cvu = y5 + c53 = 7 7 = y3 = yu .
Ahora (y1 , y2 , y3 , y4 , y5 , y6 ) = (0, 4, 7, 3, 6, 5) y (p1 , p2 , p3 , p4 , p5 , p6 ) = (1, 4, 2, 1, 6, 2).
3. min {yw } = y3 . Luego A = {1, 4, 2, 6, 5, 3}
wA
/
4. A = V , STOP.
En la siguiente tabla se ven como son las actualizaciones correspondientes a cada iteracion de los vectores
y = (y1 , . . . , y6 ) y p = (p1 , . . . , p6 ) y cual es el elemento que ingresa en el conjunto A en esa iteracion.
Grafos y algoritmos 85

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

Luego, para cada u 6= 1, el camino dirigido optimo de 1 a u y su costo yu es


Si u = 2: 1 4 2, y2 = 4 (en el camino optimo de 1 a 2 el antecesor de 2 es p2 = 4 y el antecesor de 4
es p4 = 1).
Si u = 3: 1 4 2 3, y3 = 7
Si u = 4: 1 4, y4 = 3
Si u = 5: 1 4 2 6 5, y5 = 6
Si u = 6: 1 4 2 6, y6 = 5
Lema 8.5. En cada iteracion del algoritmo se verifica
Para todo w A, si u
/ A o si u es un vertice que ha ingresado a A despues que w entonces yu yw + cwu .
Demostraci on: Sea w A. Si u / A o si u es un vertice que ha ingresado a A despues que w entonces
en la iteracion siguiente a aquella en la que ingresamos w a A comparamos yw + cwu con yu , ya que en ese
momento u no pertenece a a A y w es el u ltimo vertice que ingreso en A. Si yw +cwu < yu , entonces ponemos
yu = yw + cwu . Luego, en ese momento vale yu yw + cwu . Teniendo en cuenta que en cada iteracion el
valor de yu o no se cambia o se reemplaza por algo menor, entonces el valor de yu en todas las iteraciones
siguientes sera menor o igual que yw + cwu .

Validez del algoritmo.


De ahora en adelante la palabra camino significara camino dirigido, a menos que se indique lo contrario.
Veremos que para cada u que ingresa en A, si yu = entonces no existe ning un camino de s a u y si yu <
entonces yu es el costo de un camino optimo de s a u y que pu es el predecesor a u en ese camino o pu = 1
si u = s. Esto es claro para s que es el primer vertice que ingresa en A.
Supongamos que han pasado varias iteraciones del algoritmo y sea u el u ltimo vertice que ingreso a A.
Demostraremos que nuestra afirmacion vale para u suponiendo que vale para todo vertice que ingresara a A
antes que u.
Si yu < , como al iniciarse el algoritmo era yu = , entonces el valor de yu fue modificado. Sea v el vertice
que ingreso a A antes que u que nos hizo modificar yu y pu la u ltima vez, es decir, tal que

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

Por la observacion 8.2. se tiene que P es un camino optimo a v 0 . Luego


i) Si v 0 A entonces yv0 es el costo de un camino optimo a v 0 entonces yv0 es el costo de cualquier camino
optimo a v 0 , en particular yv0 es el costo de P. Por lo tanto el costo de R es yv0 + cv0 u . Pero yu yw + cwu
para todo otro w A por el lema 8.5., de donde resulta que yu yv0 + cv0 u . Como yu es el costo de un
camino a u y como yv0 + cv0 u es el costo de R, que es optimo, entonces debe valer la igualdad y por lo tanto
yu es el costo de un camino optimo a u como queramos probar.
ii) Si v 0
/ A, como s A entonces existen dos vertices sucesivos u1 , u2 en P tales que u1 A y u2 / A.
Sean L1 la parte del camino P que va de s a u1 y L2 la que va de u2 a v 0 . Luego, como u1 y u2 son vertices
sucesivos, el camino optimo R esta formado por el camino L1 seguido de la rama (u1 , u2 ), luego seguido del
camino L2 y finalmente seguido de la rama (v 0 , u).
Ahora la situacon es
u2 A v

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.

Complejidad del algoritmo de Dijkstra.


En la iteracion k-esima se realizan a lo sumo c.(m k) operaciones, donde m = #V y c es una constante
que no depende del grafo. Como hay m 1 iteraciones, entonces la complejidad es menor o igual que
m1
X m(m 1)
c.(m k) = c.
2
k=1

es decir, la complejidad de este algoritmo es polinomial del orden de m2 .

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

para encontrar el camino optimo de s = 1 a cada uno de los restantes vertices.


Primera iteracion:
1. (y1 , y2 , y3 , y4 , y5 ) = (0, , , , )
(p1 , p2 , p3 , p4 , p5 ) = (1, 1, 1, 1, 1)
i = 1.
2. Para v = 1 ponemos y10 = y1 = 0 pues no existe u tal que (u, 1) E e y1 > yu + cu1 .
Para v = 2 el u
nico u tal que (u, 2) E e y2 > yu + cu2 es u = 1. En este caso y1 + c12 = 3 de modo que
0
ponemos y2 = 3 y p2 = 1.
Para v = 3 el u
nico u tal que (u, 3) E e y3 > yu + cu3 es u = 1. En este caso y1 + c13 = 1 de modo que
0
ponemos y3 = 1 y p3 = 1.
Para v = 4 no existe u tal que (u, 4) E e y4 > yu + cu4 . Luego ponemos y40 = y4 = .
Para v = 5 el u
nico u tal que (u, 5) E e y5 > yu + cu5 es u = 1. En este caso y1 + c15 = 2 de modo que
0
ponemos y5 = 2 y p5 = 1.
3. (y1 , y2 , y3 , y4 , y5 ) = (y10 , y20 , y30 , y40 , y50 ) = (0, 3, 1, , 2)
(p1 , p2 , p3 , p4 , p5 ) = (1, 1, 1, 1, 1)
i = 2.
4. Como i = 2 < 5 = #V goto 2.
Segunda iteracion:
2. Para v = 1 ponemos y10 = y1 = 0 pues no existe u tal que (u, 1) E e y1 > yu + cu1 .
Para v = 2 el u
nico u tal que (u, 2) E e y2 > yu + cu2 es u = 3. En este caso y3 + c32 = 0 de modo que
ponemos y20 = 0 y p2 = 3.
Para v = 3 no existe u tal que (u, 3) E e y3 > yu + cu3 as que ponemos y30 = y3 = 1.
Para v = 4 se tiene que para u = 2, 3, 5 vale que (u, 4) E e y4 > yu + cu4 .
Luego ponemos y40 = min{y2 + c24 , y3 + c34 , y5 + c54 } = y3 + c34 = 1 y p4 = 3.
Para v = 5 no existe u tal que (u, 5) E e y5 > yu + cu5 . Luego ponemos y50 = y5 = 2.
3. (y1 , y2 , y3 , y4 , y5 ) = (y10 , y20 , y30 , y40 , y50 ) = (0, 0, 1, 1, 2)
(p1 , p2 , p3 , p4 , p5 ) = (1, 3, 1, 3, 1)
Grafos y algoritmos 89

i = 3.

4. Como i = 3 < 5 = #V goto 2.

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 .

ii) yv = sii no existe un camino dirigido de s a v.

Luego, en el ejemplo anterior resulta que el camino optimo de 1 a 2 es 1 3 2 con costo y2 = 0, de 1 a


3 es 1 3 con costo y3 = 1, de 1 a 4 es 1 3 4 con costo y4 = 1 y de 1 a 5 es 1 3 2 5
con costo y5 = 3.

Ejemplo 8.8. Aplicando el algoritmo de Ford-Bellman al grafo

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

Ahora analizamos si se verifica que yv yu + cuv (u, v) E.


En este caso vemos que esto no vale. En efecto, y3 = 2 > 3 = y2 + c23 . Esto significa que el grafo contiene
un ciclo dirigido de costo negativo. En efecto, el ciclo 2 3 4 2 es un ciclo dirigido de costo -1.
Ejemplo 8.9. Aplicando el algoritmo de Ford-Bellman al grafo

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

En este caso al terminar el algoritmo y4 = ya que no existe camino de 1 a 4.


Observaci on 8.10. Dado v, si en la k-esima iteracion del algoritmo el valor de yv es finito entonces existe
un camino de s a v cuyo costo es yv . Esto se debe a que, cada vez que el algoritmo actualiza el valor de yv ,
lo reemplaza por el costo de un camino de s a v. Notar que esto seguira valiendo si el algoritmo, en lugar
de detenerse cuando i = #V , continuara haciendo cualquier cantidad de iteraciones.

Validez del algoritmo.


(r)
Sea m = #V . Para cada 0 r m 1 denotemos por yv el valor de yv al terminar la r-esima iteracion
del algoritmo.
Grafos y algoritmos 91

La validez del algoritmo resultara como corolario del siguiente


(k)
Teorema 8.11. Sea k m 1. Si existe un camino optimo de s a v con a lo sumo k ramas entonces yv
es el costo de ese camino.
Demostraci on: Si k = 1, supongamos que P = (s, v) es un camino optimo con una sola rama. Entonces,
(0) (0) (0)
en la primera iteracion resulta que yv > yu + cuv sii u = s porque yv = e

0 si u = s
yu(0) =
si u 6= s
(1)
Luego, al terminar la primera iteracion tendremos que yv = csv = costo de P.
Supongamos que el teorema vale para k y sea v un vertice tal que existe un camino optimo R de s a v con
a lo sumo k + 1 ramas. Sea u el vertice anterior a v en ese camino. Sea C el camino de s a u que resulta de
suprimir en R la rama (u, v). Entonces, por la observacion 8.2. se tiene que C es un camino optimo de s a
(k)
u con a lo sumo k ramas. Luego, por hipotesis inductiva, yu = costo de C.
(k) (k)
Luego, el costo de R = yu + cuv . Esto significa que yu + cuv es el costo de un camino optimo de s a v.
(k)
Como yv es el costo de un camino de s a v o es infinito entonces

yv(k) yu(k) + cuv (1)


(k)
y como yw + cwv tambien es el costo de un camino de s a v para todo w tal que (w, v) E entonces se
tiene que
yu(k) + cuv yw
(k)
+ cwv w / (w, v) E (2)
(k) (k)
Si en (1) valiera la igualdad, entonces de (2) resulta que yv yw + cwv w / (w, v) E. Por lo
(k) (k)
tanto no existe w tal que (w, v) E e yv > yw + cwv . En ese caso, en la iteracion k + 1 pondremos
(k+1) (k) (k)
yv = yv = yu + cuv = costo de R.
(k) (k)
Si en cambio en (1) no valiera la igualdad, entonces (u, v) E y vale yv > yu + cuv . Por lo tanto en la
iteracion k + 1 pondremos
(k)
yv(k+1) = min{yw (k)
+ cwv / w satisface (w, v) E e yv(k) > yw + cwv }
(k) (k) (k) (k)
Pero de (2) resulta que min{yw + cwv / w satisface (w, v) E e yv > yw + cwv } = yu + cuv , de donde
(k+1) (k)
tambien en este caso es yv = yu + cuv = costo de R.
Corolario 8.12. 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 .
ii) yv = sii no existe un camino dirigido de s a v.
Demostraci
on: i) Supongamos que para todo v se satisface

yv yu + cuv (u, v) E

Si el grafo contiene alg


un ciclo dirigido C de costo negativo, sean (u1 , u2 ),(u2 , u3 ), . . . , (un1 , un ), (un , u1 )
las ramas de ese ciclo.
Entonces
yu2 yu1 + cu1 u2
yu3 yu2 + cu2 u3
..
.
yun yun1 + cun1 un
yu1 yun + cun u1
92 Optimizaci
on Combinatoria

de donde

yu1 yun + cun u1


yun1 + cun1 un + cun u1
. . . yu2 + cu2 u3 + + cun1 un + cun u1
yu1 + cu1 u2 + cu2 u3 + + cun1 un + cun u1
Luego yu1 yu1 + cu1 u2 + cu2 u3 + + cun1 un + cun u1 y por lo tanto, como yu1 < , 0 cu1 u2 + cu2 u3 +
+ cun1 un + cun u1 = costo de C, lo que contradice que el costo de C era negativo. Luego el grafo no
contiene ciclos dirigidos de costo negativo.
Recprocamente, supongamos que el grafo no contiene ciclos dirigidos de costo negativo. Dado v, como
yv < entonces yv es el costo de un camino a v (ver observacion 8.10.). Como el grafo no contiene ciclos
dirigidos de costo negativo entonces existe un camino optimo de s a v. Ademas, podemos suponer que este
camino es simple ya que si contiene un ciclo de costo nulo entonces el camino simple evitando el ciclo tambien
es optimo (y un camino optimo no puede contener un ciclo de costo positivo ya que el camino evitando el
ciclo sera mas barato). Como un camino simple no puede tener mas de m 1 ramas entonces existe
un camino optimo P a v con a lo sumo m 1 ramas. Como el algoritmo realiza m 1 iteraciones, por el
(m1)
teorema 8.11., el valor de yv al terminar el algoritmo es yv = costo de P. Por lo tanto, yv es el costo
de un camino optimo. Luego, como yu + cuv es el costo de un camino a v entonces debe ser yv yu + cuv
(u, v) E.
Dejamos como tarea al lector completar la demostracion verificando que pv es el vertice anterior a v en un
camino optimo cuyo costo es yv y probando ii).
Observacion 8.13. En el caso particular en que cuv = 1 para todo (u, v) resulta que camino optimo significa
camino mas corto e yv resulta ser el mnimo n
umero de ramas que tiene un camino de s a v.
Complejidad del algoritmo de Ford-Bellman.
Sean m = #V y n = #E. Como se realizan m 1 iteraciones y en cada una de ellas se hacen a lo sumo c.n
operaciones (donde c es una constante), este algoritmo es polinomial con complejidad O(m.n).

9. Ciclos dirigidos de costo negativo.


En la seccion anterior hemos visto que podemos determinar si G contiene ciclos dirigidos de costo negativo
utilizando el algoritmo de Ford-Bellman. Veremos ahora como podemos hallar efectivamente un tal ciclo,
modificando convenientemente este algoritmo.
Lema 9.1. Sea G = (V, E) un grafo dirigido donde cada rama e E tiene asignado un costo ce y sea
C = max{| ce | / e E}. Si P es un camino dirigido en G que no contiene ciclos dirigidos de costo negativo
entonces c(P) (#V 1)C.
Demostraci
on: Supongamos primero que P no contiene ciclos dirigidos. Entonces P es de la forma
u1 u2
....... uk

donde u1 , u2 , . . . , uk son todos vertices distintos. Luego, k #V y, como ce C para toda rama e entonces

c(P) = cu1 u2 + cu2 u3 + + cuk1 uk C C . . . C (k 1)C (#V 1)C


| {z }
k1

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,

c(P) = c(P 0 ) + c(C1 ) + c(C2 ) + + c(Cr ) c(P 0 )


Grafos y algoritmos 93

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

yu2 yu1 + cu1 u2


yu3 yu2 + cu2 u3
..
.
yun yun1 + cun1 un
yu1 yun + cun u1

de donde

yu1 yun + cun u1


yun1 + cun1 un + cun u1
. . . yu2 + cu2 u3 + + cun1 un + cun u1
yu1 + cu1 u2 + cu2 u3 + + cun1 un + cun u1
Luego yu1 yu1 + cu1 u2 + cu2 u3 + + cun1 un + cun u1 y por lo tanto, como yu1 < por la observacion
9.3., 0 cu1 u2 + cu2 u3 + + cun1 un + cun u1 = costo de C.
Proposici on 9.5. Si ce es entero para todo e E entonces valen
i) si G no contiene ciclos dirigidos de costo negativo entonces el algoritmo termina en la iteracion m-esima.
ii) si G contiene ciclos dirigidos de costo negativo entonces el algoritmo termina en a lo sumo 2 + m2 C
iteraciones.
Demostraci on: i) Si G no contiene ciclos dirigidos de costo negativo entonces, al terminar la iteracion
m-esima vale yv yu + cuv (u, v) E y por lo tanto el algoritmo se detiene.
ii) Supongamos ahora que G contiene ciclos dirigidos de costo negativo. Luego, por la observacion 9.2., G
(k)
tambien. Para cada v denotemos por yv al valor que tiene yv al terminar la k-esima iteracion.
Grafos y algoritmos 95
(k) (k)
Por el lema 9.4., cualquiera sea k, existe (u, v) E tal que yv > yu + cuv . Por lo tanto, en la siguiente
(k) (k) (k) (k)
iteracion yv sera reemplazado por yw + cwv para alg un w tal que yw + cwv < yv . Esto muestra que,
(k+1) (k)
para todo k, existe v tal que yv < yv .
X X X
Afirmaci on: yv(1) 0 y, para todo k, yv(k+1) yv(k) 1.
v v v
(1)
X
Demostraci
on: Por la observacion 9.3., se tiene que yv 0 para todo v, de donde resulta que yv(1) 0.
v
(r)
Por otra parte, tambien por la observacion 9.3., cualquiera sea r se verifica que yv < para todo v. Luego,
(r)
por la observacion 8.10., para todo v se tiene que yv es X el costo de un camino de s a v en G y por lo tanto
es entero ya que ce es entero para todo e E. Luego, yv(r) es entero para todo r. Esto muestra que,
X X v
(k+1) (k)
cualquiera sea k, yv(k+1) y yv(k) son enteros. Como yv yv para todo v (ya que en cada iteracion
v v
(k+1) (k)
el valor de yv no cambia
X o se reemplaza
X por algo menor) y ademas, para alg
un v se verifica yv < yv
entonces se tiene que yv(k+1) < yv(k) . Por lo tanto, siendo ambos miembros de la desigualdad n
umeros
Xv Xv
enteros, resutla que yv(k+1) yv(k) 1 tal como habamos afirmado.
v v
Probemos ahora que el algoritmo termina en a lo sumo 2 + m2 C iteraciones. Se tiene
X
yv(1) 0
v
X X
yv(2) yv(1) 1 1
v v
X X
yv(3) yv(2) 1 2
v v
.. .. ..
. . .
X X
yv(k) yv(k1) 1 (k 1)
v v

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

1. Valor del flujo.

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.

Sea x = (xe )eE un flujo en G.

Definici
on 1.2. Dado un vertice v de G llamaremos
flujo que sale de v a X
xvw
w/(v,w)E

flujo que entra en v a X


xwv
w/(w,v)E

flujo neto que sale de v a X X


xvw xwv
w/(v,w)E w/(w,v)E

y flujo neto que entra en v a X X


xwv xvw
w/(w,v)E w/(v,w)E

Si A y B son subconjuntos de V sea X


x(A, B) = xvw
vA,wB
(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

x(A B, C) = x(A, C) + x(B, C)

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

de donde x(s, V ) x(V, s) = x(V, t) x(t, V ) como queramos probar.


Definici on 1.5. Diremos que un flujo (xe ) es un b-flujo (balanced flow) si satisface las hipotesis del lema
1.4. (i.e., si el flujo neto que sale de v es nulo para todo v 6= s, t ). En tal caso llamaremos valor del flujo al
flujo neto que sale de s.
Ejemplo 1.6. Consideremos en el siguiente grafo el flujo xe indicado en cada rama e

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

max x(s, V ) x(V, s)


x(v, V ) x(V, v) = 0 v 6= s, t
0 xe ue (e E)
Observemos que este es un problema de programacion lineal. En efecto, es el problema
X X
max xsw xws
w/(s,w)E w/(w,s)E
X X
xvw xwv = 0 v 6= s, t
w/(v,w)E w/(w,v)E

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

P = (e1 , e2 , e3 , e4 , e5 , e6 , e7 ) las ramas e1 , e2 , e4 y e6 son directas y las ramas e3 , e5 y e7 son inversas.


Observaci on 2.2. Supongamos que tenemos en G un flujo (xe ) factible, es decir, tal que x(v, V )x(V, v) = 0
v 6= s, t y 0 xe ue e E. Si P es un camino simple en G de s a t tal que

x e < ue e P con direccion 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

xe < ue e P que tiene direccion s v

y
0 < xe e P que tiene direccion s v
M
aximo flujo - Mnimo corte 99

Por la observacion 2.2., si x es un flujo factible y P es un camino aumentativo de s a t entonces podemos


encontrar un flujo factible x0 con mayor valor de flujo que x.
Ejemplo 2.4. Consideremos el siguiente grafo, donde para cada rama e se indica el flujo xe y tambien,
entre parentesis, la capacidad ue .
2(3)
2(2)

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)

Este nuevo flujo es factible pues como 0 xe ue e E y > 0 satisface

min{ue2 xe2 , ue3 xe3 } y min{xe1 , xe4 }

entonces 0 xe1 ue1 , 0 xe2 + ue2 , 0 xe3 + ue3 y 0 xe4 ue4 .


Luego x0 verifica 0 x0e ue (e E). Ademas, x0 es un b-flujo. En efecto, el flujo neto que sale de cada
vertice v 6= s, t no se ha modificado ya que cada que se suma se compensa con uno que se resta:
x0 (v1 , V ) x0 (V, v1 ) = x0e1 + x0e2 + 2 1 4 = xe1 + xe2 + + 2 1 4 =
= xe1 + xe2 + 2 1 4 = x(v1 , V ) x(V, v1 ) = 0
x0 (v2 , V ) x0 (V, v2 ) = x0e3 + 1 + 1 x0e2 3 = xe3 + + 1 + 1 (xe2 + ) 3 =
= xe3 + 1 + 1 xe2 3 = x(v2 , V ) x(V, v2 ) = 0
100 Optimizaci
on Combinatoria

x0 (v3 , V ) x0 (V, v3 ) = 3 + 2 x0e3 x0e4 = 3 + 2 (xe3 + ) (xe4 ) =


= 3 + 2 xe3 xe4 = x(v3 , V ) x(V, v3 ) = 0

y, claramente, si v 6= v1 , v2 , v3 entonces x0 (v, V ) x0 (V, v) = x(v, V ) x(V, v) = 0.


Verifiquemos que el valor del flujo aument
o en :

x0 (s, V ) x0 (V, s) = 2 + 4 x0e1 = 2 + 4 (xe1 ) =


2 + 4 xe1 + = x(s, V ) x(V, s) +

Ahora repetimos el procedimiento. Partiendo del flujo


2(3)
2(2)

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)

Verifiquemos que el valor del flujo aument


o en :

x0 (s, V ) x0 (V, s) = 5 + 4 = 9 = 6 + 3 = 6 +

Esquema del algoritmo de Ford-Fulkerson.

1. x = x0 , donde x0 es cualquier flujo factible inicial (por ejemplo, x0 = 0).


2. buscar un camino aumentativo de x de s a t. Si no existe, STOP.
3. Actualizar x sumando o restando al flujo de las ramas del camino aumentativo seg
un la direccion, en la
forma indicada en la observacion 2.2., para obtener un flujo de mayor valor.
4. goto 2.
M
aximo flujo - Mnimo corte 101

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.

3. El problema del mnimo corte.

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

Consideremos el problema del maximo flujo

max x(s, V ) x(V, s)


x(v, V ) x(V, v) = 0 v 6= s, t
0 xe ue (e 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

x(s, V ) x(V, s) = x(A, A) x(A, A)

Demostraci
on:
X
x(A, V ) x(V, A) = x(s, V ) x(V, s) + x(v, V ) x(V, v)
vA{s}

Como x(v, V ) x(V, v) = 0 para todo v 6= s, t y t


/ A entonces x(v, V ) x(V, v) = 0 para todo v A {s}.
Luego, x(A, V ) x(V, A) = x(s, V ) x(V, s). Siendo que V es la union disjunta de A y A, por la observacion
1.3. se tiene que
x(A, V ) x(V, A) = x(A, A A) x(A A, A) =
= x(A, A) + x(A, A) x(A, A) x(A, A) = x(A, A) x(A, A)

Luego, x(s, V ) x(V, s) = x(A, A) x(A, A).


102 Optimizaci
on Combinatoria

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,

x(s, V ) x(V, s) u(A, A)

Demostraci
on: Como x(A, A) 0 pues x es factible, por el lema 3.2. se tiene que

x(s, V ) x(V, s) = x(A, A) x(A, A) x(A, A) =


X X
= xvw uvw = u(A, A)
vA,wA vA,wA
(v,w)E (v,w)E

Por lo tanto x(s, V ) x(V, s) u(A, A).


Lema 3.4. Sea x un flujo factible tal que no existe camino aumentativo de x de s a t. Sea A el conjunto
que contiene a s pero no a t definido por

A = {s} {v V / existe un camino aumentativo de x de s a v}

Entonces la capacidad del corte A es igual al valor del flujo x.


Demostraci on: Sea x un flujo factible tal que no existe camino aumentativo de x de s a t.
Sea A = {s} {v V / existe un camino aumentativo de x de s a v}.
Veamos que la capacidad de A es igual al valor de x.
Sean v A y w A. Entonces hay un camino aumentativo de s a v y no lo hay de s a w. Luego, si
e = (v, w) E entonces xe = ue . En efecto, si fuese xe < ue entonces el camino aumentativo que va de s a v
seguido de la rama (v, w) sera un camino aumentativo de s a w. Analogamente, si e = (w, v) E entonces
debe ser xe = 0. En otras palabras, en las ramas que tienen la cola en A y la punta en A el flujo es igual a
la capacidad de la rama mientras que en las que tienen la cola en A y la punta en A el flujo es nulo. Luego,

x(A, A) x(A, A) = u(A, A) 0 = u(A, A)

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

capacidad de A = valor de x capacidad de B

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

max x(s, V ) x(V, s)


x(v, V ) x(V, v) = 0 v 6= s, t
0 xe ue (e E)

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.,

valor de x0 capacidad de A = valor de x

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

A = {s} {v V / existe un camino aumentativo de x de s a v}

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

min{ue xe / e P es directa } y min{xe / e P es inversa }

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

A = {s} {v V / existe un camino aumentativo de x de s a v}

entonces ingresaremos w en A cuando haya un camino aumentativo C de s a w) le adjuntaremos la terna


(p(w), sg(w), (w)) donde p(w) sera el vertice anterior a w en el camino aumentativo C de s a w, sg(w) = 1
si la u
ltima rama en C (es decir, la rama que une p(w) y w) es directa y sg(w) = 1 si es inversa y (w) > 0
satisfacera
(w) min{ue xe / e C es directa }
(w) min{xe / e C es inversa }
Llamaremos a (p(w), sg(w), (w)) la etiqueta de w.
En cada iteracion ingresaremos algunos w / A tales que existe un camino aumentativo de s a w. Observemos
que si para alg un v tal que existe un camino aumentativo de s a v (por ejemplo, para un v ingresado a A
en una iteracion anterior) ocurre que (v, w) E o (w, v) E entonces el camino aumentativo de s a v se
puede extender a un camino de s a w que sera aumentativo o no de acuerdo a como sea el flujo en esa ultima
rama. Mas precisamente, si v A, (v, w) E (es decir, si (v, w) A) y xvw < uvw entonces el camino
aumentativo de s a v seguido de la rama (v, w) resulta un camino aumentativo de s a w, la u ltima rama es
directa, el predecesor a w en ese camino es v y el maximo (w) que podemos tomar es min{(v), uvw xvw }.
Entonces ingresamos w en A, ponemos p(w) = v, sg(w) = 1 y (w) = min{(v), uvw xvw }.
Pero si en cambio v A, (w, v) E (es decir, (w, v) A) y xwv > 0 entonces el camino aumentativo de s a
v seguido de la rama (w, v) resulta un camino aumentativo de s a w, la ultima rama es inversa, el predecesor
a w en ese camino es v y el maximo (w) que podemos tomar es min{(v), xwv }.
En este caso ingresamos w en A, ponemos p(w) = v, sg(w) = 1 y (w) = min{(v), xwv }.
Observemos que en ambos casos (v) > 0 implica (w) > 0 y como (s) = > 0 entonces (u) > 0 para
todo u A.
Luego, A es construdo de forma tal que para cada v A valga p(v) A. Por lo tanto, si t A, podremos
reconstrur el camino aumentativo de s a t utilizando p : si

p(t) = w1 , p(w1 ) = w2 , ...., p(wn1 ) = wn , p(wn ) = s

entonces el camino aumentativo de s a t es (s, wn , wn1 , . . . , w2 , w1 , t).


Ademas, sg(wn ) nos dira la direccion de la rama que une s = p(wn ) y wn , sg(wn1 ) la de la rama que une
wn = p(wn1 ) y wn1 , . . ., sg(w1 ) la de la rama que une w2 = p(w1 ) y w1 y sg(t) la de la rama que une
w1 = p(t) y t. Por ultimo, es claro que el valor de que estamos buscando es = (t).
De esta manera conoceremos el camino y la direccion de cada rama en ese camino y el valor de . Esto nos
permitira actualizar el flujo y comenzar una nueva iteracion.
M
aximo flujo - Mnimo corte 105

En el caso en que t / A o t A pero (t) = el algoritmo se detendra. Si el algorimto se detiene porque t


no pertenece al conjunto A construdo en la presente iteracion entonces el flujo x que se tiene en ese momento
sera optimo y el conjunto A que fue construdo a partir de x (es decir, el u
ltimo conjunto A generado por el
algoritmo) definira un mnimo corte.
Si, en cambio, el algoritmo se detiene porque t A pero (t) = entonces significa que existe un camino
de s a t formado por todas ramas directas de capacidad infinita y por lo tanto no existe un flujo de valor
maximo. En efecto, observemos que como para w 6= s es

min{(v), uvw xvw } si v = p(w) y la rama que une v y w es directa
(w) =
min{(v), xwv } si v = p(w) y la rama que une v y w es inversa

entonces (w) = sii (v) = y e es directa de capacidad infinita.


Luego, si (s, wn , wn1 , . . . , w2 , w1 , t) es el camino de s a t encontrado, como (t) = y w1 = p(t) entonces
(w1 ) = y la rama que une w1 y t es directa de capacidad infinita. Pero ahora, como (w1 ) =
y w2 = p(w1 ) resulta que (w2 ) = y la rama que une w2 y w1 es directa de capacidad infinita. As
siguiendo, como (wn ) = y s = p(wn ) entonces (s) = y la rama que une s y wn es directa de
capacidad infinita.
Por otra parte, tambien podra ocurrir que el algoritmo no se detuviera nunca. Sin embargo, bajo ciertas
condiciones es posible garantizar un stop (ver observacion 4.4.).

Descripci
on del algoritmo.

1. Inicializar xe = 0 para todo e E


2. A = {s}, (s) = , Q = {s}.
3. De todos los elementos de Q, sea v el primero que ingreso.
Q = Q {v}
Para cada w / A tal que e = (v, w) E y xe < ue : poner w en A, etiquetar w en la forma p(w) = v,
sg(w) = 1, (w) = min{(v), ue xe } y actualizar Q = Q {w}.
Si w = t ir a 5.
Para cada w / A tal que e = (w, v) E y xe > 0: poner w en A, etiquetar w en la forma p(w) = v,
sg(w) = 1, (w) = min{(v), xe } y actualizar Q = Q {w}.
Si w = t ir a 5.
4. Si Q 6= ir a 3. Si Q = STOP (x es optimo y A es el mnimo corte)
5. Si (t) < reconstrur el camino aumentativo P usando los predecesores p(v) y actualizar x sumando
= (t) a cada e P que sea directa (si sg(w) = 1 entonces e = (p(w), w) y la rama es directa) y restando
= (t) a cada e P que sea inversa (si sg(w) = 1 entonces e = (w, p(w)) y la rama es inversa). Goto 2.
6. Si (t) = STOP (no existe un flujo optimo).

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

Complejidad del algoritmo.


Solo veremos el caso en que para cada e E vale que ue ZZ o ue = y ademas usv < (s, v) E. Sea
n = #E. Consideremos el corte definido por A = {s}, es decir, A = { ramas que salen de s }. Entonces la
capacidad del corte A es menor o igual que n. max {usv }. Por lo tanto el valor del flujo maximo, que es
(s,v)E
igual a la capacidad del mnimo corte, debe ser menor o igual que n. max {usv }. Como en cada iteracion
(s,v)E
el valor del flujo aumenta en un entero, entonces el aumento de flujo en cada iteracion es mayor o igual
que 1. Luego la cantidad de iteraciones es a lo sumo n. max {usv }.
(s,v)E
Dado que la cantidad de operaciones que efect
ua el algoritmo en cada iteracion es del orden de n y que
a lo sumo puede haber n. max {usv } iteraciones resulta que la complejidad del algoritmo es del orden de
(s,v)E
n2 . max {usv }.
(s,v)E

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

Ahora utilizamos el camino aumentativo s a b t

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

Como el flujo de la rama (b, a) ahora es nulo entonces s b a t nuevamente es un camino


aumentativo del presente flujo y = 1. Actualizando el flujo obtenemos
a

1 2

s
1 t

2
1

Como xba = 1, ahora s a b t es un camino aumentativo y = 1. Actualizando x se tiene


a

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, obtenemos en dos iteraciones el flujo optimo


a

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

Observacion 5.6. Dado un grafo G, si M es un matching, C es un cover y vale #M = #C entonces, M es


un maximo matching y C es un mnimo cover. En efecto, si M 0 es un matching entonces, por el lema 5.4.,
#M 0 #C = #M y analogamente, si C 0 es un cover, #C = #M #C 0 .

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,

A = {s} {v V / un camino aumentativo de x de s a v}

Entonces A es un mnimo corte y su capacidad es igual al valor de x. Luego, la capacidad de A es finita


y por lo tanto ninguna rama (p, q) (p P, q Q) pertenece a A. Por otra parte, como s A y t / A, si
p P y q Q se tiene
i) (s, p) A sii p /A
ii) (q, t) A sii q A
Luego,
A = {(s, p) / p
/ A} {(q, t) / q A}

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

y por lo tanto resulta que A es un cierre optimo en G.

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

entonces G0 sera el grafo dirigido


ab
a
ad
b
bd
c
bc
s t
d
dc
e
ae

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
/

on 5.10. Sea A V 0 tal que s A, t


Observaci / A, A tiene capacidad finita y tal que para todo u, v se
verifica
uv A u A V, v A V y (u, v) E
114 Optimizaci
on Combinatoria

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

Por lo tanto, tomando S = A V se tiene que


X
buv capacidad de A =
uvV 0
X X
= buv cu
(u,v)E/ uS
uS, vS

Si S 0 es un subconjunto de V entonces B = S 0 {s} {uv V 0 / u S 0 y v S 0 } es un subconjunto de V 0


que contiene a s y no a t. Luego la capacidad del corte definido por A en G0 debe ser menor o igual que la
capacidad de B.
Veamos cuales ramas pertenecen a B. Como s B entonces (s, uv) B sii uv / B y como t / B entonces
(u, t) B sii u V B. Ademas, ninguna rama (uv, u) o (uv, v) pertenece a B pues si uv B entonces
u S 0 y v S 0 y por lo tanto u B y v B. Luego la capacidad del corte B es finita. Mas a un, B
satisface
uv B u B V, v B V y (u, v) E
M
aximo flujo - Mnimo corte 115

y, teniendo en cuenta que V B = S 0 , por la observacion 5.10. resulta que


X
buv capacidad de B =
uvV 0
X X
buv cu =
(u,v)E/ uBV
uBV, vBV
X X
= buv cu
(u,v)E/ uS 0
uS 0 ,vS 0

Como capacidad de A capacidad de B entonces


X X X
buv cu = buv capacidad de A
(u,v)E/ uS uvV 0
uS,vS
X X X
buv capacidad de B = buv cu
uvV 0 (u,v)E/ uS 0
uS 0 ,vS 0

Hemos probado entonces que si S 0 es cualquier subconjunto de V entonces


X X X X
buv cu buv cu
(u,v)E/ uS (u,v)E/ uS 0
uS,vS uS 0 ,vS 0

Luego, si A es el mnimo corte correspondiente a un maximo flujo x en G0 , entonces S = A V es el


subconjunto de V que satisface X X
buv cu
(u,v)E uS
uS, vS

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

pues qv es la capacidad de la rama (v, t), es decir, (xuv ) es solucion de (1).


0
Corolario
X 5.12. El problema de asignacion de tareas es factible si y solo si G tiene un flujo maximo de
valor pu .
u
Demostraci on: Si el problema de asignacion es factible entonces G0 tiene
Xun flujoX x de valor maximo que
satisface xsu = pu para toda tarea u. Por lo tanto el valor de x es igual a xsu = pu . Recprocamente,
X u u
sea x un flujo optimo en G0 de valor pu .
u X X
Como xsu capacidad de la rama (s, u) = pu y como xsu = valor de x = pu entonces debe ser
u u P P
xsu = pu para toda tarea u (pues si para alg un u fuese xsu < pu entonces resultara que xsu < pu ).

e. El problema del transshipment.


Sea G = (V, E) un grafo dirigido donde cada vertice v V tiene asignado un n
umero real bv y cada rama
e E tiene asignada una capacidad ue tal que 0 < ue .
Queremos determinar si existe x = (xe )eE que satisfaga

x(v, V ) x(V, v) = bv v V
0 xe ue (e E)

Este problema se conoce como el problema del transshipment.


Observemos que X
x(v, V ) x(V, v) =
v

X X X
= xvw xwv =
v w/(v,w)E w/(w,v)E
X X
= xe xe = 0
eE eE
M
aximo flujo - Mnimo corte 117

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}

(=) Sea (xe )eE 0 un flujo maximo en G0 que verifica

xsu = bu u / bu > 0
xut = bu u / bu < 0

Luego, 0 xe ue para todo e E. Sea u 6= s, t.


Si bu > 0 entonces X X
x(u, V ) x(V, u) = xuv xvu =
v/(u,v)E v/(v,u)E

= x( u, V 0 ) x(V 0 , u) + xsu = xsu = bu


y, si bu < 0 entonces X X
x(u, V ) x(V, u) = xuv xvu =
v/(u,v)E v/(v,u)E

= x( u, V 0 ) x(V 0 , u) xut = xut = bu


Luego, (xe )eE es una solucion del problema del transshipment.
(=) Sea (xe )eE una solucion del problema. Tomando

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

Dejamos la demostracion como tarea para el lector.


Observaci on 5.15. Notar que hallando un maximo flujo x en G0 no solo podemos determinar si el problema
del transshipment es factible sino que, cuando lo es, podemos hallar una solucion.
X X
En efecto, sea x = (xe )eE 0 un maximo flujo en G0 y supongamos que bu = 0 y valor de x = bu
u u / bu >0
(si alguna de estas condiciones no valiera sabemos que el problema del transshipment no es factible).
X
Como valor de x = bu entonces necesariamente se tiene que xsu = bu u / bu > 0 pues
u / bu >0

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

Luego (xe )eE 0 un flujo maximo en G0 que verifica

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.).

f. El problema del torneo.


En un torneo hay n equipos que juegan todos contra todos, exactamente una vez. Supongamos que el
resultado de un encuentro no puede ser un empate.
Dado un vector = (1 , . . . , n ) INn diremos que es factible si existe una asignacion de resultados a los
partidos tal que, para cada i, i sea la cantidad de partidos ganados por el equipo i al terminar el torneo.
El problema consiste en determinar si un dado un vector (1 , . . . , n ) es factible.
Para resolverlo, construmos un grafo dirigido G = (V, E), donde V = {1, 2, . . . , n} y E = {(u, v) / u < v}.
A cada rama (u, v) le asignamos capacidad 1.
Para cada u < v sea xuv el n umero de partidos que el equipo u le gano al equipo v en el torneo. Como cada
par de equipos se enfrenta una y solo una vez entonces debe ser xuv = 0 o xuv = 1, es decir, 0 xuv 1 y
xuv entero.
Sean u, v V , u 6= v. Si u < v entonces u le gano a v si y solo si xuv = 1 y si v < u entonces u le gano a
v si y solo si v perdio con u sii xvu = 0 sii 1 xvu = 1. Luego, el n umero de partidos que u gano jugando
contra los equipos u + 1, u + 2, . . . , n es X
xuv
v / (u,v)E
M
aximo flujo - Mnimo corte 119

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

es decir, tal que


x(u, V ) x(V, u) = u + (1 u) u V
0 xe 1 (e E)
De esta forma, hemos planteado el problema del torneo como un problema de transshipment en el cual
bu = u + (1 u).

n
Observemos que, como se juegan partidos, entonces una condicion necesaria para que (1 , . . . , n ) sea
2
factible es que
X n
u =
u
2
X
Esta condicion es equivalente a bu = 0, que es la condicion necesaria para que el problema, visto como
u
un problema de transshipment, sea factible.
En efecto,
X Xn
bu = 0 sii (u + 1 u) = 0 sii
u u=1
n
X n
X n
X n
X
sii u + (1 u) = 0 sii u = (u 1) sii
u=1 u=1 u=1 u=1
Xn Xn
n(n 1) n
sii u = sii u =
u=1
2 u=1
2

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

Una solucion x de este problema se denomina circulaci


on.
Sean x0e = xe ke y u0e = ue ke . Entonces
X X
x0 (w, V ) x0 (V, w) = x0wv x0vw =
v v
X X
= (xwv kwv ) (xvw kvw ) =
v v
X X
= x(w, V ) x(V, w) kwv + kvw
v v
X X
Sea bw = kvw kwv . Entonces el problema de circulacion es factible si y solo si existe
v/(v,w)E v/(w,v)E
x0 = (x0e )e E que verifica
x0 (w, V ) x0 (V, w) = bw w V
0 x0e u0e e E
Luego, el problema de circulacion tiene la forma del problema del transshipment.
Consideremos ahora el problema de maximo flujo al que le agregamos la condicion ke xe (donde ke 0
son dados) y le pedimos, ademas, que de s solo salgan flechas.
Es decir, dado un grafo dirigido G = (V, E) con fuente s de la que solo salen flechas y terminal t, buscamos
un flujo de valor maximo x sujeto a las restricciones

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

xe < ue e P que tiene direccion s v

y
ke < xe e P que tiene direccion s v

Ahora > 0 debera satisfacer


min{ue xe / e P es directa}

y
min{xe ke / e P es inversa}

Por lo tanto, reemplazando el paso 3. del algoritmo de Ford-Fulkerson por


M
aximo flujo - Mnimo corte 121

3. Para cada (v, w) A tal que xvw < uvw poner w A y etiquetar w en la forma

p(w) = v, sg(w) = 1, (w) = min{(v), uvw xvw }

Para cada (w, v) A tal que xwv > kwv poner w A y etiquetar w en la forma

p(w) = v, sg(w) = 1, (w) = min{(v), xwv kwv }

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

ya que de s solo salen flechas. Luego,


X X
x(t, V ) x(V, t) = xtw xwt =
w/(t,w)E 0 w/(w,t)E 0
X X
= xts + xtw xwt =
w/(t,w)E w/(w,t)E

X X
= xts xwt xtw =
w/(w,t)E w/(t,w)E
X
= xts xsw = 0
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

h. Un algoritmo primal-dual para el problema del transporte.


Un cierto producto debe ser distribuido desde m depositos a n localidades. Para cada i, j tales que 1 i m
y 1 j n sea cij el costo de transportar una unidad del producto desde el deposito i hasta la localidad j,
sea ai la cantidad de unidades disponibles en el deposito i y sea bj la cantidad de unidades demandada por
la localidad j. Luego, ai (1 i m) y bj (1 j n) son enteros positivos.
Para cada 1 i m, 1 j n denotemos por xij a la cantidad de unidades que despacharemos del
deposito i a la localidad j. Nos preguntamos de que manera debemos distribuir el producto si queremos que
el costo de transporte sea mnimo. Es decir, queremos resolver

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 facil ver que x es solucion de (4) si y solo si x definido por



xij

n
si 1 i m, 1 j n
X
x= a xij si 1 i m, j = n + 1

i
j=1

es solucion de (5).

Luego, supondremos que el problema a resolver es de la forma


M
aximo flujo - Mnimo corte 123

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

Luego, tomando xij = 0 para todo (i, j)


/ A (1 i m, 1 j n), se tiene que

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 la capacidad del corte B es X X


ai + bj
iI
/ jJ

Como la capacidad de B es igual al valor de x entonces


X X X X
ai + bj = valor de x < ai = bj
iI
/ jJ i 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

Veamos ahora cual es el que nos sirve. Queremos que valga

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

Por lo tanto, x0 es un flujo factible en Guv como queramos demostrar.

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

y hallar A0 = {(i, j) / cij (ui + v j ) = 0}.


Actualizar x0 en la forma
x0si = xsi i
x0jt = xjt j
x0ij = xij (i, j) A0 A
x0ij =0 (i, j) A0 A

5. Reemplazar (u, v) por (u, v), reemplazar A por A0 e ir a 2.

Convergencia del algoritmo para el problema del transporte.


Probaremos ahora que el algoritmo que acabamos de describir termina en un n umero finito de pasos y
que, cuando lo hace, se tiene una solucion (xij ) entera del problema del transporte. Recordemos que ai
(1 i m) y bj (1 j n) son enteros positivos y notemos que en el paso 3. de cada iteracion del
m
X
algoritmo hallamos un flujo factible x en Guv que satisface valor de x ai .
i=1
Notemos tambien que el maximo flujo x hallado en cada iteracion es entero. En efecto, por la observacion
4.4., el maximo flujo x obtenido en la primera iteracion 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
M
aximo flujo - Mnimo corte 129

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 x es entero por hipotesis inductiva.


Por otra parte, si x es el maximo flujo obtenido en la k-esima iteracion y x es el maximo flujo obtenido en la
iteracion k + 1, entonces se tiene que valor de x valor de x, ya que valor de x = valor de x0 y x se obtiene
partiendo del flujo inicial x0 . Ademas, si valor de x < valor de x entonces 1 + valor de x valor de x, ya
que valor de x y valor de x son enteros. Veamos ahora que sucede si valor de x = valor de x.
Sea x el maximo flujo obtenido en la k-esima iteracion y sea x es el maximo flujo obtenido en la iteracion
k + 1 y supongamos que valor de x = valor de x. Sean (u, v) la solucion factible del dual presente al iniciarse
la k-esima iteracion, A = {(i, j) / cij (ui + vj ) = 0}, B el mnimo
n corte correspondiente o
al maximo flujo
c (u +v )
x en Guv y sean I = {i / di B}, J = {j / lj B} y = min ij 2i j / i I, j / J . Sea (u, v) la
solucion factible del dual presente al iniciarse la iteracion k + 1, es decir, la definida por

ui + si i I vj si j J
ui = vj =
ui si i
/I vj + si j
/J

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

debe ser optimo ya que


X X
valor de x0 = x0si = xsi = valor de x = valor de x
i i

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

si fuese I = I 0 entonces se tendra que


X X X X X
bj = bj = bj + bj > bj
jJ jJ 0 jJ jJ 0 J jJ

pues J J 0 , J 6= J 0 y bj > 0 para todo j = 1, 2, . . . , n. Luego, I 6= I 0 y, como I I 0 entonces #I 0 #I + 1.


En resumen, hemos probado que el maximo flujo x obtenido en la k-esima iteracion del algoritmo y el maximo
flujo x obtenido en la iteracion k+1 siempre satisfacen valor de x valor de x, que si valor de x > valor de x
entonces valor de x 1 + valor de x (es decir, si el valor del flujo aumenta, lo hace en por lo menos una
unidad) y que si en cambio valor de x = valor de x (es decir, si el valor del flujo no aumenta en una iteracion)
entonces los conjuntos I y J calculados por el algoritmo en el paso 4 de la iteracion k + 1 tiene al menos un
elemento mas cada uno que los calculados en la iteracion k-esima.
Conclusi on: El valor del flujo solo puede permanecer constante en a lo sumo r = min{m, n} iteraciones
sucesivas, ya que el cardinal del conjunto I calculado por el algoritmo en el paso 4 es siempre menor o igual
que m y el del conjunto J es siempre menor o igual que n. Por lo tanto, cada r + 1 iteraciones el valor
del flujo necesariamente debeX aumentar en al menos una unidad. Dado que el valor Xdel flujo en cualquier
iteracion esta acotado por ai entonces el algoritmo termina en a lo sumo (r + 1) ai iteraciones, donde
i i
r = min{m, n}.
131

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

0 xvw uvw (v, w) E


X
Notemos que la condicion bv = 0 es necesaria para que exista una solucion factible del problema ya que
v
si x es una solucion factible entonces debe satisfacerse
X X X X
0 = x(V, V ) x(V, V ) = x(v, V ) x(V, v) = (x(v, V ) x(V, v)) = bv
v v v v

Si bv > 0 llamaremos a bv la oferta del vertice v, si bv = 0 diremos que v es un punto de transferencia y


si bv < 0 llamaremos a bv la demanda del vertice v. Sea A la matriz de incidencia vertice-rama de G, es
decir, la matriz que tiene una fila para cada vertice v y una columna para cada rama e y cuyos coeficientes
estan dados por (
1 si v es la cola de e
ave = 1 si v es la punta de e
0 en otro caso
Tomemos las coordenadas de x = (xe )eE , c = (cX
e )eE y u = (ue )eE en el mismo orden que las columnas
de A. Entonces podemos escribir cx en lugar de ce xe y x u en lugar de xe ue (e E). Ademas, la
e
v-esima ecuacion del sistema Ax = b resulta ser

x(v, V ) x(V, v) = bv

En efecto, como ave = 0, 1, 1,

{e E / ave = 1} = {e E / v es la cola de e} = {(v, w) E / w V }

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

Luego, podemos escribir el problema en la forma

min cx
Ax = b
0xu

Ejemplo 1.1. Consideremos el grafo dirigido


3

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

Tomando x = (x13 , x12 , x32 , x23 , x34 , x24 ) entonces el sistema Ax = b es



x13

1 1 0 0 0 0 x12 b1

0 1 1 1 0 1 x32 b2
. =
1 0 1 1 1 0 x23 b3

0 0 0 0 1 1 x34 b4
x24

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

es la matriz de incidencia vertice-rama del grafo


2

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

F10 = F1 , F20 = F2 F1 , F30 = F3 F2 , . . . , Fm


0 0
= Fm Fm1 , Fm+1 = Fm

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

F10 = F1 , F20 = F2 F1 , F30 = F3 F2 , F40 = F3

(ver observacion 1.2.) obtenemos el sistema equivalente A0 x = b0 donde



1 1 1 0 0 0 1 0 0 | r
0 0 1 0 0 1 1 0 1 1 0 | 0
[A | b ] =
0 1 0 1 0 1 0 1 1 | 0
0 0 1 0 1 1 0 0 1 | r

Luego, el problema puede escribirse en la forma

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

2. Optimalidad de una soluci


on factible.

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

min (c, 0).(x, s)



A 0 x b
= (P)
I I s u
(x, s) 0

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

yv + yw + zvw cvw ((v, w) E)


zvw 0 ((v, w) E)

Dado (yv )vV , si cvw = cvw + yv yw ((v, w) E) entonces (y, z) es una solucion factible de (D) si y solo si

zvw cvw ((v, w) E)


zvw 0 ((v, w) E)

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

cvw = cvw + yv yw ((v, w) E)


zvw = min {cvw , 0} ((v, w) E)

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.

Ahora supongamos que uvw = para algunos (v, w) E.


Flujo de mnimo costo 139

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

min (c, 0).(x, s)



A 0 x b
= (P)
I 0 Ik s u0
(x, s) 0

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

lo que puede escribirse


6
X
min cei xei + 0.se1 + 0.se3 + 0.se5 + 0.se6
i=1

1 0 1 0 0 0 | 0 0 0 0 xe1
b1
0 1 0 0 1 0 | 0 0 0 0 xe2
b
1 1 0 1 0 1 | 0 0 0 0 xe3 2
b
0 0 1 1 0 0 | 0 0 0 0 xe4 3
b
0 0 0 0 1 1 | 0 0 0 0 xe5 4
. = b
| xe6 5
u
1 0 0 0 0 0 | 1 0 0 0 se 1 e 1
u
0 0 1 0 0 0 | 0 1 0 0 se 3 e 3
ue5
0 0 0 0 1 0 | 0 0 1 0 se 5
ue6
0 0 0 0 0 1 | 0 0 0 1 se 6
xe 0 (e E)
se 0 (e E L)
es decir,

min (c, 0).(x, s)



A 0 x b
=
I 0 Ik s u0
(x, s) 0
donde
1 0 1 0 0 0
0 1 0 0 1 0

A = 1 1 0 1 0 1

0 0 1 1 0 0
0 0 0 0 1 1
es la matriz de incidencia vertice-rama de G,

1 0 0 0 0 0
0 0 0 1 0 0 0
I =
0 0 0 0 1 0
0 0 0 0 0 1
es la matriz que se obtiene eliminando en la matriz identidad que tiene una fila y una columna por cada
rama de G
1 0 0 0 0 0
0 1 0 0 0 0

0 0 1 0 0 0
I=
0 0 0 1 0 0

0 0 0 0 1 0
0 0 0 0 0 1
la segunda y la cuarta fila, es decir, las filas correspondientes a las ramas de capacidad infinita, que en este
caso son e2 y e4 , Ik = I4 es la matriz identidad y u0 = (ue1 , ue3 , ue5 , ue6 ).
Ahora la variable del dual (y, z) es tal que y tiene una coordenada por cada vertice de G y z tiene una
coordenada por cada rama de E L y las restricciones del dual son
yv + yw + zvw cvw ((v, w) E L)
yv + yw cvw ((v, w) L)
zvw 0 ((v, w) E L)
Flujo de mnimo costo 141

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.

3. Un algoritmo en el caso general.


Sea G = (V, E) un grafo dirigido tal
Xque cada rama e E tiene asignado un costo ce y una capacidad ue .
Sea b = (bv )vV un vector tal que bv = 0 y consideremos el problema
v

min c.x
x(v, V ) x(V, v) = bv v V
0 xe ue e E
142 Optimizaci
on Combinatoria

Sea x un flujo factible en G y sean v, w V dos vertices cualesquiera.


Si P es un camino en G de v a w (no necesariamente dirigido) diremos que una rama e P es directa si al
recorrer P en la direccion de v hacia w pasamos por la cola de e antes que por la punta y diremos que e P
es inversa si al recorrer P de v hacia w pasamos por la punta de e antes que por la cola.
Dado un camino P en G de v a w diremos que P es un camino aumentativo si
xe < ue e P directa y 0 < xe e P inversa
Ademas, definimos el costo de P en la forma
X X
c(P) = ce ce
eP / eP /
e directa e inversa

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

De esta manera queda definida una funcion

: { circuitos aumentativos en G } { circuitos dirigidos en G(x) }

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

es decir, el circuito 4 3 2 1 4 entonces (P) es el circuito dirigido en G(x)


2
c 12 c23
c12
c 13 3
1
c 52
c43
c 15
c 41
c 43
c 54 4
5
Veamos que los costos de estos circuitos coinciden: c(P) = c43 c23 c12 c41 = c((P)).
Ejemplo 3.4. Si ahora consideramos el circuito aumentativo C indicado con trazo grueso
2

3
1

5 4
144 Optimizaci
on Combinatoria

es decir, el circuito 5 4 3 2 1 5 entonces (C) es el circuito dirigido en G(x)


2
c 12 c23
c12
c 13 3
1
c 52
c43
c 15
c 41
c 43
c 54 4
5
Veamos que c(C) = c((C)). En efecto, c(C) = c54 + c43 c23 c12 + c15 = c((C)).
Observaci on 3.5. La funcion aplica biyectivamente el conjunto de circuitos aumentativos de costo
negativo en G en el conjunto de circuitos dirigidos de costo negativo en G(x). Por lo tanto, existe un circuito
aumentativo de costo negativo en G si y solo si existe un circuito dirigido de costo negativo en G(x).
Teorema 3.6. Una solucion factible x es optima si y solo si no existe un circuito aumentativo de costo
negativo en G.
Demostraci
on: (=) resulta de la observacion 3.1.
(=) Si no existe un circuito aumentativo de costo negativo en G entonces, por la observacion 3.5., no existe
un circuito dirigido de costo negativo en G(x) . Creamos un nuevo grafo G agregando a G(x) un vertice s
y ramas (s, v) para cada vertice v de G(x) con costo c0sv = 0. Para cada v, sea yv el costo de un camino
dirigido optimo en G de s a v. Observemos que como (s, v) es una rama de G entonces siempre existe al
menos un camino dirigido de s a v y como G no contiene ciclos dirigidos de costo negativo entonces siempre
existe un camino optimo a v. Para ver que x es optimo, basta ver que (yv ) satisface las condiciones i) y ii)
del teorema 2.1.
Validez de i): si xvw > 0 entonces (w, v) es una rama de G(x) (y por lo tanto de G) de costo c0wv = cvw .
Luego, el camino dirigido optimo de s a w seguido de la rama (w, v) es un camino dirigido en G de s a v de
costo yw + c0wv y por lo tanto debe ser yv yw + c0wv = yw cvw , de donde cvw + yv yw 0.
Validez de ii): si xvw < uvw entonces (v, w) es una rama de G(x) (y por lo tanto de G) de costo c0vw = cvw .
Luego, el camino dirigido optimo de s a v seguido de la rama (v, w) es un camino dirigido en G de s a w de
costo yv + c0vw y por lo tanto debe ser yw yv + c0vw = yv + cvw , de donde cvw + yv yw 0.
Descripci
on del algoritmo.
1. Encontrar una solucion factible x. Si no existe, STOP (en tal caso el problema no tiene solucion).
2. Encontrar un circuito aumentativo P de costo negativo en G. Si no existe, STOP (en tal caso la presente
solucion x es optima).
3. Calcular = min {min{ue xe / e P directa}, min{xe / e P inversa}} y actualizar x sumando a
cada xe tal que e P es directa y restando a cada xe tal que e P es inversa.
4. GOTO 2
Observaci
on 3.7. Para encontrar una solucion factible x basta resolver el problema de transshipment

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.

El problema de hallar un flujo de mnimo costo en un grafo G = (V, E)


X
min ce xe
eE

x(v, V ) x(V, v) = bv v V
0 xe ue e E

puede escribirse en la forma

min c.x
Ax = b
0x u

donde A es la matriz de incidencia vertice rama del grafo G = (V, E).


Sean L = {(v, w) E / uvw = }, m = #V , n = #E y k = #(E L). Entonces podemos eliminar la cota
superior u introduciendo variables de holgura, es decir reemplazando, para cada e E L, la condicion
xe ue por la igualdad xe + se = ue y la condicion se 0. Luego, el problema dado es equivalente a

min (c, 0).(x, s)



A 0 x b
=
I 0 Ik s u0
(x, s) 0

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

y para cada e = (v, w) E L la coordenada e de b0 es uvw Luego,


X X
b0w + b0vw =
w (v,w)EL
X X X X
= bw + uvw + uvw =
w w v/(v,w)EL (v,w)EL
X X X
= bw + uvw + uvw =
w (v,w)EL (v,w)EL
X
= bw = 0
w

Luego, el problema de hallar un flujo de mnimo costo en G es equivalente a

min (c, 0).(x, s)



0 x
A = b0
s
(x, s) 0

donde A0 es una matriz de incidencia vertice-rama y la suma de las coordenadas de b0 es cero.


Si consideramos el grafo G0 que se obtiene de G agregando un vertice e por cada rama de capacidad finita e
de G y reemplazando en G cada rama de capacidad finita e = (v, w) por dos ramas, una rama (v, e) y otra
rama (w, e) resulta que, ordenando convenientemente los vertices y las ramas de G0 , la matriz de incidencia
vertice-rama de G0 es la matriz A0 .
Si a cada rama e de G0 tal que e era una rama de G de capacidad infinita le asignamos costo ce , capacidad
infinita y denotamos por xe su flujo, a cada rama (v, e) de G0 tal que v es la cola de e le asignamos costo
ce , capacidad infinita y denotamos por xe su flujo y a cada rama (v, e) de G0 tal que v es la punta de e le
asignamos costo cero, capacidad infinita y denotamos por se a su flujo entonces tomando al vector b0 como
vector de oferta-demanda de los vertices de G0 (que tiene una coordenada por cada vertice de G y por cada
rama de G de capacidad finita, es decir, una coordenada por cada vertice de G0 ), el problema resulta ser el
problema de hallar un flujo de mnimo costo en G0 . Si (x, s) es un flujo de mnimo costo en G0 entonces x
es un flujo de mnimo costo en G.
on 4.1. El grafo G es conexo si y solo si el grafo G0 lo es.
Observaci
Ejemplo 4.2 Consideremos el grafo
1
2
e3
e1 e2
4 e5

e4

3 e6 5

cuya matriz de incidencia vertice-rama es



1 0 1 0 0 0
0 1 0 0 1 0

A = 1 1 0 1 0 1

0 0 1 1 0 0
0 0 0 0 1 1
148 Optimizaci
on Combinatoria

y supongamos que 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 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

para cada u V que sea la punta de una rama en E L y

Fe0 = Fe

para cada e E L en la matriz ampliada del sistema



1 0 1 0 0 0 0 0 0 0 | b1
0 1 0 0 1 0 0 0 0 0 | b2

1 1 0 1 0 1 0 0 0 0 | b3

0 0 1 1 0 0 0 0 0 0 | b4

0 0 0 0 1 1 0 0 0 0 | b5

1 0 0 0 0 0 1 0 0 0 | u e1

0 0 1 0 0 0 0 1 0 0 | u e3

0 0 0 0 1 0 0 0 1 0 | u e5
0 0 0 0 0 1 0 0 0 1 | u e6
Flujo de mnimo costo 149

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

Luego el problema dado para el grafo G resulta equivalente a

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

y donde el vector de oferta-demanda de los vertices de G0 es el vector

b0 = (b1 , b2 , b3 + ue1 , b4 + ue3 , b5 + ue5 + ue6 , ue1 , ue3 , ue5 , ue6 )

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)

En efecto, como xe = 0 para e


/T
X X
bv = xvw xwv =
w / (v,w)E w / (w,v)E
X X
= xvw xwv
w / (v,w)T w / (w,v)T
152 Optimizaci
on Combinatoria

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

Ahora, usando el lema 5.3. se tiene que


X X X
xh si p R(T, h)
bv = xvw xwv =
xh si p
/ R(T, h)
vR(T,h) vR(T ,h), wR(T
/ ,h) / vR(T ,h), wR(T
/ ,h) /
(v,w)T (w,v)T

como queramos probar.


Corolario 5.5 Existen finitas tree solutions de G.
Sea x una tree solution y sea T un spanning tree de G tal que xe = 0 para todo e
/ T . Para cada v V ,
v 6= s, denotemos por yv al costo del u
nico camino en T de s a v, y sea ys = 0.
Observaci on 5.6. Dados dos vertices v y w de G, si P es el u
nico camino en T de v a w entonces el u
nico
camino en T de w a v es el que resulta de recorrer P en sentido contrario. Denotaremos por P a este
camino. Luego, las ramas de P que son directas son las ramas de P que son inversas y las ramas de P que
son inversas son las ramas de P que son directas, de donde se tiene que c(P) = c(P). Por ejemplo, si
T es
2 3 e5
8

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

entonces P es igual a C seguido del u


nico camino de s a w. En este caso c(P) = yv + yw .
Si en cambio tenemos la situacion

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

Observemos que para cada u 6= s el costo yu0 del u


nico camino en T 0 de s a u es

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 )
En efecto, si u R(T, e0 ), como el camino en T de s a u no contiene a la rama e0 que vamos a quitar,
entonces este camino sigue siendo un camino de s a u en T 0 y por lo tanto yu0 = yu . Supongamos ahora que
u/ R(T, e0 ), es decir, el camino en T de s a u contiene a e0 . Si v R(T, e0 ) entonces la situacion es
v

s w

e0

y el camino en T 0 de s a u es el camino en T de s a v seguido de la rama (v, w) y seguido del camino en T


de w a u. Luego, el camino en T 0 de s a u seguido del camino en T de s a u recorrido en sentido inverso es
el ciclo C, de donde yu0 yu = c(C) = cvw + yv yw , es decir, yu0 = yu + cvw + yv yw .
En cambio, si v
/ R(T, e0 ) entonces la situacion es
e0

u
s

v
w

y el camino en T 0 de s a u es el camino en T de s a w seguido de la rama (v, w) recorrida en sentido inverso y


seguido del camino en T de v a u. Luego, el camino en T de s a u seguido del camino en T 0 de s a u recorrido
en sentido inverso es el ciclo C, de donde yu yu0 = c(C) = cvw + yv yw , es decir, yu0 = yu (cvw + yv yw ).
Flujo de mnimo costo 155

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].

6. La FASE 1 para un grafo conexo.


Para poder aplicar el algoritmo necesitamos conocer una tree solution inicial y su correspondiente spanning
tree. Esto se logra de la siguiente manera: a partir del grafo G = (V, E) creamos un nuevo grafo G0 agregando
a G un nuevo vertice s que sera la raz, ramas (v, s) para cada v V tal que bv 0 y ramas (s, v) para cada
v V tal que bv < 0 y tomemos bs = 0. A las ramas que hemos agregado las llamaremos ramas artificiales.
A las ramas de e E les asignamos costo c0e = 0 y a las ramas e artificiales les asignamos costo c0e = 1.
Consideremos en G0 el problema de flujo de mnimo costo

min c0 x
x(v, V {s}) x(V {s}, v) = bv v V {s} (3)
x0
156 Optimizaci
on Combinatoria

on 6.1. El flujo x0 definido por


Observaci
(
bv si bv 0 y e = (v, s)
x0e = bv si bv < 0 y e = (s, v)
0 si e E

es una tree solution para G0 . El correspondiente spanning tree es T 0 = (V 0 , E 0 ), donde V 0 = V {s} y


E 0 = {(v, s) / bv 0} {(s, v) / bv < 0}, ya que
b 0 = b si v 6= s y bv 0
v v
0 (b ) = b v 6= s y bv < 0
0 0 X v v
x (v, V {s}) x (V {s}, v) =

b v = 0 = bs si v = s
vV

y x0e = 0 para todo e


/ T 0.
Luego, siempre podemos resolver (3) aplicando el algoritmo, utilizando la solucion inicial x0 y el correspon-
diente spanning tree T 0 . Tal como ocurre en la fase 1 del algoritmo simplex visto en el captulo 1, la fase
1 de este algoritmo consiste en resolver (3) para hallar una tree solution inicial que nos permita aplicar el
algoritmo para resolver (2).
Proposici on 6.2. Se verifican
a) si (2) tiene alguna solucion factible entonces (3) tiene una solucion optima x que verifica c0 x = 0 (y, por
lo tanto, en cualquier solucion optima el valor del funcional sera cero).
b) Si x es una tree solution optima de (3) con spanning tree T 0 , que verifica c0 x = 0 entonces el flujo x
definido por xe = xe para cada e E es una tree solution para G. El correspondiente spanning tree T se
obtiene de T 0 de la siguiente manera:
1. Sea H el grafo que se obtiene eliminando en T 0 todas las ramas artificiales que contenga y el vertice s.
2. Elegir v V
3. A = {v}
4. Aplicar un algoritmo search para hallar todos los vertices w tales que existe un camino en H de v a w.
5. A = A {w V / un camino en H de v a w}.
6. Si A = V STOP
7. Elegir una rama e / H de G tal que uno de sus vertices pertenezca a A y el otro no.
8. Actualizar H en la forma: H = grafo obtenido agregando e a H.
9. GOTO 4.
Demostraci
on: a) Si (2) tiene una solucion factible x entonces el flujo x definido por
n
xe si e E
xe =
0 si e es una rama artificial

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.

7. Algoritmo simplex para el problema del transporte.


Por razones de claridad aplicaremos el algoritmo en un ejemplo particular, pero el lector se dara cuenta de
que este procedimiento puede aplicarse en cualquier caso.
Supongamos que tenemos tres depositos y cuatro clientes y queremos determinar la manera mas barata de
transportar cierta mercadera de los depositos a los clientes. Si el costo cij de transportar una unidad de
mercadera desde el deposito vi (1 i 3) al cliente wj (1 j 4) esta dado por la matriz

8 6 10 9
C = (cij ) = 9 12 13 7,
14 9 16 5

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

Esta situacion puede ser representada en el grafo bipartito G = (V, E) donde

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

y pensando a xij como el flujo de la rama (vi , wj ) el problema se escribe

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 = 50, F3 = 40, C1 = 10, C2 = 20, C3 = 30, C4 = 30


2. Ahora
x21 x22 x23 x24
U=
x31 x32 x33 x34
3. r = 2, s = 1. Ponemos x21 = min{F2 , C1 } = C1 = 10 y xi1 = 0 para todo xi1 que no tenga valor asignado.
Ahora
35 0 0 0
(xij ) = 10 x22 x23 x24
0 x32 x33 x34
4. F1 = 0, F2 = 40, F3 = 40, C1 = 0, C2 = 20, C3 = 30, C4 = 30
2. Ahora
x22 x23 x24
U=
x32 x33 x34
3. r = 2, s = 2. Ponemos x22 = min{F2 , C2 } = C2 = 20 y xi2 = 0 para todo xi2 que no tenga valor asignado.
Ahora
35 0 0 0
(xij ) = 10 20 x23 x24
0 0 x33 x34
4. F1 = 0, F2 = 20, F3 = 40, C1 = 0, C2 = 0, C3 = 30, C4 = 30

x23 x24
2. Ahora U =
x33 x34
3. r = 2, s = 3. Ponemos x23 = min{F2 , C3 } = F2 = 20 y x2j = 0 para todo x2j que no tenga valor
asignado. Ahora
35 0 0 0
(xij ) = 10 20 20 0
0 0 x33 x34
4. F1 = 0, F2 = 0, F3 = 40, C1 = 0, C2 = 0, C3 = 10, C4 = 30
2. Ahora U = ( x33 x34 )
3. r = 3, s = 3. Ponemos x33 = min{F3 , C3 } = C3 = 10 y xi3 = 0 para todo xi3 que no tenga valor asignado.
Ahora
35 0 0 0
(xij ) = 10 20 20 0
0 0 10 x34
160 Optimizaci
on Combinatoria

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

ywj yvi = cij (vi , wj ) T


yv1 = 0

Este sistema tiene 7 ecuaciones y 7 incognitas y tiene solucion u


nica ya que fijados T y s hay un u
nico camino
de s a u para todo u 6= s. Ademas, este sistema puede resolverse facilmente por sustitucion. En efecto, el
sistema es
yw1 yv1 = 8
yw1 yv2 = 9
yw2 yv2 = 12
yw3 yv2 = 13
yw3 yv3 = 16
yw4 yv3 = 5
yv1 = 0

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

con m 1 ecuaciones y m incognitas (donde m es la cantidad de vertices de G) tiene rango m 1 y se puede


resover dandole un valor arbitrario (en nuestro caso cero) a una indeterminada y obteniendo las restantes
por sustitucion. Veremos ahora que este hecho vale en general.

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

Intercambiando si es necesario una fila y una columna de B obtenemos




..
B10 = B1 .

0 0 1

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

y permutando esas mismas filas y columnas en B10 obtenemos




.. ..
B1 . .
B20 =

0 0 1
0 0 0 1

Repitiendo este procedimiento finalmente obtenemos



1
1

0 1
B0 =
0 0 1


. .. .. .. .. .. ..
.. . . . . . .
0 0 0 0 0 1

Como B 0 se obtuvo permutando filas y columnas de B entonces rg B = rg B 0 = m 1. Ademas, como


las columnas de B son algunas de las columnas de A entonces debe ser rg A rg B = m 1. Pero por
otra parte, como A tiene m filas y la suma de ellas es cero (por ser la matriz de incidencia de un grafo, ver
observacion 1.13. del captulo 2) entonces rg A < m, de donde rg A = m 1.
Corolario 7.2. Con las mismas hipotesis de la proposicion anterior, el sistema y.B = c se puede resolver
dandole a una indeterminada un valor arbitrario y obteniendo las restantes por sustitucion.
163

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.

Ejemplo 1.1. El problema de la mochila.

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 .

Ejemplo 1.2. El problema de la carga fija.

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

5x1 + 2x2 10 = x1 + 2x2 4 + c


x1 + 2x2 4 = 5x1 + 2x2 10 + c

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 .

Ejemplo 1.4. Funcion objetivo no lineal.

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

Ejemplo 1.6. Cutting-stock problem.


La maquina de casting produce bobinas de celofan de 200 pulgadas de ancho. Los clientes realizan pedidos
por bobinas de anchos menores. Sean w1 , . . . , wm los posibles anchos pedidos por los clientes. Llamaremos
pattern a cualquier sucesion de enteros no negativos (a1 , . . . , am ) tal que a1 w1 + + am wm 200, con
la que luego se instruye al operario para que corte la bobina original de 200 pulgadas para que resulten ai
bobinas de ancho wi (1 i m). La siguiente figura muestra una bobina con el pattern de corte (4, 2, 1)
para los anchos w1 = 20, w2 = 30 y w3 = 40.

En este caso queda un borde de 10 pulgadas de descarte a cada lado.


El problema consiste en satisfacer los pedidos utilizando un mnimo n umero de bobinas. Sea bi el n umero
de bobinas de ancho wi pedidas por los clientes (1 i m).
Notemos que el conjunto de patterns {(a1 , . . . , am } / a1 w1 + + am wm 200} es finito. Sean p1 , . . . , pn sus
elementos. Para cada j denotemos por a1j , . . . , amj a los enteros no negativos tales que pj = (a1j , . . . , amj )
y a1j w1 + + amj wm 200. Sea xj la cantidad de bobinas de 200 pulgadas de ancho que se cortan seg un
el j-esimo pattern (1 j n). Entonces el problema se puede plantear en la forma
X
min xj
j
X
aij xj bi
j

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

que puede escribirse, agregando las correspondientes variables de holgura, en la forma


X
min xj + 0s1 + + 0sm
j
X
aij xj si = bi
j

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

Luego v 0 y satisface v.Ajt 1 para t = 1, . . . , r.


Si fuese v.Aj 1 para todo 1 j n entonces v sera una solucion factible de (4). Ademas, como ujt 0
para t = 1, . . . , r y se verifica aij1 uj1 + +aijr ujr bi para i = 1, . . . , m, tomando uj = 0 para j 6= j1 , . . . , jr
resulta que u = (u1 , . . . , un ) es una solucion factible de (3). Como ademas v y (uj1 , . . . , ujr ) satisfacen las
condiciones de holgura complementaria del problema con reduccion de columnas entonces verifican

(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.

Luego, el problema puede plantearse en la forma

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

xik + pik xjk o xjk + pjk xik (i 6= j)

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.

Ejemplo 1.8. El problema de los cuatro colores.

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

y los restantes ij iguales a cero. Es decir, el conjunto (i, j) tales que ij = 1 es

{(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

resuelve el problema del viajante.


Demostraci on: Mostraremos que cada circuito Hamiltoniano puede representarse como una solucion
factible de (10).
Supongamos que C es un circuito Hamiltoniano. Para cada (i, j) sea
n
ij = 1 si (i, j) C
0 si no

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

entonces para cada i hay un


Xunico j tal que ij = 1 y un u
nico j tal que ji = 1 (notemos que la segunda
igualdad puede escribirse ji = 1 para 0 i n). Esto significa que para cada vertice i hay una sola
j
rama de C cuya cola es i y una sola rama de C cuya punta es i. Luego, solo debemos ver que las ramas
de C forman un circuito y no dos o mas subcircuitos. Supongamos que formaran dos o mas subcircuitos.
Entonces podemos elegir uno de ellos que no pase por el vertice 0. Sea E el conjunto de ramas que lo forman
y sea k = #E. Como ui uj + nij n 1 para todo 1 i, j n tal que i 6= j entonces
X
ui uj + nij k(n 1)
(i,j)E

Pero como para cada i hay una u


nica rama en E cuya cola es i y una u
nica rama cuya punta es i entonces
X
ui uj = 0
(i,j)E

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, )

Esto motiva la siguiente definicion:


Dos cuadrados latinos de n n se dicen ortogonales (o grecolatinos) si los coeficientes de su superposicion
son n2 pares distintos. En general, m cuadrados latinos L1 , . . . , Lm de n n se dicen ortogonales si Li y Lj
son ortogonales para todo i 6= j (1 i, j m).
Euler conjeturo que no existen pares de cuadrados latinos ortogonales de n n, para n de la forma 4k + 2
(k IN). Recien en 1960 se pudo determinar que esta conjetura era falsa cuando Bose, Parker y Shrikhande
probaron que, salvo para n = 2 o 6, siempre existe un par de cuadrados latinos ortogonales de n n.
174 Optimizaci
on Combinatoria

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

1) para cada i, j existen u nicos k, s tales que ijks = 1.


2) para cada i, k existen u nicos j, s tales que ijks = 1.
3) para cada i, s existen u nicos j, k tales que ijks = 1.
4) para cada j, k existen u nicos i, s tales que ijks = 1.
5) para cada j, s existen u nicos i, k tales que ijks = 1.
En efecto, la validez de 1) resulta de que fijados i y j entonces ijks = 1 si y solo si k = aij y s = bij . La de
2) de que fijados i y k entonces ijks = 1 si y solo si j es la u nica columna de A tal que aij = k y s = bij .
La de 3) de que fijados i y s entonces ijks = 1 si y solo si j es la u nica columna de B tal que bij = s y
k = aij . La de 4) de que fijados j y k entonces ijks = 1 si y solo si i es la u nica fila de A tal que aij = k y
s = bij . Finalmente, la de 5) de que, fijados j y s, ijks = 1 si y solo si i es la u nica fila de B tal que bij = s
y k = aij .
Ademas, como A y B son ortogonales, entonces cada (k, s) aparece una y solo una vez en C. Luego, fijados
k y s existen unicos i, j tales que cij = (k, s), es decir, tales que (aij , bij ) = (k, s). Por lo tanto tambien vale
la condicion
6) para cada k, s existen unicos i, j tales que ijks = 1.
El hecho de que cada ijks es cero o uno y que satisfagan las condiciones 1) a 6) es equivalente a que los
ijks sean una solucion factible de
X
ijks = 1 (1 i, j n)
k,s
X
ijks = 1 (1 i, k n)
j,s
X
ijks = 1 (1 i, s n)
j,k
X
ijks = 1 (1 j, k n) (11)
i,s
X
ijks = 1 (1 j, s n)
i,k
X
ijks = 1 (1 k, s n)
i,j

0 ijks 1, ijks enteros


Programaci
on lineal entera 175

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

(aij , bij ) = (k, s) ijkl = 1

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

: (x1 x2 x3 ) ( x1 x3 x4 ) (x2 x3 x4 ) ( x1 x2 x3 ) (x1 x2 x3 x4 )

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

(Notar que como, para cada i, xi es un entero no negativo entonces x1 + x2 + (1 x3 ) 1 sii x1 6= 0 o x2 6= 0


o (1 x3 ) 6= 0 sii x1 = 1 o x2 = 1 o (1 x3 ) = 1 ya que xi solo puede tomar los valores 0 y 1. Por lo tanto,
x1 + x2 + (1 x3 ) 1 sii x1 es V o x2 es V o x3 es V sii x1 x2 x3 es V)
Luego, existe alguna asignacion de V o F a las variables x1 , . . . , x4 tal que sea verdadera si y solo si el
problema de programacion lineal entera

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

es factible, lo que es equivalente a que el problema de programacion lineal entera mixta

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

tenga una solucion optima (z, x1 , x2 , x3 , x4 ) que satisfaga z 1.


Programaci
on lineal entera 177

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

max 21x1 + 11x2


7x1 + 4x2 13
xi 0, xi entero

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

es un arbol dirigido con raz s y cuatro niveles.


on 3.5. Si un arbol dirigido con raz es binario y tiene n niveles entonces tiene 2n+1 1 vertices.
Observaci
Consideremos el siguiente problema: dado un arbol dirigido con raz s, donde cada vertice x tiene asignado
un costo c(x) que satisface c(x) c(y) para toda rama (x, y) queremos hallar una hoja de mnimo costo.
178 Optimizaci
on Combinatoria

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.

Ejemplo 3.6. Consideremos el arbol dirigido con raz s


s

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.

Aplicando el algoritmo obtenemos

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.

Ejemplo 4.3. Resolveremos el problema de programacion lineal entera

max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8
6x1 3x2 + 7x3 8
0 xi 5 xi entero

0. L = {s}, c =
donde la raz del arbol es el problema

max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8
(s)
6x1 3x2 + 7x3 8
0 xi 5
182 Optimizaci
on Combinatoria

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,

max 3x1 + 3x2 + 13x3 max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8 3x1 + 6x2 + 7x3 8
6x1 3x2 + 7x3 8 (u1 ) y 6x1 3x2 + 7x3 8 (u2 )
x1 2 x1 3
0 xi 5 0 xi 5

Actualizamos L en la forma L = {u1 , u2 }


4. L 6= , vamos a 1.
1. L = {u1 }. Calculamos c(u2 ). En este caso u2 no es factible. Luego, c(u2 ) = . Como c(u2 ) es menor
o igual que c = vamos a 4.
4. L 6= , vamos a 1.
1. L = . Calculamos c(u1 ). Para ello resolvemos u1 . Una solucion optima es (x1 , x2 , x3 ) = (2, 2, 27 ) y el
valor del funcional en ella es 15 + 57 , de donde c(u1 ) = 15 + 57 . Como c(u1 ) es mayor que c = vamos a 2.
2. u1 no es una hoja, ya que x3 no es entero. Como 0 < x3 < 1, los hijos de u1 son los subproblemas u3 y
u4 que resultan de agregar al problema u1 las restricciones x3 0 y x3 1 respectivamente. Es decir,

max 3x1 + 3x2 + 13x3 max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8 3x1 + 6x2 + 7x3 8
6x1 3x2 + 7x3 8 6x1 3x2 + 7x3 8
(u3 ) y (u4 )
x1 2 x1 2
x3 0 x3 1
0 xi 5 0 xi 5

Actualizamos L en la forma L = {u3 , u4 }


4. L 6= , vamos a 1.
1. L = {u3 }. Calculamos c(u4 ). Una solucion optima de u4 es (x1 , x2 , x3 ) = ( 13 , 13 , 1) y el valor del funcional
en ella es c(u4 ) = 15. Como c(u4 ) es mayor que c = vamos a 2.
2. u4 no es una hoja ya que x1 no es entero. Como 0 < x1 < 1 los hijos de u4 son los subproblemas u5 y
u6 que resultan de agregar al problema u4 las restricciones x1 0 y x1 1 respectivamente. Es decir,

max 3x1 + 3x2 + 13x3 max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8 3x1 + 6x2 + 7x3 8
6x1 3x2 + 7x3 8 6x1 3x2 + 7x3 8
x1 2 (u5 ) y x1 2 (u6 )
x3 1 x3 1
x1 0 x1 1
0 xi 5 0 xi 5

Actualizamos L en la forma L = {u3 , u5 , u6 }


Programaci
on lineal entera 183

4. L 6= , vamos a 1.

1. L = {u3 , u5 }. Calculamos c(u6 ). El problema u6 no es factible. Luego, c(u6 ) = . Como c(u6 ) es


menor o igual que c = vamos a 4.

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,

max 3x1 + 3x2 + 13x3 max 3x1 + 3x2 + 13x3


3x1 + 6x2 + 7x3 8 3x1 + 6x2 + 7x3 8
6x1 3x2 + 7x3 8 6x1 3x2 + 7x3 8
x1 2 x1 2
(u7 ) y (u8 )
x3 1 x3 1
x1 0 x1 0
x3 1 x3 2
0 xi 5 0 xi 5

Actualizamos L en la forma L = {u3 , u7 , u8 }

4. L 6= , vamos a 1.

1. L = {u3 , u7 }. Calculamos c(u8 ). El problema u8 no es factible. Luego, c(u8 ) = . Como c(u8 ) es


menor o igual que c = vamos a 4.

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.

2. Como u7 es una hoja, no modificamos L y vamos a 3.

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.

El subarbol generado por el algoritmo es


184 Optimizaci
on Combinatoria

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

El problema consiste en hallar un circuito Hamiltoniano C de mnimo costo.


Como antes, para resolver este problema generaremos un arbol binario dirigido con raz y definiremos una
funcion c(u) conveniente que satisfaga c(u) c(v) para toda rama (u, v) de manera que nuestro problema
Programaci
on lineal entera 185

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

Repitiendo este procedimiento para las restantes filas obtenemos la matriz



0 90 10 30 6 54
0 73 38 17 12 30

29 1 20 0 12 9

Dn = D7 = 32 83 73 49 0 84

3 21 63 8 0 32

0 85 15 43 89 4
18 0 7 1 58 13

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

satisface c0 (C, s) = c(C) k1 k7 r1 r7 . Definimos c(s) = k1 + + kn + r1 + + rn . En


este caso, c(s) = 96. De esta manera, c(C) = c0 (C, s) + c(s) = c0 (C, s) + 96.
Observaci on 5.1. Para cualquier circuito C se verifica que c(C) c(s). En efecto, como los coeficientes de
||cij (s)|| son no negativos entonces c0 (C, s) 0. Luego, c(C) = c0 (C, s) + c(s) c(s).
0

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

En este caso, el costo de la rama (5, 7) seg


un esta matriz es 28, es decir, c57 (u1 ) = 28.
0
Ahora generamos la matriz ||cij (u1 )|| que se obtiene restando a cada coeficiente de la fila i de ||cij (u1 )||
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(u1 ) = c(s) + ki + rj . Luego c(u1 ) c(s). Notemos que ||c0ij (u1 )|| tiene un coeficiente nulo en cada
fila y cada columna.
En nuestro caso resulta que k5 = 3, ki = 0 para i 6= 5 y rj = 0 para todo j, de donde ||c0ij (u1 )|| es la matriz
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 0 18 53 4 25
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58

y c(u1 ) = c(s) + 3 = 96 + 3 = 99.


Si C es un circuito que contiene a la rama (i1 , j1 ) (es decir, una solucion factible de u1 ) entonces

c(C) = c0 (C, s) + c(s) =


X
= c0ij (s) + c(s) =
(i,j)C
X
= c0ij (s) + c(s)
(i,j)C
(i,j)6=(i1 ,j1 )

ya que (i1 , j1 ) fue elegido verificando c0i1 j1 (s) = 0.


Sean X
c(C, u1 ) = cij (u1 )
(i,j)C
(i,j)6=(i1 ,j1 )

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 )

Luego, c(C) = c(C, u1 ) + c(s).


Con el mismo razonamiento utilizado para ver que c0 (C, s) = c(C)96 puede verse que c0 (C, u1 ) = c(C, u1 )3
(esto se debe a que ||c0ij (u1 )|| fue construda a partir de ||cij (u1 )|| con un procedimiento analogo al utilizado
para construr ||c0ij (s)|| a partir de ||cij (s)|| = ||cij ||).
Luego
c(C) = c(C, u1 ) + c(s) = c0 (C, u1 ) + 3 + c(s) = c0 (C, u1 ) + 3 + 96 =
= c0 (C, u1 ) + 99 = c0 (C, u1 ) + c(u1 )
X
Por lo tanto, c(C) = c0 (C, u1 ) + c(u1 ). Ademas, como Au1 = {(i1 , j1 )} entonces c0 (C, u1 ) = c0ij (u1 ).
(i,j)C
(i,j)A
/ u1

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).

En nuestro ejemplo, la matriz ||cij (v1 )|| correspondiente a v1 es


col 1 col 2 col 3 col 4 col 5 col 6 col 7
f ila 1 0 83 9 30 6 50
f ila 2 0 66 37 17 12 26
f ila 3 29 1 19 0 12 5
f ila 4 32 83 66 49 80
f ila 5 3 21 56 7 0 28
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58 13

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

col 1 col 2 col 3 col 4 col 5 col 6 col 7


f ila 1 0 83 9 30 6 50
f ila 2 0 66 37 17 12 26
f ila 3 29 1 19 0 12 5
f ila 4 0 51 34 17 48
f ila 5 3 21 56 7 0 28
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58 13

y c(v1 ) = c(s) + 32 = 96 + 32 = 128.


Programaci
on lineal entera 189

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

= c0 (C, v1 ) + 32 + 96 = c0 (C, v1 ) + 128 = c0 (C, v1 ) + c(v1 )


X
Luego, c(C) = c0 (C, v1 ) + c(v1 ) y, como Av1 = , entonces c0 (C, v1 ) = c0ij (v1 ).
(i,j)C
(i,j)A
/ v1

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 .

En nuestro caso ||cij (u2 )|| es la matriz


col 1 col 2 col 3 col 4 col 7
f ila 1 0 83 9 50
f ila 2 0 66 37 26
f ila 5 0 18 4 25
f ila 6 0 85 8 0
f ila 7 18 0 0 0
190 Optimizaci
on Combinatoria

y ||cij (v2 )|| es la matriz


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 5
f ila 5 0 18 53 4 25
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58

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

y c(v2 ) = c(u1 ) + 18 = 99 + 18 = 117.


Nuevamente dejamos a cargo del lector verificar que si C es un circuito que contiene a la rama (i1 , j1 ) y no
contiene a (i2 , j2 ) (es decir, una solucion factible de v2 ), definiendo
X
c0 (C, v2 ) = c0ij (v2 )
(i,j)C
(i,j)6=(i1 ,j1 )

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

y ||cij (v3 )|| es la matriz


col 1 col 2 col 3 col 4 col 5 col 6 col 7
f ila 1 0 83 9 30 6 50
f ila 2 66 37 17 12 26
f ila 3 29 1 19 0 12 5
f ila 4 0 51 34 17 48
f ila 5 3 21 56 7 0 28
f ila 6 0 85 8 89 0
f ila 7 18 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

y c(u3 ) = c(v1 ) + 23 = 128 + 23 = 151


Si C es un circuito que no contiene a la rama (i1 , j1 ) y s contiene a (i3 , j3 ) (es decir, una solucion factible
de u3 ), definiendo X
c0 (C, u3 ) = c0ij (u3 )
(i,j)C
(i,j)6=(i3 ,j3 )

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

col 1 col 2 col 3 col 4 col 5 col 6 col 7


f ila 1 0 83 9 30 6 50
f ila 2 54 25 5 0 14
f ila 3 29 1 19 0 12 5
f ila 4 0 51 34 17 48
f ila 5 3 21 56 7 0 28
f ila 6 0 85 8 89 0
f ila 7 18 0 0 0 58 13

y c(v3 ) = c(v1 ) + 12 = 128 + 12 = 140.


Ademas, si C es un circuito que no contiene a las ramas (i1 , j1 ) e (i3 , j3 ) definiendo
X
c0 (C, v3 ) = c0ij (v3 )
(i,j)C

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

c(C) = c0 (C, u) + c(u)

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

c(C) = c0 (C, h) + c(h)

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 (p1 )|| es


col 2 col 3 col 4
f ila 1 0 50
f ila 2 0 0
f ila 3 18 0

y c(p1 ) = 122 < = c.


Ahora generamos uno de los hijos de p1 , al que denotaremos por p2 , obtenido agregandole a p1 la restriccion
(2, 3) C. Se tiene entonces que ||cij (p2 )|| es la matriz
col 2 col 4
f ila 1 0
f ila 3 0

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

entonces ||c0ij (p4 )|| es la matriz


col 2 col 4
f ila 1 0 0
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

de donde ||c0ij (p5 )|| es la matriz


Programaci
on lineal entera 195

col 2 col 3 col 4


f ila 1 0 0
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

Luego, ||c0ij (p7 )|| es


col 2 col 3 col 4
f ila 1 80 0
f ila 3 0 0
f ila 4 57 0

de donde c(p7 ) = 77 < 122 = c.


Ahora generamos uno de los hijos de p7 , al que denotaremos por p8 , obtenido agregandole a p7 la restriccion
(3, 2) C. Se tiene entonces que ||cij (p8 )|| es la matriz
col 3 col 4
f ila 1 80 0
f ila 4 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

entonces ||c0ij (p10 )|| es la matriz

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

col 2 col 3 col 4


f ila 1 80 0
f ila 3 0
f ila 4 57 0

Luego, ||c0ij (p11 )|| es la matriz

col 2 col 3 col 4


f ila 1 80 0
f ila 3 0
f ila 4 0 0

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

col 1 col 2 col 3 col 4


f ila 1 0 85 5
f ila 2 68 33
f ila 3 0 18 0
f ila 4 75 0

de donde ||c0ij (p12 )|| es la matriz

col 1 col 2 col 3 col 4


f ila 1 0 85 5
f ila 2 35 0
f ila 3 0 18 0
f ila 4 75 0

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

c ( p12 )= 87 c ( p 7 ) = 77 c ( p 5 ) = 172 c ( p 2 ) = 122

(3,2) C
(3,2) C

(1,2) (1,2) C
C

p p p p
11 8 4 3

c ( p 11) = 134 c ( p8 ) = 77 c ( p4 ) = c ( p3) = 122

(4,3) C
(4,3) C

p10 p9

c ( p10 ) = c ( p 9 ) = 77

Anda mungkin juga menyukai