You are on page 1of 76

h i j

d e f g
a b c
10 8 7
9 4 6 5
1 2 3
1/76
Universidad Politcnica de MadridEscuela Tcnica Superior de Ingenieros Industriales
Mtodos Matemticos de Especialidad
Ingeniera Elctrica
Dualidad en Programacin Lineal
Mtodos de puntos interiores
Jos Luis de la Fuente OConnor
jldelafuente@etsii.upm.es
joseluis.delafuente@upm.es
Clase_dualidad_interior_12.pdf
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
2/76
ndice
Dualidad
v Interpretacin econmica de la dualidad
Dualidad y condiciones de ptimo
v Condiciones de Karush-Kuhn-Tucker
El algoritmo dual del Smplex
Mtodos de punto interior
v Formulacin del procedimiento general
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
3/76
Dualidad
Asociado a cada problema de programacin lineal primal hay
otro denominado dual. As,
min. c
T
x
s. a Ax =b
x _ 0.
tiene el dual asociado
max. 1(x. . )
s. a V
x
1(x. . ) =0
_ 0.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
4/76
Si el problema primal est formulado en forma estndar, la funcin
de Lagrange es
1(x. . ) = c
T
x
T
(Ax b)
T
x.
Su gradiente con respecto a x,
c A
T
.
El problema dual es entonces, incorporando en la f.o. que el
gradiente es cero,
max. b
T

s. a c A
T
= 0
_ 0.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
5/76
Ejemplo
min. .
1
.
2
5.
3
s. a .
1
.
3
_ 1
.
2
.
3
_ 2
.
1
. .
2
. .
3
_ 0.
En forma estndar,
min. .
1
.
2
5.
3
s. a .
1
.
3
.
4
= 1
.
2
.
3
.
5
= 2
.
1
. .
2
. .
3
. .
4
. .
5
_ 0.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
6/76
Su funcin de Lagrange es
c
T
x
T
(Ax b)
T
x.
El gradiente de esta funcin con respecto a x es
c A
T
=
_
_
_
_
_
_
1
1
5
0
0
_

_
_
_
_
_
_
1 0
0 1
1 1
1 0
0 1
_

_
_
z
1
z
2
_

_
_
_
_
_
_

5
_

_
.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
7/76
El problema dual es entonces
max. z
1
2z
2
s. a z
1

1
= 1
z
2

2
= 1
z
1
z
2

3
= 5
z
1

4
= 0
z
2

5
= 0

1
.
2
.
3
.
4
.
5
_ 0.
Expresado en forma ms compacta:
max. z
1
2z
2
s. a z
1
_ 1
z
2
_ 1
z
1
z
2
_ 5
z
1
_ 0
z
2
_ 0
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
8/76
Reorganizando las tres primeras condiciones queda:
max. z
1
2z
2
s. a z
1
_ 1
z
2
_ 1
z
1
z
2
_ 5
z
1
. z
2
_ 0.
lo que da lugar a la forma simtrica de la dualidad:
(P) min. c
T
x (D) max. b
T

s. a Ax _ b s. a A
T
_ c
x _ 0 _ 0.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
9/76
La teora de dualidad permite analizar la sensibilidad de la solucin
de los programas lineales a variaciones en la conguracin de los
parmetros que los denen:
De qu forma habr que modicar nuestra cadena de
produccin los prximos seis meses si el benecio de nuestro
producto estrella cae un 20 %?
O, dada nuestra disponibilidad de recursos, qu benecio o
cuntas unidades deberamos vender de un nuevo producto para
hacerlo rentable?
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
10/76
Ejemplo
Una empresario quiere vender b
1
. b
2
. . . . . b
m
cantidades de m
productos.
Para ello se pone en contacto con un fabricante que se los puede
elaborar realizando para ello n actividades distintas en sus fbricas.
El coste (precio) unitario de cada actividad se lo ja el fabricante
al empresario en c

.
Si a
i
representa la cantidad del producto i producido por una
unidad de la actividad ,

n
=1
a
i
.

representa las unidades que


se producen de i con todas las actividades.
Estas unidades deben ser mayores o iguales que la cantidad
requerida, b
i
, de ese producto i .
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
11/76
El problema que desea resolver el empresario es el siguiente:
min.
n

=1
c

s. a
n

=1
a
i
.

_ b
i
. i = 1. 2. . . . . m.
.

_ 0 = 1. 2. . . . . n.
Supngase ahora que el empresario acuerda pagar al fabricante
precios por unidad, ,
1
. ,
2
. . . . . ,
m
, de cada uno de los m
productos ya ensamblados.
Si a
i
sigue siendo el nmero de unidades de i producidas por una
unidad de la actividad , la suma

m
i =1
a
i
,
i
es el ingreso del
fabricante por cada unidad de actividad con los precios
,
1
. ,
2
. . . . . ,
m
. Ese ingreso no debe exceder al coste real c

.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
12/76
El fabricante deber jar los niveles de produccin b
i
de cada
producto i que maximicen su ganancia

m
i =1
,
i
b
i
.
En resumen, el problema que se plantea el fabricante es el siguiente:
max.
m

i =1
,
i
b
i
s. a
m

i =1
a
i
,
i
_ c

. = 1. 2. . . . . n.
,
i
_ 0. i = 1. 2. . . . . m.
Programa dual de el del empresario:
min.
n

=1
c

s. a

n
=1
a
i
.

_ b
i
. i = 1. 2. . . . . m.
.

_ 0 = 1. 2. . . . . n.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
13/76
El Programa primal trata en este caso sobre valores
econmicos. Garantizadas unas ventas mnimas de productos
a unos precios, qu esquema concreto de produccin minimiza el
coste total, o maximiza el valor econmico de la produccin.
El Programa dual de cantidades fsicas. Con un esquema
de costes unitario dado, qu cantidades de productos producir a
unos precios conocidos para maximizar el benecio de su venta.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
14/76
Interpretacin econmica de la dualidad
Supongamos que
x
+
=
_
x
+
T
0
_
=
_
B
1
b
0
_
es una solucin ptima no degenerada del programa lineal
min. c
T
x
s. a Ax = b
x _ 0.
cuyo dual es
max. b
T
max. b
T

