handout7

advertisement
Section 7: More on the Logarithmic Barrier Method in Linear Programming.
In the previous section, we introduced the logarithmic barrier method as an example of an interior method
in linear programming. As it has been presented so far, this method depends on the ability of MATLAB to
find the critical points of the modified objective function by symbolically solving equations. With n
variables and k constraints, this amounts to solving a system of n polynomial equations of degree k, which
rapidly exhausts the capacity of MATLAB.
In the present section we present an alternative procedure, which is essentially a higher dimensional form
of Newton's method for finding the roots of an equation. We begin by reviewing the problem of finding
roots of equations involving one variable. To solve the equation ax + b=0, one simply sets x  
b
.
a
Obvious as this is, it is the basis of Newton's method. For any differentiable function f, we have, to first
order in x-x0, f(x)=f(x0)+ (x-x0)f ' (x0), which gives for f(x)=0, the approximate solution
x1  x0 
f ( x0 )
. The closer x0 is to an actual root of f(x)=0, the better the approximation is.
f ' ( x0 )
Newton's method is simply to iterate this idea, with x1 taking over the role of x0. Let us see how this
works to find a root of the equation ex - 3 -x =0. We will start with x0 = 1, and see what happens.
syms x
f=exp(x)-3-x
f =
exp(x)-3-x
x0=1
x0 =
1
This initializes the process. Now each iteration of the next input block will bring us closer to an actual
solution. The second line measures how close we are, so we can decide when we are close enough.
x1=x0-subs(f,x,x0)/subs(diff(f),x,x0)
subs(f,x,x1)
x0=x1
This tends to work well as long as we start reasonable near an actual solution and are not unlucky enough
to encounter a point at which f '=0, which would cause the first line to fail, or f' very small, which would
tend to cause serious overshoot. It is for this reason that we began with x0=1 instead of x0=0. Of course we
can find points at which f '(0) = 0 in much the same manner, applying Newton's method to the function f '.
When we come to functions of several variables, we do not expect isolated solutions to equations like
f(x,y,z)=0. In order to have generically isolated solutions, we need the same number of equations as
variables. An important special case of this, and the one we are concerned with in connection with the
logarithmic barrier method, is finding critical points for a function of several variables. Since there are as
many partial derivatives as there are variables, critical points are generically isolated.
To find a critical point of a function of several variables by the analogue of Newton's method, we need to
start at a point P0, and look at f(P) near P0 to second order in P-P0. Recall from Section 4 of these notes
(with a slight change of notation) that, to second order in P-P0, we have
f ( P )  f ( P0 )  f ( P0 )  ( P  P0 ) 
1
( P  P0 ) Hf ( P0 )( P  P0 ) T Here, we recall that Hf
2
denotes the Hessian matrix of f, and f denotes the gradient of f. We are writing the coordinates of our
points horizontally. Since the components of the Hessian matrix are the partial derivatives of the
components of the gradient, we also have, to first order in P-P0,
f ( P )  f ( P0 )  ( P  P0 ) Hf ( P0 ) . If Hf=H were constant, the solution of f ( P )  0 would
be P1  P0  f ( P0 ) H
1
, as may be verified by substitution. This is the basis for our adaptation of
Newton's method. In the general case P1 will not be the desired solution but we hope it will be an
improvement on P0, and we can iterate as before.
Unfortunately, if we try to apply this idea directly in the logarithmic barrier method, we will probably not
only overshoot the desired solution, but jump out of the feasible region altogether. For this reason, we
modify the method by using f ( P0 )( H ( P0 ))
1
to determine the direction in which we should move, but
directly specifying the distance we will move, by adding to P0 a controlled multiple of a unit vector in the
desired direction. At every stage, we check to make sure we are still in the feasible region. If we have
jumped out, we revert to the previous P 0 and shrink the step size. At the same time, we also shrink the
coefficient of the logarithmic term in the modified objective function. In fact, it will be convenient to give
the same value to the step size and the logarithmic coefficient at all times.
Let us see how this works with Problem 11 from Section 6.3 of Helzer's text.
syms x1 x2 x3
c1=126-6*x1-8*x2-7*x3
c2=155-9*x1-8*x2-9*x3
c3=135-10*x1-7*x2-2*x3
c4=132-9*x1-7*x2-5*x3
c5=84-7*x1-2*x2-5*x3
constraints=[c1,c2,c3,c4,c5]
logterm=sum(log(constraints))
object=162*x1+150*x2+128*x3
c1 =
126-6*x1-8*x2-7*x3
c2 =
155-9*x1-8*x2-9*x3
c3 =
135-10*x1-7*x2-2*x3
c4 =
132-9*x1-7*x2-5*x3
c5 =
84-7*x1-2*x2-5*x3
constraints =
[ 126-6*x1-8*x2-7*x3, 155-9*x1-8*x2-9*x3, 135-10*x1-7*x2-2*x3, 1329*x1-7*x2-5*x3,
84-7*x1-2*x2-5*x3]
logterm =
log(126-6*x1-8*x2-7*x3)+log(155-9*x1-8*x2-9*x3)+log(135-10*x1-7*x22*x3)+log(132-9*x1-7*x2-5*x3)+log(84-7*x1-2*x2-5*x3)
object =
162*x1+150*x2+128*x3
We have written a MATLAB function, logbar, which calls a script called barloop and another function
called findcrit. logbar takes five arguments which are, in order, the objective function, a row vector whose
components are the slack variables (here called constraints), a row vector whose components are the
original variables (vars), a starting point (point) and a positive number, which serves as both the step size
for findcrit, the critical point finder, and the coefficient of the logarithmic term in the modified objective
function. logbar executes the procedure we have outlined above for finding a critical point of the modified
objective function until it jumps out of the feasible region. It then returns the previous point. We can then
look at the corresponding values of the slack variables. This will tell us when we are close to a vertex of the
feasible region. If this is not clear that this is the case, we can reduce the last argument to logbar and
evaluate it again. Eventually, it should become apparent that the process is converging to one of the
vertices of the feasible region; at that point we can terminate the process and declare the vertex in question
to be the solution we are looking for.
vars=[x1,x2,x3]
vars =
[ x1, x2, x3]
We can start at the origin, since it is in the feasible region.
point=[0,0,0]
point =
0
0
0
point=logbar(object, constraints,vars,point,5)
test=subs(constraints,vars,point)
point =
6.2958
test =
2.4499
8.4314
2.6177
7.3269
7.7865
3.2292
9.9777
It is not yet clear that we are near a vertex, so let us try again with a smaller step size and logarithmic term.
point=logbar(object, constraints,vars,point,1)
point =
6.9592
7.1068
3.8837
test=subs(constraints,vars,point)
test =
0.2041
0.5592
7.8929
0.2009
1.6535
Still not clear; once again
point=logbar(object, constraints,vars,point,.1)
point =
6.9920
7.0373
3.9477
test=subs(constraints,vars,point)
test =
0.1156
0.2442
7.9234
0.0723
1.2430
And once more:
point=logbar(object, constraints,vars,point,.02)
test=subs(constraints,vars,point)
point =
7.0003
test =
0.0253
7.0012
3.9948
0.0349
7.9993
0.0152
1.0217
It is now fairly clear that we are approaching the vertex at which the first, second and fourth slack variables
will be zero, but let us run one more iteration to be sure.
point=logbar(object, constraints,vars,point,.005)
test=subs(constraints,vars,point)
point =
7.0003
test =
0.0253
7.0012
3.9948
0.0349
7.9993
0.0152
1.0217
Nothing changed; the root finder must have jumped out of the critical region on the first attempt, so we
must make the step size even smaller.
point=logbar(object, constraints,vars,point,.001)
test=subs(constraints,vars,point)
point =
7.0000
test =
0.0015
7.0001
3.9996
0.0022
7.9998
0.0009
1.0016
Now it is completely clear.
[x1sol,x2sol,x3sol]=solve(c1,c2,c4)
x1sol =
7
x2sol =
7
x3sol =
4
subs(object,[x1,x2,x3],[x1sol,x2sol,x3sol])
ans =
2696
The maximum of the objective function on the feasible region is 2696, at the point [7,7,4]. Your solution of
this problem by the Simplex algorithm should confirm this result.
Download