s. a A
T
= c s. a A
T
_ c.
_ 0
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
15/76
Al suponer x
+
T
> 0, un cambio sucientemente pequeo .b en b
no debe modicar la base ptima B; en consecuencia, si se
reemplaza b por b .b, la solucin ptima es
x
+
=
_
x
+
T
0
_
=
_
B
1
(b .b)
0
_
.
Ese cambio har variar la funcin objetivo en
.: = c
T
T
B
1
.b =
+T
.b, donde
+
= B
T
c
T
es el ptimo
del vector de multiplicadores simplex:
z
+
i
indica cmo cambia la funcin objetivo al incrementar una
unidad la cantidad disponible del recurso b
i
. Su valor es un
precio o valor marginal del recurso i -simo en el ptimo del
problema: la cantidad mxima que se puede estar dispuesto
a pagar por incrementar la disponibilidad del recurso i -
simo.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
16/76
ndice
Dualidad
v Interpretacin econmica de la dualidad
Dualidad y condiciones de ptimo
v Condiciones de Karush-Kuhn-Tucker
El algoritmo dual del Smplex
Mtodos de punto interior
v Formulacin del procedimiento general
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
17/76
Dualidad y condiciones de ptimo
Lema Dualidad dbil Si x es una solucin factible del
problema primal e y una tambin factible del dual,
b
T
y _ c
T
x.
El valor de la funcin objetivo de una solucin factible del primal
(dual) proporciona un lmite superior (inferior) del valor de la
funcin objetivo de cualquier solucin factible del dual (primal).
Corolario Si x es una solucin factible del problema
primal, y una tambin factible del dual y c
T
x = b
T
y,
entonces x e y son las soluciones ptimas del primal y
dual, respectivamente.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
18/76
Teorema Teorema de la dualidad de la programacin
lineal
(a) Si el problema primal o el dual tiene una solucin
ptima nita la tiene el otro y mn c
T
x = m ax b
T
y.
(b) Si el problema primal o el dual tiene una funcin
objetivo no acotada el otro no tiene solucin factible.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
19/76
Condiciones de Karush-Kuhn-Tucker
Teorema Condiciones de Karush-Kuhn-Tucker x es el
ptimo del problema
min. c
T
x
s. a Ax = b
x _ 0.
si y slo si existen vectores y , ptimos del proble-
ma dual, tales que
(i) Ax = b. x _ 0.
(ii) A
T
c = 0. _ 0. y
(iii)
i
.
i
= 0. i = 1. . . . . n.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
20/76
ndice
Dualidad
v Interpretacin econmica de la dualidad
Dualidad y condiciones de ptimo
v Condiciones de Karush-Kuhn-Tucker
El algoritmo dual del Smplex
Mtodos de punto interior
v Formulacin del procedimiento general
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
21/76
El algoritmo dual del Smplex
Fue diseado por Lemke y Beale, en 1954, para cuando se tiene una
solucin bsica no factible de un programa lineal y, sin embargo, los
costes reducidos de las variables no bsicas son todos ptimos,
(_ 0): los multiplicadores simplex son factibles en el programa dual.
Esto es frecuente en problemas de reoptimizacin si se aade, por
ejemplo, una nueva condicin de desigualdad y no se cumple.
La base ptima del problema original y la nueva variable de
holgura que se introduzca constituirn la nueva base de partida
del problema.
Esta nueva base es ptima pero no factible pues la nueva
variable de holgura es igual al negativo de lo que no se satisface
la nueva restriccin.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
22/76
El mtodo dual del Smplex, como el primal, progresa, de iteracin
en iteracin, de una base a otra del problema, manteniendo la
factibilidad del programa dual, aplicando las condiciones de ptimo
de Karush-Kuhn-Tucker hasta que se llegue a una base factible en
el primal y dual simultneamente.
Se comienza desde un punto en el que se satisfacen las condiciones
de ptimo en el dual costes reducidos no negativos, pero no las
del primal pues alguna variable en la base es negativa.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
23/76
Si la variable x
T
]
=
_
B
1
b
_
]
< 0, 1 _ ] _ m, ] ser la la de
pivotacin y aquella variable la que sale de la base.
De acuerdo con x
T
= B
1
b B
1
Nx
N
se tendr que
.
T
]
=
_
B
1
b
_
]

]

. V N.
donde
]

es el coeciente de la la ] del vector columna


_
B
1
N
_

, con N.
Como
_
B
1
b
_
]
< 0, si hay algn
]

< 0, N, es decir, en el
vector la ]-simo de T
1
N, la variable no bsica podra
incrementar su valor (.

en la expresin anterior) desde cero,


reemplazando as en la base a .
T
]
, que pasara a ser cero.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
24/76
El nuevo valor de la variable no bsica .

sera
_
B
1
b
_
]

> 0.
No todas las variables no bsicas son candidatas para entrar en la
base pues se han de cumplir las condiciones de factibilidad del dual
(ptimas del primal) en trminos de costes reducidos. Si .

es la
que entra, los nuevos costes reducidos, c
i
, en funcin de los
antiguos, c
i
, saldrn de esta frmula:
c
l
= c
l
c

]
l

. l = 1. . . . . n ( c
l
= 0 si l = ).
Como todos los costes reducidos han de ser no negativos, la
relacin [ c

,
]

[ que sea menor, con


]

< 0, determina el coste


reducido que antes alcanza cero y, por lo tanto, la variable .
q
que
entra en la base.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
25/76
Paso 1 Calcular el vector de multiplicadores simplex resolviendo el sistema
B
T
= c
T
. Determinar los costes reducidos de las variables no bsicas: c

= c


T
a

, para
todo N.
Paso 1 Comprobar la factibilidad del programa primal: Si x
T
_ 0, parar; la solucin es ptima.
Si no, continuar.
Paso 2 Determinar la variable bsica .

p
que debe salir de la base: Escoger
]
{
i
B :
.

i
< 0].
Paso 3 Comprobar la no factibilidad del problema: Calcular u resolviendo el sistema B
T
u = e
]
y hacer

= u
T
a

, para todo N. Si

_ 0 para todo N, parar; el problema no


tiene solucin.
Paso 4 Determinar la variable no bsica .
q
que ha de entrar en la base: Calcular (para que sus
costes reducidos sigan siendo de ptimo en todas menos en la q que pasar a 0)

c
q

q
= mn
_

< 0. N
_
= ;.
Paso 5 Recalcular costes reducidos: Hacer c

, N, ,= q y c
]
;.
Paso 6 Adaptar la solucin y la matriz B: Calcular w resolviendo Bw = a
q
y hacer
.
q
0 = .

p
,
q
.

i
.

i
0n
i
. 1 _ i _ m. i ,= ]
T T (a
q
a

p
)e
T
]
B B L {q]\{
]
]
N N L {
]
]\{q]

]
q.
Ir al paso 1.
Algoritmo dual del Smplex
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
26/76
function [x fobj pi sN iter B N Binv] = dual_simplex(c,A,b,eps1,B0)
% Resuelve Max cx subject to Ax = b, x >= 0 mediante Simplex Dual. B0 base de partida.
[m,n]=size(A); c=c(:); b=b(:);
% Paso 0: Inicializar B, N, x_B y s_N -1 -T
B = B0; N = setdiff(1:n,B); % x =B b, lambda=B c
xB=A(:,B)\b; x=zeros(n,1); x(B)=xB; % B T B
y = A(:,B)\c(B); sN = c(N)-A(:,N)*y; % c =c -N lambda
% N N
iter = 0; disp(It. Sale B Entra B Pinf Ninf Cr-inf);
while 1 == 1 % Proceso iterativo
% Pasos 1 y 2: Comprobar optimalidad; si no, ha de dejar la base x_{B(i)}
[xBmin i] = min(xB); % Valor ms negativo xb
if xBmin >= -eps1 % No hay no factibles, final
fobj=c*x; Binv=inv(A(:,B)); pi=Binv*c(B); return, end
% Paso 3 y 4: Ver no facti. y la variable no bsica que entra, x_{N(j)}
e = zeros(m,1); e(i) = 1; % Negativos en vector T -T
v = A(:,B)\e; % w = N B e
w = A(:,N)*v; % i
zz = find(w<-eps1);
if isempty(zz), error(Problema no factible), end
[t ii] = min(-sN(zz)./w(zz)); % Coste reducido relacin con w menor
j = zz(ii); % Entra no bsica j
% Paso 5: Recalcular costes reducidos: la j la rel. menor; dems=ant.+t*w
sN = sN + t*w; sN(j) = t;
% Paso 6: Adaptar solucin, xB, y datos -1 -1 -1
d = A(:,B)\A(:,N(j)); % x =B b-B N (B b/w(j))
temp = B(i); B(i) = N(j); N(j) = temp; % B j
theta=xB(i)/w(j); xB=xB-theta*d; xB(i)=theta; x=zeros(n,1); x(B)=xB;
iter = iter + 1;
fprintf(%3d%6d%7d %14.6f %3d %6d\n,iter,temp,B(i),...
sum(x(x<0)),sum(x<0),sum(sN<0));
end
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
27/76
Ejemplo
Consideremos el siguiente problema:
min. 5.
1
.
2
12.
3
s. a 3.
1
2.
2
.
3
= 10
5.
1
3.
2
.
4
= 16
.
1
. .
2
. .
3
. .
4
_ 0.
Resolvmoslo mediante ProgLineal_3():
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
28/76
>> c=[-5 -1 12 0];
A=[3 2 1 0;5 3 0 1];
b=[10;16];
B=[3 4];
>> [sol fobj pi cr it B N]=ProgLineal_3(c,A,b,eps,B)
It. Sale B Entra B Cos. red. fobj
1 4 1 -41.000000 40.000000
2 3 2 -0.400000 -16.400000
sol =
2
2
0
0
fobj =
-12
pi =
10.0000
-7.0000
cr =
7.0000 2.0000
it =
2
B =
2 1
N =
4 3
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
29/76
Ahora, aadimos una nueva columna al problema, de tal forma que
quede:
min. 5.
1
.
2
12.
3
.
5
s. a 3.
1
2.
2
.
3
.
5
= 10
5.
1
3.
2
.
4
.
5
= 16
.
1
. .
2
. .
3
. .
4
. .
5
_ 0.
Lo podemos volver a resolver mediante ProgLineal_3():
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
30/76
>> c1=[c -1];
>> B1=[1 2];
>> A1=[A [1 1]];
>> [sol fobj pi cr it B N]=ProgLineal_3(c1,A1,b,eps,B1)
It. Sale B Entra B Cre. fobj
1 2 5 -4.000000 -12.000000
sol =
3.0000
0
0
0
1.0000
fobj =
-16
pi =
0 -1
cr =
12 1 2
it =
1
B =
1 5
N =
3 4 2
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
31/76
Aadamos ahora una inecuacin y una columna al problema
original:
min. 5.
1
.
2
12.
3
s. a 3.
1
2.
2
.
3
= 10
5.
1
3.
2
.
4
= 16
.
1
.
2
.
5
= 5
.
1
. .
2
. .
3
. .
4
. .
5
_ 0.
Una solucin de partida puede ser la del problema original
2 2 0 0|
T
, con un nuevo coeciente que verique la nueva
condicin; es decir,
_
_
_
_
_
_
2
2
0
0
1
_

_
.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
32/76
Como esta solucin no es factible del primal, pero la base es ptima
en el primal, reoptimizamos con dual_simplex():
>> c2 = [c 0];
>> b2 = [b; 5];
>> B2=[1 2 5];
>> A2=[A [0;0]; 1 1 0 0 -1]
A2 =
3 2 1 0 0
5 3 0 1 0
1 1 0 0 -1
>> [x fobj pi cr it B N]=dual_simplex(c2,A2,...
b2,sqrt(eps),B2)
It. Sale B Entra B Pinf Ninf
1 5 4 -0.000000 1
x =
-0.0000
5.0000
0
1.0000
0
fobj =
-5.0000
pi =
-4.0000
0.0000
7.0000
cr =
16.0000
7.0000
it =
1
B =
1 2 4
N =
3 5
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
33/76
Efectuemos ahora un cambio en el trmino de la derecha:
min. 5.
1
.
2
12.
3
s. a 3.
1
2.
2
.
3
= 11
5.
1
3.
2
.
4
= 16
.
1
. .
2
. .
3
. .
4
_ 0.
Reoptimizamos tambin mediante dual_simplex() pues habr
una no factibilidad en el primal:
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
34/76
>> b3=[11;16];
>> B3=[1 2];
>> [x fobj pi cr iter B N Binv]=dual_simplex(c,A,b3,eps,B3)
It. Sale B Entra B Pinf Ninf
1 1 3 0.000000 0
x =
0
5.3333
0.3333
0
fobj =
-1.3333
pi =
12.0000
-8.3333
cr =
0.6667
8.3333
iter =
1
B =
3 2
N =
1 4
Binv =
1.0000 -0.6667
0 0.3333
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
35/76
Por ltimo, vamos a estudiar un cambio en la funcin objetivo: el
coeciente de .
3
pasa de ser 12 a 9.
min. 5.
1
.
2
9.
3
s. a 3.
1
2.
2
.
3
= 10
5.
1
3.
2
.
4
= 16
.
1
. .
2
. .
3
. .
4
_ 0.
Volvemos a reoptimizar con ProgLineal_3():
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
36/76
>> c4=[-5 -1 9 0];
>> B4=[1 2];
>> [sol fobj pi cr it B N]=ProgLineal_3(c4,A,b,sqrt(eps),B4)
It. Sale B Entra B Cos. red. fobj
1 2 3 -1.000000 8.000000
sol =
3.2000
0
0.4000
0
fobj =
-12.4000
pi =
9.0000
-6.4000
cr =
0.2000 6.4000
it =
1
B =
1 3
N =
2 4
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
37/76
El problema de la dieta (otra vez)
Era el que resume la tabla que sigue.
C
a
r
n
e
H
a
r
i
n
a
d
e
s
o
j
a
S
o
j
a
e
n
g
r
a
n
o
M
i
n
e
r
a
l
e
s
S
a
l
A
l
f
a
l
f
a
V
i
t
a
m
i
n
a
s
F
a
c
t
o
r
d
e
c
r
e
c
i
m
i
e
n
t
o
P
e
s
c
a
d
o
Funcin objetivo 5,80 2,63 3,08 1,13 1,00 2,26 35,72 6,00 7,00
Cantidad total 1 1 1 1 1 1 1 1 1 = 100
Alfalfa 1 _ 1
Vitaminas 1 _ 1,1
Factor de crecimiento 1 _ 5
Pescado 1 _ 5
Protenas 0,55 0,450 0,500 0,17 0,25 0,25 0,63 _ 43
Riboavina 0,26 0,130 0,120 0,70 41,6 2 0,20 _ 70
Niacina 0,23 0,090 0,045 0,14 20,4 0,4 0,25 _ 45
cido pantotnico 0,20 0,055 0,060 0,14 9 0,4 0,04 _ 16
Fsforo 0,40 0,065 0,060 0,26 0,02 0,1 0,05 0,30 _ 14
Calcio 0,80 0,025 0,020 3 0,15 0,05 0,05 0,50 _ 35
Sal 1 0,10 0,9 10 _ 19
Sal 2 0,10 0,9 10 _ 24
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
38/76
Si introducimos las variables de holgura adecuadas y no queremos
utilizar la Fase I, para resolverlo se podra aplicar el mtodo dual
del Smplex aadiendo una variable articial a la condicin de
igualdad e introducindola en la funcin objetivo con una gran
penalizacin. La matriz de condiciones quedara:
1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1
0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0
0.55 0.45 0.5 0 0 0.17 0.25 0.25 0.63 0 0 0 0 1 0 0 0 0 0 0 0 0
0.26 0.13 0.12 0 0 0.7 41.6 2 0.2 0 0 0 0 0 1 0 0 0 0 0 0 0
0.23 0.09 0.045 0 0 0.14 20.4 0.4 0.25 0 0 0 0 0 0 1 0 0 0 0 0 0
0.2 0.055 0.06 0 0 0.14 9 0.4 0.04 0 0 0 0 0 0 0 1 0 0 0 0 0
0.4 0.065 0.06 0.26 0 0.02 0.1 0.05 0.3 0 0 0 0 0 0 0 0 1 0 0 0 0
0.8 0.025 0.02 3 0 0.15 0.05 0.05 0.5 0 0 0 0 0 0 0 0 0 1 0 0 0
0.1 0 0 0.9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
0.1 0 0 0.9 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0
Si denimos como base de partida las columnas 10 a 22, tendremos
una solucin no factible pero con costes reducidos ptimos:
Apliquemos pues el algoritmo Smplex dual.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
39/76
>> load vitaminas-dual
>> B0
B0 =
10 11 12 13 14 15 16 17 18 19 20 21 22
>> bv
bv =
100.0000
1.0000
1.1000
5.0000
5.0000
43.0000
70.0000
45.0000
16.0000
14.0000
35.0000
19.0000
24.0000
>> cv
cv =
1.0e+003 *
Columns 1 through 8
0.0058 0.0026 0.0031 0.0011 0.0010 0.0023 0.0357 0.0060
Columns 9 through 16
0.0070 0 0 0 0 0 0 0
Columns 17 through 22
0 0 0 0 0 1.0000
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
40/76
>> [x fobj pi cr iter B N ]=dual_simplex(cv,Avf,bv,...
sqrt(eps),B0)
It. Sale B Entra B Pinf Ninf
1 15 3 -556.516667 8
2 22 2 -6057.100000 9
3 3 6 -121.100000 9
4 16 15 -889.600000 7
5 2 7 -86.908193 6
6 14 2 -68.423548 5
7 19 4 -49.470279 6
8 10 3 -24.806534 4
9 20 5 -15.791616 3
10 18 1 -12.295514 3
11 12 8 -5.000000 1
12 13 9 0.000000 0
x =
15.9679
58.4301
5.9138
5.8891
1.2103
1.0000
1.5889
5.0000
5.0000
0
0.4889
0
0
0
20.2534
0
7.4017
0
0
0
5.0000
0
fobj =
396.3783
pi =
-2.7032
2.6566
0
5.0568
0.9198
10.9772
-0.0000
1.7305
0
3.3186
0.8790
0.3703
0
cr =
1.0e+003 *
0.0033
1.0027
0.0017
0.0009
0.0004
0.0027
0.0110
0.0051
0.0009
iter =
12
B =
3 11 8 9 2 6 15 17 1 4 5 21 7
N =
18 22 16 19 20 10 14 12 13
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
41/76
Para dotarnos de ms medios sencillos para resolver problemas de
programacin lineal se ha desarrollado el programa
PL_pd_simplex_1.
Analiza el problema que puede leerse con varios formatos y lo
transforma en forma estndar, si es el caso.
Calcula una solucin cualquiera del sistema de ecuaciones de las
condiciones mediante el operador \ de Matlab.
Resuelve el problema de optimizacin mediante el mtodo primal
o dual segn esa solucin sea factible o no.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
42/76
function [sol fobj pi cr iter B N Binv] = PL_pd_simplex_1(c,A,b,base,file)
% Resuelve un problema de Programacin Lineal
% T
% Min c x subject to Ax = b, x >= 0
% mediante los programas ProgLineal_3 o dual_simplex segn la base de partida
% sea factible o no. Se puede dar la base o no.
% Rutina asociada a Sensitivity_ProgLineal_3 a la que puede enviar datos.
if nargin==5 % Lectura de los datos desde fichero file en MPS
eval([!copy file d:\matlab_2009a\work\tmp\in.mps]);
LIPSO = D:\matlab_2009a\work; exit=mps2mat(LIPSO); fprintf(\n);
load D:\matlab_2009a\work\tmp\default; [m n]=size(A); c=c(:); A=full(A);
A=[A(:,n0+1:n) A(:,1:n0)]; c=[c(n0+1:n);c(1:n0)]; % Mover slacks al final de A
end
save PL_dat A b c % Guardar datos relevantes para Sensitivity
eps1=eps^(2/3); [m n]=size(A); c=c(:);
if isempty(base)
xB=A\b; base=find(abs(xB)>0); nx=length(base);
if nx<m
bp = setdiff(1:n,base); base=[base;bp(1:m-nx)]; end % Por si algn x=0
xB=xB(base);
else xB=A(:,base)\b; end
B = base; N = setdiff(1:n,B);
x=zeros(n,1); x(B)=xB;
y = A(:,B)\c(B); sN = c(N)-A(:,N)*y;
if (any(x(B)<0))
if any(sN<-eps1);
A = [A eye(m)]; c = [c; max(max(abs(A)))*100*ones(m,1)]; B=n+1:n+m;
fprintf(Primal-bigM\n);
bm=find(b<0);
if ~isempty(bm)
bl=length(bm); for i=1:bl, A(bm(i),n+bm(i))=-1; end, end
[sol fobj pi cr iter B N Binv] = ProgLineal_3(c,A,b,eps1,B);
NN=N<=n; N=N(NN); cr=cr(NN);
save PL_dat -append sol fobj pi cr iter B N Binv
return, end
fprintf(Dual\n);
[sol fobj pi cr iter B N Binv] = dual_simplex(c,A,b,eps1,B);
save PL_dat -append sol fobj pi cr iter B N Binv
else fprintf(Primal\n);
[sol fobj pi cr iter B N Binv] = ProgLineal_3(c,A,b,eps1,B);
save PL_dat -append sol fobj pi cr iter B N Binv
end
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
43/76
Dieta: con
PL_pd_simplex no es
necesario aquella
variable articial:
>> load vitaminas
>> Av_d=full(Av);
>> [sol fobj pi cr iter B N]=...
PL_pd_simplex(cv,Av_d,bv)
Dual
It. Sale B Entra B Pinf Ninf
1 16 19 -1579.781993 4
2 3 15 -43.883180 2
3 14 2 -34.832613 2
4 19 21 -92.210155 3
5 20 3 -4.839145 1
6 18 1 0.000000 0
sol =
15.9679
58.4301
5.9138
5.8891
1.2103
1.0000
1.5889
5.0000
5.0000
0
0.4889
0
0
0
20.2534
0
7.4017
0
0
0
5.0000
fobj =
396.3783
pi =
-2.7032
2.6566
0
5.0568
0.9198
10.9772
0
1.7305
0
3.3186
0.8790
0.3703
0
cr =
3.3186
10.9772
2.6566
5.0568
0.9198
0.3703
1.7305
0.8790
iter =
6
B =
15
4
5
6
7
8
9
11
2
21
17
1
3
N =
18 14 10 12 13 20 16 19
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
44/76
Formato MPS (Mathematical Programming System), originalmente
de IBM.
NAME Vitaminas
ROWS
N OBJETIVO
E CAN.TOT.
G ALFALFA
G VITAMINA
G FAC.CRE.
G PESCADO
G PROTEINA
G RIBOFLA.
G NIACINA
G ACI.PAN.
G FOSFORO
G CALCIO
G SAL1
L SAL2
COLUMNS
CARNE OBJETIVO 5.8 CAN.TOT. 1.0
CARNE PROTEINA 0.55 RIBOFLA. 0.26
CARNE NIACINA 0.23 ACI.PAN. 0.02
CARNE FOSFORO 0.4 CALCIO 0.8
CARNE SAL1 0.1 SAL2 0.1
PESCADO OBJETIVO 7.0 CAN.TOT. 1.0
PESCADO PESCADO 1.0 PROTEINA 0.63
PESCADO RIBOFLA. 0.2 NIACINA 0.25
PESCADO ACI.PAN. 0.04 FOSFORO 0.3
PESCADO CALCIO 0.5
SOJA-HAR OBJETIVO 2.63 CAN.TOT. 1.0
SOJA-HAR PROTEINA 0.45 RIBOFLA. 0.13
SOJA-HAR NIACINA 0.09 ACI.PAN. 0.055
SOJA-HAR FOSFORO 0.065 CALCIO 0.025
SOJA-GRA OBJETIVO 3.08 CAN.TOT. 1.0
SOJA-GRA PROTEINA 0.5 RIBOFLA. 0.12
SOJA-GRA NIACINA 0.045 ACI.PAN. 0.06
SOJA-GRA FOSFORO 0.06 CALCIO 0.02
MINERAL. OBJETIVO 1.13 CAN.TOT. 1.0
MINERAL. FOSFORO 0.26 CALCIO 3.0
MINERAL. SAL1 0.9 SAL2 0.9
SAL OBJETIVO 1.0 CAN.TOT. 1.0
SAL SAL1 10.0 SAL2 10.0
ALFALFA OBJETIVO 2.26 CAN.TOT. 1.0
ALFALFA ALFALFA 1.0 PROTEINA 0.17
ALFALFA RIBOFLA. 0.7 NIACINA 0.14
ALFALFA ACI.PAN. 0.14 FOSFORO 0.02
ALFALFA CALCIO 0.15
VITAMINA OBJETIVO 35.72 CAN.TOT. 1.0
VITAMINA VITAMINA 1.0 PROTEINA 0.25
VITAMINA RIBOFLA. 41.6 NIACINA 20.4
VITAMINA ACI.PAN. 9.0 FOSFORO 0.1
VITAMINA CALCIO 0.05
FAC.CRE. OBJETIVO 6.0 CAN.TOT. 1.0
FAC.CRE. FAC.CRE. 1.0 PROTEINA 0.25
FAC.CRE. RIBOFLA. 2.0 NIACINA 0.4
FAC.CRE. ACI.PAN. 0.4 FOSFORO 0.05
FAC.CRE. CALCIO 0.05
RHS
RHS2 CAN.TOT. 100.0
RHS2 ALFALFA 1.0
RHS2 VITAMINA 1.1
RHS2 FAC.CRE. 5.0
RHS2 PESCADO 5.0
RHS2 PROTEINA 43.0
RHS2 RIBOFLA. 70.0
RHS2 NIACINA 45.0
RHS2 ACI.PAN. 16.0
RHS2 FOSFORO 14.0
RHS2 CALCIO 35.0
RHS2 SAL1 19.0
RHS2 SAL2 24.0
ENDATA
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
45/76
Cargando el problema de la Dieta desde su chero MPS, con
PL_pd_simplex:
>> [sol fobj pi cr iter]= PL_pd_simplex_1([],[],[],[],VITAM_dc.mps)
El sistema no puede encontrar el archivo especificado.
NAME done ROWS done COLUMNS done RHS done RANGES done BOUNDS done reading done mps2mat doneSTATUS = 0
Primal-bigM
It. Sale B Entra B Cos. red. fobj
1 24 8 -305308.280000 1568359.292000
2 28 11 -301148.280000 1136218.492000
3 33 6 -87359.000000 982559.105769
4 32 5 -17346.160000 750387.460697
5 26 2 -11962.734981 672947.609936
6 23 7 -7879.097766 629741.195032
7 31 13 -7802.734981 586419.693933
8 27 18 -26294.839954 269939.908699
9 5 14 -6553.956082 165687.133822
10 29 19 -9507.714478 155691.598701
11 22 16 -27116.168354 46733.747778
12 34 20 -4161.952696 26430.237043
13 11 9 -4039.257391 26421.117043
14 16 24 -88742.920000 24048.972000
15 25 15 -3586.495609 6676.399405
16 24 16 -2054.832754 6197.532417
17 30 11 -37244.880000 707.452000
18 16 5 -5.213325 711.897493
19 6 17 -77.295278 601.676937
20 14 10 -4.583216 570.822739
21 19 6 -8.036120 645.578439
22 18 3 -2.244385 559.192981
23 10 14 -3.736203 442.335161
24 14 1 -2.737159 445.641272
25 13 18 -3.977266 403.209734
26 20 21 -0.550016 400.494998
27 18 4 -0.231097 399.013320
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
46/76
sol =
15.9679
5.0000
58.4301
5.9138
5.8891
1.2103
1.0000
1.5889
5.0000
0
0.4889
0
0
0
20.2534
0
4.5275
0
0
0
5.0000
0
0
0
0
0
0
0
0
0
0
0
0
0
fobj =
396.3783
pi =
Columns 1 through 10
-2.7032 2.6566 0 5.0568 0.9198 10.9772 -0.0000 1.7305 0 3.3186
Columns 11 through 13
0.8790 0.3703 0
cr =
10.9772 0.9198 3.3186 2.6566 5.0568 1.7305 0.8790 0.3703
iter =
27
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
47/76
Con Linprog de Matlab, una sesin sera como sigue.
>> lb=zeros(1,21);
>> options = optimset(LargeScale, off, Simplex, on, Display, Iter)
>> [x,fval,exitflag,output,lambda]=linprog(cv,[],[],Av_d,bv,lb,[],[],options)
Phase 1: Compute initial basic feasible point.
Iter Infeasibility
0 378.1
1 297.36
2 255.173
3 215.273
4 166.74
5 152.354
6 150.459
7 80.7105
8 39.7026
9 37.6039
10 35.2884
11 11.1807
12 6.17907
13 3.78533
14 0.34
15 -0
Phase 2: Minimize using simplex.
Iter Objective Dual Infeasibility
f*x A*y+z-w-f
0 708.542 9.77527
1 602.242 77.2953
2 570.823 7.28754
3 567.359 8.73213
4 548.379 3.1832
5 442.335 5.6131
6 436.35 3.29995
7 403.21 4.08198
8 400.495 0.596593
9 397.745 0.231097
10 396.378 0
Optimization terminated.
x =
15.9679
58.4301
5.9138
5.8891
1.2103
1.0000
1.5889
5.0000
5.0000
0
0.4889
0
0
0
20.2534
0
7.4017
0
-0.0000
0
5.0000
fval =
396.3783
exitflag =
1
output =
iterations: 10
algorithm: medium scale: simplex
cgiterations: []
message: Optimization terminated.
lambda =
ineqlin: [0x1 double]
eqlin: [13x1 double]
upper: [21x1 double]
lower: [21x1 double]
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
48/76
Si se quiere obtener ms informacin de la solucin:
>> lambda.eqlin
ans =
2.7032
-2.6566
0
-5.0568
-0.9198
-10.9772
0
-1.7305
0
-3.3186
-0.8790
-0.3703
0
>> lambda.lower
ans =
0
0
0
0
0
0
0
0
0
2.6566
0
5.0568
0.9198
10.9772
0
1.7305
0
3.3186
0.8790
0.3703
0
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
49/76
Con el programa Rsimplex_1 anterior:
>> [fobj niters x] = Rsimplex_1(VITAM_dc.mps)
1 archivo(s) copiado(s).
NAME done ROWS done COLUMNS done RHS done RANGES done BOUNDS done reading done mps2mat
[m n]=[13 21]. Tiempo CPU: 0.0624; fun. obj.= 3.9638e+002
fobj =
3.963782645622545e+002
niters =
40
x =
0
0.488850287055962
0
0
0
20.253399923625853
0.000000000000000
4.527491511787425
0
0
0
5.000000000000000
15.967948585632787
5.000000000000000
58.430071834554020
5.913766761177310
5.889057162017851
1.210305369562065
1.000000000000000
1.588850287055962
5.000000000000000
>>
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
50/76
ndice
Dualidad
v Interpretacin econmica de la dualidad
Dualidad y condiciones de ptimo
v Condiciones de Karush-Kuhn-Tucker
El algoritmo dual del Smplex
Mtodos de punto interior
v Formulacin del procedimiento general
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
51/76
Mtodos de punto interior
Estos mtodos se estn desarrollado espectacularmente en los
ltimos veinte aos a raz de la publicacin en 1984 de un famoso e
innovador paper por el indio Narendra Karmarkar, entonces en los
laboratorios Bell de EE.UU.
Basan su estrategia en la bsqueda del ptimo a travs de caminos
que recorren la zona interior de la regin factible; de ah su nombre.
Los ms ecientes aplican el mtodo de Newton y diversas mejoras,
en sucesivas etapas, al sistema de ecuaciones que resulta de aplicar
las condiciones de ptimo KKT a los problemas primal y dual del
problema que se resuelve.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
52/76
Formulacin del procedimiento general
Consideremos el problema primal ms general de programacin
lineal,
minimizar c
T
x
sujeta a Ax = b
0 _ x _ u,
donde c. x. u R
n
. b R
m
y A R
mn
.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
53/76
El dual de ese problema es
max. 1(x. y. z. w)
s. a V
x
1(x. y. z. w) = 0
z. w _ 0.
siendo su funcin de Lagrange
1(x. y. z. w) = c
T
x y
T
(Ax b) w
T
(u x) z
T
x.
El gradiente de esta funcin con respecto a x es
c A
T
y w z.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
54/76
El dual es pues
maximizar y
T
b w
T
u
sujeta a A
T
ywzc = 0
w _ 0. z _ 0
donde y R
m
. w R
n
. z R
n
.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
55/76
Las condiciones de Karush-Kuhn-Tucker (KKT) del
problema primal y dual, introduciendo el vector de variables de
holgura s, son
A
T
y w z c = 0
Ax = b
x s = u
.
i
:
i
= 0. i = 1. . . . . n
s
i
n
i
= 0. i = 1. . . . . n
x. z. s. w _ 0.
La cuarta y la quinta, no lineales, son las de complementariedad de
holguras.
Las de no negatividad de las variables son las que complican
sobremanera estos mtodos.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
56/76
El ptimo, o solucin del problema, se puede obtener si se resuelve
este sistema de ecuaciones no lineales.
Para resolver las condiciones KKT se podra recurrir a cualquier
mtodo para sistemas de ecuaciones no lineales, el de Newton por
ejemplo, si se partiese de un punto que cumpliese estrictamente las
condiciones de no negatividad de las variables.
Ojo, hay que tener ciertas precauciones, sin embargo. Si por
ejemplo la ecuacin sw = 0 se linealiza como se hace en
Newton, se tiene que sws^ww^s = 0.
Si una variable, digamos n
i
, es cero, la ecuacin de Newton
queda s
i
^n
i
= 0, por lo que el paso ^n
i
= 0.
Desde ese momento esa variable quedara bloqueada en cero en
todo el proceso, lo que es muy perjudicial para el algoritmo pues
ste no podra recuperarla para contribuir a mejorar el camino al
ptimo.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
57/76
Es crucial pues mantener todas las variables estrictamente positivas
aunque sea poco. Es ms, es importante que todas las condiciones
de complementariedad del tipo s
i
n
i
converjan a cero al mismo
ritmo:
s
k
i
n
k
i
= j
k
0 cuando k o.
Con ese objetivo los algoritmos de punto interior, en algn
momento, modican cada condicin s
i
n
i
a s
i
n
i
j = 0 para
centrar la trayectoria a seguir en el proceso. Consecuentemente se
ha de controlar cmo j tiende a cero en el avance del proceso. En
cada punto es comn hacer
j
k
= o
k
g. con g =
x
T
z s
T
w
2n
,
denominada brecha dual y o
k
(0. 1).
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
58/76
En cada etapa de un proceso iterativo, los mtodos de punto
interior resuelven ligeras variantes del sistema no lineal KKT:
f (x. y. z. s. w)
x.z.s.w>0

_
A
T
y z w = c
Ax = b
x s = u
XZ = je
W S = je
donde X, S, Z y W son matrices diagonales con coecientes .

,
s

, :

y n

, respectivamente, y e es el vector de coecientes 1.


Los puntos del proceso iterativo que se obtienen en esta resolucin
determinan el camino, senda o trayectoria central, si j = 0, hacia
el ptimo.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
59/76
A este moderno planteamiento se llega de un forma ms tradicional
si al problema original se incorporan las condiciones de no
negatividad de las variables x
i
y s
i
por uno trmino en la funcin
objetivo que se haga muy grande cuando esas variables tomen
valores negativos su logaritmo, por ejemplo, el problema sera:
minimizar c
T
x j
_
_
n

=1
log .

=1
log s

_
_
sujeta a Ax = b
x s = u.
Problema denominado barrera del primal, para un escalar j.
Su funcin de Lagrange es, simplicando la notacin,
c
T
x jlog x jlog s y
T
(Ax b) w
T
(x s u) .
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
60/76
Las condiciones KKT de este problema son
Ax = b
A
T
y z wc = 0
x s = u
XZe = je
SW e = je.
donde
z = jX
1
e. w = jS
1
e.
idnticas a las anteriormente deducidas.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
61/76
Cuando j o, las soluciones del problema barrera son el centro
analtico de la regin factible del problema primal.
Los algoritmos de punto interior calculan una solucin aproximada
de problema barrera, reducen paso a paso el parmetro j y repiten
este proceso hasta que se aproximan sucientemente a la solucin
del problema primal.
Al tender j 0, la solucin del problema barrera converge al
centro analtico del conjunto de las soluciones ptimas del
problema primal.
El camino hasta alcanzar el ptimo conforma el camino
central de la regin factible.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
62/76
1. THE BARRIER PROBLEM 279
= 8
=1
=0.01
(a) = 8
(b)
=1
(c)
=0.01
(d) camino central
FIGURE 16.1. Parts (a) through (c) show level sets of the barrier
function for three values of . For each value of , four level sets
are shown. The maximum value of the barrier function is attained
inside the innermost level set. The drawing in part (d) shows the
central path.
It is instructive to have in mind a geometric picture of the barrier function. Recall
that, for problems expressed in standard form, the set of feasible solutions is a poly-
hedron with each face being characterized by the property that one of the variables
is zero. Hence, the barrier function is minus innity on each face of the polyhedron.
Furthermore, it is nite in the interior of the polyhedron, and it approaches minus in-
nity as the boundary is approached. Figure 16.1 shows some level sets for the barrier
function for a specic problem and a few different choices of . Notice that, for each
, the maximum is attained at an interior point, and as gets closer to zero this interior
point moves closer to the optimal solution of the original linear programming problem
(which is at the top vertex). Viewed as a function of , the set of optimal solutions
to the barrier problems forms a path through the interior of the polyhedron of feasible
1. THE BARRIER PROBLEM 279
= 8
=1
=0.01
(a) = 8
(b)
=1
(c)
=0.01
(d) camino central
FIGURE 16.1. Parts (a) through (c) show level sets of the barrier
function for three values of . For each value of , four level sets
are shown. The maximum value of the barrier function is attained
inside the innermost level set. The drawing in part (d) shows the
central path.
It is instructive to have in mind a geometric picture of the barrier function. Recall
that, for problems expressed in standard form, the set of feasible solutions is a poly-
hedron with each face being characterized by the property that one of the variables
is zero. Hence, the barrier function is minus innity on each face of the polyhedron.
Furthermore, it is nite in the interior of the polyhedron, and it approaches minus in-
nity as the boundary is approached. Figure 16.1 shows some level sets for the barrier
function for a specic problem and a few different choices of . Notice that, for each
, the maximum is attained at an interior point, and as gets closer to zero this interior
point moves closer to the optimal solution of the original linear programming problem
(which is at the top vertex). Viewed as a function of , the set of optimal solutions
to the barrier problems forms a path through the interior of the polyhedron of feasible
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
63/76
Volviendo al sistema de ecuaciones f (x. y. z. s. w) = 0
modicado de la condiciones KKT, y al mtodo de Newton
para resolverlo, en cada punto del proceso iterativo se calcula un
nuevo punto del vector = x. y. z. s. w|
T
mediante la ecuacin
de recurrencia, a partir del modelo de primer orden que conocemos
f (
k
) f
/
_

k
_ _

k1

k
_
= 0.
es decir:
^v
k
= f
/
_

k
_
1
f (
k
).
siendo ^v
k
la direccin de Newton en la iteracin k y f
/
_

k
_
la
matriz jacobiana del sistema.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
64/76
La direccin de Newton de avance, ^x. ^s. ^y. ^z. ^w|
T
,
saldr de resolver la aproximacin lineal concreta del sistema dada
por
_
_
_
_
_
_
_
_
A 0 0 0 0
0 0 A
T
I I
I I 0 0 0
Z 0 0 X 0
0 W 0 0 S
_

_
_
_
_
_
_
_
_
_
^x
^s
^y
^z
^w
_

_
=
_
_
_
_
_
_
_
_
r
b
r
c
r
u
je XZe
je SW e.
_

_
donde r
b
= b Ax
r
c
= c A
T
y z w
r
u
= u x s.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
65/76
Se podra mejorar considerablemente esa direccin mediante una
aproximacin cuadrtica de f (x. y. z. s. w) = 0, es decir,

i
(v) V(v)
T
^v
1
2
^v
T
V
2
(v)^v = 0.
La matriz Hessiana de las condiciones de complementariedad sera
_
0 1
1 0
_
y las dems con coecientes cero.
La direccin de avance saldra de resolver
_
_
_
_
_
_
A 0 0 0 0
0 0 A
T
I I
I I 0 0 0
Z 0 0 X 0
0 W 0 0 S
_

_
_
_
_
_
_
_
^x
^s
^y
^z
^w
_

_
=
_
_
_
_
_
_
r
b
r
c
r
u
je XZe ^X^Ze
je SW e ^S^W e
_

_
.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
66/76
La forma clsica formulada originalmente por Mehrotra de
combinar estas dos opciones sobre qu direccin de avance seguir,
consiste en llevar a cabo dos pasos en una etapa, denominados
predictor y corrector:
Predictor: se resuelve la aproximacin lineal: la direccin de
descenso puro de Newton, o de escalado afn, con j = 0.
Corrector y centrado: para compensar la linealizacin anterior
introduciendo ms informacin de segundo orden y centrar en
torno al camino central (central path), mediante el parmetro j.
400 C H A P T E R 1 4 . I N T E R I O R - P O I N T ME T H O D S
C
central path neighborhood
Figure 14.1 Central path, projected into space of primal variables x, showing a
typical neighborhood N.
Here and in later analysis, we use the notation
(x
k
(),
k
(), s
k
())
def
(x
k
,
k
, s
k
) +(x
k
,
k
, s
k
), (14.19a)

k
()
def
x
k
()
T
s
k
()/n. (14.19b)
Algorithm 14.2 (Long-Step Path-Following).
Given ,
min
,
max
with (0, 1), 0 <
min

max
< 1,
and (x
0
,
0
, s
0
) N

( );
for k 0, 1, 2, . . .
Choose
k
[
min
,
max
];
Solve (14.10) to obtain (x
k
,
k
, s
k
);
Choose
k
as the largest value of in [0, 1] such that
(x
k
(),
k
(), s
k
()) N

( ); (14.20)
Set (x
k+1
,
k+1
, s
k+1
) (x
k
(
k
),
k
(
k
), s
k
(
k
));
end (for).
Typical behavior of the algorithm is illustrated in Figure 14.2 for the case of n 2.
The horizontal and vertical axes in this gure represent the pairwise products x
1
s
1
and x
2
s
2
,
so the central path C is the line emanating from the origin at an angle of 45

. (A point at the
origin of this illustration is a primal-dual solution if it also satises the feasibility conditions
Camino central
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
67/76
Si en la aproximacin lineal de Newton anterior se despejan
^s = u x s ^x de la 3
a
^z = X
1
(tje XZe Z^x) de la 4
a
^w = S
1
(tje SW e W r
u
W ^x) de la 5
a
el sistema se puede expresar en funcin de ^x y ^y como sigue:
_
D
1
A
T
A 0
_ _
^x
^y
_
=
_
r
c
X
1
(tje XZe) S
1
(tje SW e W r
u
)
r
b
_
.
donde D =
_
X
1
Z S
1
W
_
1
.
Todos los mtodos de punto interior resuelven un sistema como
ste, o alguna variante.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
68/76
Se puede reducir ms eliminando ^x sin ms que multiplicar el
primer subconjunto de ecuaciones por AD y sumar el segundo;
resultan las ecuaciones normales,
_
ADA
T
_
^y = r
b
AD
_
r
c
X
1
(tje XZe)
S
1
(tje SW e W r
u
)
_
.
Resolver este sistema lineal es la parte crtica del algoritmo. Como
la matriz ADA
T
es simtrica y denida positiva o semidenida
positiva, se factoriza mediante Cholesky.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
69/76
El procedimiento que sigue plasma esta parte del algoritmo. En l
r
.:
= tje XZe y r
sn
= tje SW e.
1. Formar la matriz D =
_
X
1
Z S
1
W
_
1
2. Hacer r
c
r
c
X
1
r
.:
S
1
(r
sn
W r
u
)
3. Resolver mediante Cholesky
_
ADA
T
_
^y = r
b
ADr
c
4. Calcular ^x = D(A
T
^y r
c
)
^z = X
1
(Z^x r
.:
)
^s = r
u
^x
^w = S
1
(W ^s r
sn
)
Una iteracin se completara determinando la amplitud de paso,
1
y
D
, en las direcciones predictor y corrector, adaptando j y
comprobando si se ha llegado al ptimo.
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
70/76
Dado x
0
. y
0
. z
0
. w
0
. s
0
| con x
0
. z
0
. w
0
. s
0
| > 0.
Paso 1 Calcular la direccin predictor o de escalado afn:
_
_
_
A 0 0 0 0
0 0 A
T
I I
I I 0 0 0
Z 0 0 X 0
0 W 0 0 S
_

_
_
_
_
^x
af
^s
af
^y
af
^z
af
^w
af
_

_
=
_
_
r
b
r
c
r
u
XZe
SW e
_
_
Hacer

af;P
= nf

0. 1|[x. s| ^x
af
. ^s
af
| _ 0
_
.

af;D
= nf

0. 1|[z. w| ^z
af
. ^w
af
| _ 0
_
.
j
af
=
1
2n
_
_
x
af;P
^x
_
T
_
z
af;D
^z
_

_
s
af;P
^s
_
T
_
w
af;D
^w
_
_
y
t =
_
j
af
j
_
3
.
Paso 2 Calcular la direccin corrector y centrado:
_
_
_
A 0 0 0 0
0 0 A
T
I I
I I 0 0 0
Z 0 0 X 0
0 W 0 0 S
_

_
_
_
^x
c
^s
c
^y
c
^z
c
^w
c
_
_
=
_
_
0
0
0
tje ^X
af
^Z
af
e
tje ^S
af
^W
af
e
_
_
Paso 3 Obtener la direccin de la iteracin: ^x. ^y. ^z. ^w. ^s| =
^x
a
. ^y
a
. ^z
a
. ^w
a
. ^s
a
| ^x
c
. ^y
c
. ^z
c
. ^w
c
. ^s
c
|. Hacer

max;P
= nf { 0. 1|[x. s| ^x. ^s| _ 0]

max;D
= nf { 0. 1|[z. w| ^z. ^w| _ 0]
y
P
= ;
P

max;P
.
D
= ;
D

max;D
.
Paso 4 Terminar iteracin y comprobar ptimo. Hacer x
k1
. s
k1
| = x
k
. s
k
|
1
^x. ^s| y
y
k1
. z
k1
. w
k1
| = y
k
. z
k
. w
k
|
D
^y. ^z. ^w|.
Comprobar condiciones de ptimo. Si no, seguir.
Algoritmo predictor-corrector de punto interior de Mehrotra
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
71/76
function [x y z A b c n0]=ProgLineal_InP_MPS_sc(file)
% Resuelve min cx s.t. Ax=b, x>=0, cuyo dual es max by s.t. Ay+z=c, z>=0. Interior Point.
eval([!copy file D:\MATLAB2010b\work\tmp\in.mps]); LIPSO = D:\MATLAB2010b\work;
ar=mps2mat(LIPSO); fprintf(\n); load D:\MATLAB2010b\work\tmp\default;
[m,n]=size(A); x=sqrt(n)*ones(n,1); y=zeros(m,1);
z = x; bc = 1+max(norm(b),norm(c)); t0=cputime;
p = symamd(A*A); % Reordenacin grado mnimo
fprintf(\n No fac. No fac. Brecha Error);
fprintf(\n primal dual dual relati.\n);
fprintf( Iter A*x-b A*y+z-c x*z total\n);
fprintf( ---------------------------------------------------\n);
for iter = 1:100
Rd=A*y+z-c; rrd=norm(Rd); % No factibilidad dual
Rp=A*x-b; rrp=norm(Rp); % No factibilidad priaml
Rc=x.*z; % No factibilidad complementariedad
residuo=norm([Rd;Rp;Rc])/bc;
gap=mean(Rc); % Brecha dual
fprintf(%5i %15.2e %10.2e %11.2e %10.2e\n,iter,rrd,rrp,gap,residuo);
if residuo<5.e-10, break, end
Rc=Rc-min(.1,100*gap)*gap;
d=min(5.e+15,x./z);
B=A*sparse(1:n,1:n,d)*A;
R=cholinc(sparse(B(p,p)),inf); % Cholesky incompleto
t1=x.*Rd - Rc; t2=-(Rp+A*(t1./z));
dy=zeros(m,1);
dy(p)=R\(R\t2(p)); % Resuelve sistema
dx=(x.*(A*dy)+t1)./z;
dz=-(z.*dx+Rc)./x;
tau=max(.9995,1-gap);
ap=-1/min(min(dx./x),-1); % Amplitud de paso primal
ad=-1/min(min(dz./z),-1); % Amplitud de paso dual
ap=tau*ap; ad=tau*ad;
x=x+ap*dx; z=z+ad*dz; y=y+ad*dy;
end
fprintf(Termina bien!\t[m n] = [%g %g]\tCPU = %g\n,m,n,cputime-t0);
f=c*x; fprintf(Fun. Obje.= %18.14f\n,f);
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
72/76
Resolvamos con este programa el problema de programacin lineal:
min. .
1
3.
2
s. a 2.
1
3.
2
.
3
= 6
.
1
.
2
.
4
= 1
.
1
. .
2
. .
3
. .
4
_ 0.
>> cEje1=[-1 -3 0 0];
>> AEje1=[2 3 1 0;-1 1 0 1];
>> bEje1=[6;1];
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
73/76
>> IntPointLP_1(AEje1,bEje1,cEje1)
iter 1: gap=4.00e+000, error tot. rel.=1.69e+000 obj=-8.000000e+000
iter 2: gap=1.12e+000, error tot. rel.=3.16e-001 obj=-3.714339e+000
iter 3: gap=3.00e-001, error tot. rel.=9.79e-002 obj=-4.423752e+000
iter 4: gap=6.71e-002, error tot. rel.=2.38e-002 obj=-5.315741e+000
iter 5: gap=6.74e-003, error tot. rel.=2.21e-003 obj=-5.380112e+000
iter 6: gap=6.77e-004, error tot. rel.=1.91e-004 obj=-5.398613e+000
iter 7: gap=4.62e-005, error tot. rel.=1.30e-005 obj=-5.399908e+000
iter 8: gap=2.15e-007, error tot. rel.=6.08e-008 obj=-5.400000e+000
iter 9: gap=4.68e-012, error tot. rel.=1.32e-012 obj=-5.400000e+000
Termina! [m n] = [2 4] CPU = 0.0312002
x =
0.6000
1.6000
0.0000
0.0000
y =
-0.8000
-0.6000
z =
0.0000
0.0000
0.8000
0.6000
Fun, Obj= -5.400000
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
74/76
La Dieta:
>> load vitaminas
>> Av_d=full(Av);
>> IntPointLP_1(Av_d,bv,cv)
iter 1: gap=2.10e+001, error tot. rel.=1.32e+000
obj= 2.961260e+002
iter 2: gap=1.27e+001, error tot. rel.=8.62e-001
obj= 3.454134e+002
iter 3: gap=7.00e+000, error tot. rel.=4.80e-001
obj= 3.635193e+002
iter 4: gap=2.47e+000, error tot. rel.=1.81e-001
obj= 3.884943e+002
iter 5: gap=6.83e-001, error tot. rel.=2.62e-002
obj= 4.007237e+002
iter 6: gap=1.63e-001, error tot. rel.=6.61e-003
obj= 3.974000e+002
iter 7: gap=1.93e-002, error tot. rel.=6.62e-004
obj= 3.965177e+002
iter 8: gap=1.94e-003, error tot. rel.=6.04e-005
obj= 3.963934e+002
iter 9: gap=1.95e-004, error tot. rel.=6.06e-006
obj= 3.963798e+002
iter 10: gap=3.83e-006, error tot. rel.=1.19e-007
obj= 3.963783e+002
iter 11: gap=1.49e-009, error tot. rel.=4.62e-011
obj= 3.963783e+002
Termina! [m n] = [13 21] CPU = 0.109201
x =
15.967948585969863
58.430071825246408
5.913766767060357
5.889057162222607
1.210305369941197
1.000000000555506
1.588850287092843
5.000000000293239
5.000000001617829
0.000000000555506
0.488850287092842
0.000000000293247
0.000000001617851
0.000000000134912
20.253399926042366
0.000000000856644
7.401722257701704
0.000000000450807
0.000000001677626
0.000000004009333
4.999999995990669
y =
-2.703193632507613
2.656560069064640
0.000000003039794
5.056784405320645
0.919806312736561
10.977248484804672
0.000000000073392
1.730542784359990
0.000000000200754
3.318574196209014
0.879025638141999
0.370319363423242
-0.000000000295456
z =
0.000000000093028
0.000000000025392
0.000000000252844
0.000000000252264
0.000000001229760
0.000000001490820
0.000000000934941
0.000000000297167
0.000000000297698
2.656560069064640
0.000000003039794
5.056784405320646
0.919806312736561
10.977248484804672
0.000000000073392
1.730542784359990
0.000000000200754
3.318574196209014
0.879025638141999
0.370319363423242
0.000000000295456
Fun, Obj= 396.378265
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
75/76
El problema de la dieta, una vez ms:
>> [x y z]=ProgLineal_InP_MPS_sc(vitam_dc.mps)
1 archivo(s) copiado(s).
NAME done ROWS done COLUMNS done RHS done RANGES done BOUNDS done reading done mps2mat doneStatus=0
No fac. No fac. Brecha Error
primal dual dual relati.
Iter A*x-b A*y+z-c x*z total
---------------------------------------------------
1 3.56e+001 1.65e+002 2.10e+001 1.32e+000
2 2.74e+001 1.05e+002 1.27e+001 8.54e-001
3 1.52e+001 5.50e+001 6.86e+000 4.55e-001
4 2.69e+000 2.06e+001 2.34e+000 1.66e-001
5 1.34e-003 1.03e-002 4.39e-001 1.70e-002
6 4.10e-004 2.04e-003 1.46e-001 5.73e-003
7 2.05e-007 6.85e-005 1.60e-002 5.22e-004
8 1.03e-010 3.43e-008 1.61e-003 5.00e-005
9 5.55e-014 1.74e-011 1.61e-004 5.02e-006
10 7.42e-015 1.03e-012 2.63e-006 8.18e-008
11 7.26e-015 6.03e-013 6.99e-010 2.17e-011
Termina bien! [m n] = [13 21] CPU = 0
Fun. Obje.= 396.37826456784057
x =
0.000000000261274
0.488850287073326
0.000000000137922
0.000000000760845
0.000000000063454
20.253399924763229
0.000000000402831
4.527491511994257
0.000000000212124
0.000000000788949
0.000000001885759
4.999999998114246
15.967948585791948
5.000000000760850
58.430071830165744
5.913766763954222
5.889057162113923
1.210305369740400
1.000000000261274
1.588850287073329
5.000000000137925
y =
-2.703193633520408
2.656560070409201
0.000000001429759
5.056784405939616
0.919806312588121
10.977248487287513
0.000000000034520
1.730542784589703
0.000000000154399
3.318574194419995
0.879025638629259
0.370319363433166
-0.000000000138967
z =
2.656560070409201
0.000000001429759
5.056784405939616
0.919806312588121
10.977248487287513
0.000000000034520
1.730542784589703
0.000000000154399
3.318574194419995
0.879025638629259
0.370319363433166
0.000000000138967
0.000000000043755
0.000000000140021
0.000000000011943
0.000000000118924
0.000000000118652
0.000000000578415
0.000000000701204
0.000000000439747
0.000000000139772
>>
h i j
d e f g
a b c
10 8 7
9 4 6 5
1 2 3
76/76
Un problema muy grande MarosR7 m = 3.137, n = 9.408 y n: = 151.120:
>> ProgLineal_InP_MPS_sc(marosr7.mps);
1 archivo(s) copiado(s).
NAME done ROWS done COLUMNS done RHS done RANGES done BOUNDS done reading done mps2mat doneStatus=0
No fac. No fac. Brecha Error
primal dual dual relati.
Iter A*x-b A*y+z-c x*z total
---------------------------------------------------
1 9.34e+003 4.09e+005 9.41e+003 2.41e+000
2 9.24e+003 3.99e+005 9.10e+003 2.35e+000
3 9.03e+003 3.70e+005 8.93e+003 2.33e+000
4 8.45e+003 3.37e+005 8.04e+003 2.12e+000
5 7.47e+003 2.66e+005 6.73e+003 1.80e+000
6 5.78e+003 1.36e+005 5.06e+003 1.33e+000
7 2.99e+003 6.81e+001 2.71e+003 6.82e-001
8 9.40e+001 3.40e-002 2.29e+002 6.04e-002
9 4.62e+001 1.15e-003 1.13e+002 2.93e-002
10 2.56e+001 4.36e-004 6.43e+001 1.67e-002
11 1.68e+001 1.75e-004 3.97e+001 1.05e-002
12 8.07e+000 6.40e-005 2.02e+001 5.34e-003
13 4.69e+000 2.91e-005 1.17e+001 3.14e-003
14 2.43e+000 1.14e-005 6.15e+000 1.66e-003
15 1.55e+000 5.66e-006 3.84e+000 1.06e-003
16 7.76e-001 1.97e-006 1.92e+000 5.40e-004
17 4.03e-001 8.41e-007 1.04e+000 2.92e-004
18 1.60e-001 3.06e-007 4.63e-001 1.27e-004
19 5.96e-002 1.21e-007 2.05e-001 5.40e-005
20 1.76e-002 5.00e-008 8.44e-002 2.08e-005
21 4.67e-003 1.38e-008 2.85e-002 6.91e-006
22 1.45e-003 8.21e-009 1.33e-002 3.16e-006
23 2.95e-004 6.09e-009 2.97e-003 7.10e-007
24 1.48e-007 9.15e-009 2.98e-004 6.96e-008
25 4.40e-011 3.02e-009 8.96e-006 2.09e-009
26 1.66e-014 3.57e-009 8.10e-009 1.89e-012
Termina bien! [m n] = [3136 9408] CPU = 28.829
Fun. Obje.= 1497185.16653047850000
>>

You might also like