Professional Documents
Culture Documents
Programa de Doctorat:
Aplicacions tècniques i informàtiques de
l’Estadística, l’Investigació Operativa i
l’Optimització
Curs de doctorat:
Mètodes de punt interior
1. Introducció.
Aquest algorisme és pràcticament idèntic al que apareix en “Jordi Castro, "Una
introducción al algoritmo del escalado afín", Document de Recerca DR-2000-02 del
Departament d'EIO”.
2. Algorisme.
El fitxer d’ script en matlab s’anomena ESCALAFI.M i el llistat és el següent:
%*****************************
function xopt=eap(A,b,c,info)
%*****************************
[m,n]=size(A);
[mb,nb]=size(b);
[mc,nc]=size(c);
if(rank(A) ~= m)
error('error: A no es de rang complert');
end%if
% ----- paràmetres
optgap=1.0e-6;
myeps=1.0e-12;
rho=0.95;
M = 100*(max(abs(c)));
% ------ inicialitzacions
x=ones(n,1);
A = [A b-A*x];
x = [x;1];
c = [c;M];
D = diag(x)^2;
y = inv(A*D*A')*A*D*c;
i=0;
dualgap=abs(c'*x-b'*y)/(1.0+abs(c'*x));
if (info>0)
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 5
fprintf('iter.\t\t alph \t\t dualgap \t f(x)\n');
fprintf('=====================================================\
n');
end
% ------ iteracions
while(dualgap>optgap)
z = c-A'*y;
dx = -D*z;
if all(dx>myeps)
x = inf*ones(n,1);
fprintf('Problema ilimitat\n');
break;
end%if
i=i+1;
end
% ------ resultat
if(x(n+1)>1.0e-4)
fprintf('problema infactible');
xopt=nan*ones(1,n);
else
fprintf('sol.lució trovada en %f iteracions\n',i);
fprintf('dualgap = %f\n',dualgap);
xopt=x(1:n);
end
%end function
3. Prova de l’algorisme.
Min 3x1 + x2
Subjecte a 2x1 + x2 2
3x1 + 4x212
x1, x2 0
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 6
Les dades d’aquest problema estàn en el fitxer P1E1. El resultat de l’execució és el
seguent:
» escalafi(A,b,c,1)
m = 2.000000, n = 4.000000
iter. alph dualgap f(x)
=====================================================
0.000000 0.009065 0.763015 19.528709
1.000000 0.066909 0.355916 5.151152
2.000000 0.831116 0.086851 2.965092
3.000000 3.266003 0.068421 2.279263
4.000000 4.680468 0.016974 2.051757
5.000000 38.843983 0.004863 2.014684
6.000000 148.057449 0.000610 2.001831
7.000000 947.575410 0.000184 2.000553
8.000000 3768.363669 0.000031 2.000093
9.000000 23365.157320 0.000006 2.000018
10.000000 106830.650395 0.000001 2.000004
11.000000 448165.602648 0.000000 2.000001
sol.luci¢ trovada en 12.000000 iteracions
dualgap = 0.000000
ans =
0.0000
2.0000
0.0000
4.0000
Les dades d’aquest problema estàn en el fitxer P1E2 i el resultat de l’execució és:
» escalafi(A,b,c,0)
m = 3.000000, n = 5.000000
sol.luci¢ trovada en 13.000000 iteracions
dualgap = 0.000000
ans =
1.5000
0.5000
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 7
0.0000
5.5000
0.0000
»
Conclusions.
Aquest algorisme és relativament simple en quant als conceptes teòrics en els que es
basa i prou eficient. El seu principal problema potser és el de utilitzar un mètode poc
eficient per trovar el punt inicial factible i interior. La resta de mètodes d’aquest curs
pasen per alt la factibilitat i es conformen amb que el punt sigui interior a costa de
treballar simultàniament amb el problema primal i el dual asociat.
Introducció.
L’algorisme es basa en el que es trova en “Robert Vanderbei, Linear Programming,
Foundations and Extensions”, cap. 17, pàgina 274. El sistema d’equacions normals és
el que figura en la pàgina 286, eqs. 18.8 i 18.9 (primals) que ens dóna les direccions
de moviment dx, dy. Es resol factoritzant per Cholesky i resolent el sistema triangular
resultant. La funció SISTLIN.M s’encarrega d’aquesta tasca. Com a punt inicial
simplement prenem el vector unitari (interior no factible). Es aquest punt és molt
destacable la diferència existent respecte a l’algorisme d’escalat afí i d’altres que es
resolen en dos fases. La longitud de passa es calcula de forma única per el problemes
primal i dual, tal com es fa en el texte de referència.
Algorisme.
El fitxer s’anomena PATHFN.M i el llistat és el seguent:
%****************************************************
%* Algorisme primal-dual Path-Following en versi¢ *
%* "£s de les equacions normals" (sistema simŠtric *
%* definit positiu => fact. de Cholesky) per P.L. *
%* Us: per resoldre el problema primal-dual *
% max c'x min b'y *
% Ax + w = b A'y - z = c *
% x,w >= 0 y,z >=0 *
% escrivim *
% x = PathFN(A,b,c,info) *
% on info: 0 - nom‚s d¢na resultat final *
% 1 - d¢na tamb‚ els punts del cami central*
%****************************************************
%--- Par…metres
delt = 0.1; %delt ‚s la reducci¢ aplicada per el par…metre barrera
r = 0.9; %r ‚s la reducci¢ de la long. de pas
MaxNorm = 1e10; %valor m…xim perm‚s per ||x||, ||y|| (prob il.limitat)
Eps = 1e-6; %toler…ncia per les infactibilitats rho, sig i per la
%cond. de complementarietat (variable gm)
%---------------------------------------------------------
%--- Trovar les direccions de moviment dx, dw, dy, dz ----
%---------------------------------------------------------
%--- primer: formar el sistema MA * dy = Mb
%--- dy contindr… les direccions dy
X = diag(x); %matrius diagonals
Y = diag(y);
Z = diag(z);
W = diag(w);
%--- trovar dx
dx = D2 * (c - A'*y + mh*inv(X)*ones(n,1) - A'*dy);
%--- trovar dz, dw
dz = inv(X)*(mh*ones(n,1) - X*Z*ones(n,1) - Z*dx);
dw = inv(Y)*(mh*ones(m,1) - Y*W*ones(m,1) - W*dy);
%-----------------------------------
%--- Trovar la longitud de pas th
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 9
%-----------------------------------
%--- trovem m…xim -dx/x,-dy/y,-dz/z,-dw/w ->k
k = -1e-50; %cota inferior per cerca del m…xim
for i=1:n
if((-dx(i)/x(i))>k)
k = -dx(i)/x(i);
end%if
if((-dz(i)/z(i))>k)
k = -dz(i)/z(i);
end%if
end%for
for i=1:m
if((-dy(i)/y(i))>k)
k = -dy(i)/y(i);
end%if
if((-dw(i)/w(i))>k)
k = -dw(i)/w(i);
end%if
end%for
%--- trovem th
th = r * (1/k);
if th > 1 th = 1; end%if
if(info > 0)
fprintf('\t %f',ci);
fobj = c'*x;
fprintf('\t %f',norm(rho));
fprintf('\t %f',norm(sig));
fprintf('\t %f\n',fobj);
end%if
ci = ci + 1;
end%while
%--- Retorna
if(norm(x)>=MaxNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
optim = MaxNorm*ones(1,n);
else
fprintf('sol.luci¢ trovada en %f iteracions',ci-1);
optim = x(1:n);
end%if
pause;
%End Function
[m,n]=size(R);
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 10
if(m ~= n)
error('error: matriu R no ‚s n x n');
end
z = inv(R')*b;
x(n) = z(n)/R(n,n);
for i=(n-1):-1:1
s = 0;
for j=(i+1):n
s = s + R(i,j)*x(j);
end%for
x(i) = (z(i) - s) / R(i,i);
end%for
%--- retorna
y=x(1:n);
xs=y';
%end function
3. Prova de l’algorisme
S’han efectuat dues proves d’aquest algorisme. El primer problema (fitxer P2E1)és:
» pathfn(A,b,c,1)
iter ||rho|| ||sig|| fobj
===================================================================
1.000000 262.821232 2.236068 25.287551
2.000000 254.833807 2.168111 42.869571
3.000000 241.415000 2.053945 58.733024
4.000000 230.050440 1.957256 71.890085
5.000000 222.248916 1.890881 84.362835
6.000000 214.570806 1.825556 93.406236
7.000000 208.342648 1.772567 166.311125
8.000000 157.189244 1.337357 259.682649
9.000000 91.628214 0.779568 361.030673
10.000000 20.293406 0.172655 388.870691
11.000000 0.764196 0.006502 389.931910
12.000000 0.043444 0.000370 389.996924
13.000000 0.001584 0.000013 389.999877
14.000000 0.000022 0.000000 389.999991
15.000000 0.000000 0.000000 389.999999
16.000000 0.000000 0.000000 390.000000
17.000000 0.000000 0.000000 390.000000
sol.luci¢ trovada en 17.000000 iteracions
ans =
0.0000
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 11
75.0000
15.0000
5.0000
0.0000
0.0000
1.0e+003 *
0.2500
0.5000
1.5000
0.3750
0.0000
0.0000
0.0000
Conclusió.
És molt notable la convergència d’aquest mètode partint d’un punt interior qualsevol
no factible.
dx = ones(n,1);
dy = ones(m,1);
%--- Paràmetres
delt = 0.1; %reducció aplicada per el paràmetre barrera
r = 0.9; %r és la reducció de la long. de pas
MaxNorm = 1e10; %valor màxim permés per ||x||, ||y|| (prob il.limitat)
Eps = 1e-6; %tolerància per les infactibilitats rho, sig i per
%la cond. de complementarietat (variable gm)
%---------------------------------------------------------
%--- Trovar les direccions de moviment dx, dw, dy, dz ----
%---------------------------------------------------------
%--- primer: formar el sistema MA * Mx = Mb
%--- Mx contindr… les direccions [dy;dx]
X = diag(x); %matrius diagonals
Y = diag(y);
Z = diag(z);
W = diag(w);
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 13
MA = [-inv(Y)*W A;
A' inv(X)*Z]; %simŠtrica quasi def. positiva
Mb = [rho-mh*inv(Y)*ones(m,1)+w ;
sig+mh*inv(X)*ones(n,1)-z];
%-----------------------------------
%--- Trovar la longitud de pas th
%-----------------------------------
%--- trovem m…xim -dx/x,-dy/y,-dz/z,-dw/w ->k
k = -1e-50; %cota inferior per cerca del m…xim
for i=1:n
if((-dx(i)/x(i))>k)
k = -dx(i)/x(i);
end%if
if((-dz(i)/z(i))>k)
k = -dz(i)/z(i);
end%if
end%for
for i=1:m
if((-dy(i)/y(i))>k)
k = -dy(i)/y(i);
end%if
if((-dw(i)/w(i))>k)
k = -dw(i)/w(i);
end%if
end%for
%--- trovem th
th = r * (1/k);
if th > 1 th = 1; end%if
if(info > 0)
fprintf('\t %f',ci);
fobj = c'*x;
fprintf('\t %f',norm(rho));
fprintf('\t %f',norm(sig));
fprintf('\t %f\n',fobj);
end%if
ci = ci + 1;
end%while
%--- Retorna
if(norm(x)>=MaxNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 14
optim = MaxNorm*ones(1,n);
else
fprintf('sol.luci¢ trovada en %f iteracions',ci-1);
optim = x(1:n);
end%if
pause;
%End Function
eps = 0.00001;
[m,n]=size(A);
if(m ~= n)
error('error: matriu A no ‚s n x n');
end
z = inv(L)*P*b;
x(n) = z(n)/U(n,n);
for i=(n-1):-1:1
s = 0;
for j=(i+1):n
s = s + U(i,j)*x(j);
end%for
x(i) = (z(i) - s) / U(i,i);
end%for
%--- retorna
xs=x(1:n);
%end function
3. Prova de l’algorisme.
S’han resol els mateixos problemes que per la pràctica 2, i els resultats han estat
idèntics com era d’esperar, ja que només hem canviat la forma de resolució del
sistema d’equacions que ens dóna les direccions de moviment dx, dy.
4. Conclusions.
La diferència entre aquest algorisme i el basat en les equacions normals s’evidencia al
tractar problemes reals de gran tamany amb matrius esparses. Amb el nostre cas no es
detecta cap diferència.
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 15
1. Introducció.
S’ha programat aquest algorisme seguint el texte “S.J. Wright, Primal-Dual Interior
Point methods", pàgina 198 (algorisme MPC)
2. Algorisme.
El fitxer Matlab s’anomena PFMeh.M
%****************************************************
%* Algorisme primal-dual heur¡stica de Mehrotra *
%* amb c…lcul de les direccions predictor-corector *
%* per PL. *
%* Us: per resoldre el problema primal-dual *
% min c'x max b'y *
% Ax = b A'y + z = c *
% x >= 0 z >=0 *
% escrivim *
% x = Meh(A,b,c,info) *
% on info: 0 - nom‚s d¢na resultat final *
% 1 - informa de cada iteraci¢ *
%****************************************************
%--- Par…metres
mh = 0.9; %par…metre de centrat fix (mŠtode d'escalat af¡)
MinNorm = 1e-10; %valor m¡nim perm‚s per ||x||
MaxNorm = 1e10; %valor m…xim perm‚s per ||y|| (prob il.limitat)
Eps = 1e-6; %toler…ncia per les infactibilitats rho, sig i per la
%cond. de complementarietat (variable gm)
MaxIter = 50; %nombre m…xim d'iteracions
if(info>0)
fprintf('iter\t\t ||rho||\t ||sig||\t gap\t\t fobj\n');
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 16
fprintf('============================================================\n');
end%if
while((ci<=MaxIter)&(norm(x)>MinNorm)&(norm(y)<MaxNorm)&((rho>Eps)|
(sig>Eps)|(comp>Eps)))
%---------------------------------------------------------
%--- Trovar les direccions de moviment dxa, dya, dza ----
%--- segons el mŠtode d'escalat af¡ (predicci¢) ----
%---------------------------------------------------------
%--- primer: formar el sistema d'equacions normals
%--- MA * Md = Mb
%--- Md contindr… les direcci¢ af¡ segons x,y,z
%--------------------------------------------------------------
%- Calcular les llargades de pas alf_prim_aff, alf_dual_aff -
%--------------------------------------------------------------
alf_prim_aff=0; %cota inferior
for k=1:n
alf=-dxa(k)/x(k);
if((alf>=0)&(alf>alf_prim_aff))
alf_prim_aff=alf;
end%if
end%for
alf_prim_aff = 1/alf_prim_aff;
if(alf_prim_aff>1) alf_prim_aff = 1; end%if
%------------------------------------------------
%--- Trovar les direccions de pas corretgides, -
%--- dxc, dyc, dzc -> Mdc -
%------------------------------------------------
DX = diag(dxa);
DZ = diag(dza);
%-------------------------------------------------------------------
%- Calcular les llargades de pas m…ximes alf_prim_max, alf_dual_max
-
%-------------------------------------------------------------------
alf_prim_max=0; %cota inferior
for k=1:n
alf=-dx(k)/x(k);
if((alf>=0)&(alf>alf_prim_max))
alf_prim_max=alf;
end%if
end%for
alf_prim_max = 1/alf_prim_max;
if(info > 0)
fprintf('%f',ci);
fprintf('\t %f',rho);
fprintf('\t %f',sig);
fprintf('\t %f',gap);
fprintf('\t %f\n',fobj);
end%if
ci = ci + 1;
end%while
%--- Retorna
if(norm(x)<=MinNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
optim = MaxNorm*ones(1,n);
else
if(ci>MaxIter)
fprintf('Masses iteracions, posible problema infactible');
fobj = c'*x;
fprintf('\tvalor funci¢ = %f\n',fobj);
x
else
fprintf('sol.luci¢ trovada en %f iteracions',ci-1);
optim = x(1:n);
end%if
end%if
%End Function
3. Proves de l’algorisme
S’han provat els problemes P1E1 i P1E2 I en els dos casos obtenim l’òptim:
» load p1e1
» pfmeh(A,b,c,0)
0.0000
2.0000
0.0000
4.0000
» load p1e2
» pfmeh(A,b,c,0)
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 19
sol.luci¢ trovada en 10.000000 iteracions
ans =
1.5000
0.5000
0.0000
5.5000
0.0000
»
4. Conclusions.
Comparant l’algorisme P1 amb el P4 veiem que:
1. Introducció.
S’ha seguit l’algorisme tal com es descriu en Vanderbei, pàgina 383. Cal advertir que
hi ha un error en aquest texte; en el sistema d’equacions per trovar les direccions dx,
dy, en el terme independent on diu:
B – Ax – Y-1e
ha de dir:
B – Ax + Y-1e
2. Algorisme.
%****************************************************
%* Algorisme primal-dual Path-Following en versi¢ *
%* "£s del sistema augmentat" (sistema simŠtric *
%* quasi definit positiu => fact. est…ndard) per *
% programaci¢ quadr…tica convexa (Q semid.positiva)*
%* Us: per resoldre el problema primal-dual *
% min c'x+x'Qx/2 max b'y-x'Qx/2 *
% Ax - w = b A'y + z - Qx = c *
% x,w >= 0 y,z >=0 *
% escrivim *
% x = ProgQA(A,b,c,Q,info) *
% *
% on info: 0 - nom‚s d¢na resultat final *
% 1 - informa del progres en cada iteraci¢ *
%****************************************************
[m,n]=size(A);
[mb,nb]=size(b);
[mc,nc]=size(c);
[mq,nq]=size(Q);
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 20
if((nc ~= 1) | (nb ~= 1)) error('error: b,c han de ser vectors columna');end
if((mc ~= n) | (mb ~= m)) error('error: b,c incompatibles amb A');end
if((mq ~= n) | (nq ~= n)) error('error: Q t‚ dimensions incorrectes');end
if(rank(A) ~= m) error('error: A no ‚s de rang complet');end
for i=1:n
if (w(i)<0)w(i)=1; end%if
end%for
dx = ones(n,1);
dy = ones(m,1);
Mb = ones(n+m,1);
%--- Par…metres
mi = 30; %nombre m…xim d'iteracions
delt = 0.1; %delt ‚s la reducci¢ aplicada per el par…metre barrera
r = 0.9; %r ‚s la reducci¢ de la long. de pas
MaxNorm = 1e6; %valor m…xim perm‚s per ||x||, ||y|| (prob il.limitat)
Eps = 1e-6; %toler…ncia per les infactibilitats rho, sig i per la
%cond. de complementarietat (variable gm)
%---------------------------------------------------------
%--- Trovar les direccions de moviment dx, dw, dy, dz ----
%---------------------------------------------------------
%--- primer: formar el sistema MA * Mx = Mb
%--- Mx contindr… les direccions [dx;dy]
X = diag(x); %matrius diagonals
Y = diag(y);
Z = diag(z);
W = diag(w);
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 21
MA = [-(inv(X)*Z + Q) A';
A inv(Y)*W ];
Mb1 = c - A'*y + mh*inv(X)*ones(n,1) + Q*x;
Mb2 = b - A*x + mh*inv(Y)*ones(m,1);
Mb=[Mb1;Mb2];
Mx = MA\Mb;
for i=1:n
dx(i) = Mx(i);
end%for
for i=1:m
dy(i) = Mx(i+m);
end%for
%-----------------------------------
%--- Trovar la longitud de pas th
%-----------------------------------
%--- trovem m…xim -dx/x,-dy/y,-dz/z,-dw/w ->k
k = -1e-50; %cota inferior per cerca del m…xim
for i=1:n
if((-dx(i)/x(i))>k)
k = -dx(i)/x(i);
end%if
if((-dz(i)/z(i))>k)
k = -dz(i)/z(i);
end%if
end%for
for i=1:m
if((-dy(i)/y(i))>k)
k = -dy(i)/y(i);
end%if
if((-dw(i)/w(i))>k)
k = -dw(i)/w(i);
end%if
end%for
%--- trovem th
th = r * (1/k);
if (th > 1) th = 1; end%if
ci = ci + 1;
end%while
%--- Retorna
if(norm(x)>=MaxNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
optim = MaxNorm*ones(1,n);
break;
end%if
if(ci==mi)
fprintf('masses iteracions: avortat. x = ')
for i=1:n
fprintf('%f, ',x(i));
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 22
end%for
fprintf('\n w = ');
for i=1:m
fprintf('%f, ',w(i));
end%for
break;
end%if
%End Function
3. Proves de l’algorisme.
El problema quadràtic és el seguent:
2.6667
1.6667
»
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 23
1. Introducció.
En aquest mètode usem la transformació descrita en Vanderbei pàgina 384 per pasar
d’un problema quadràtic convex a un de separable equivalent. La sol.lució del sistema
que dóna la direcció de moviment dx es realitza amb la rutina LIN.M la qual tracta els
pivots massa petits que poden apareixer. La funció TRIANG.M realitza la
factorització Q = F’DF. Les variables lliures que apareixen al transformar el problema
en separable es tracten amb una vanvi de variable del tipus y = y1 – y2 on y és lliure ,
y1,y2 són positives. Aquesta implementació està en el fitxer PROGQN3.M i és la que
es llista en aquest document. Existeix un altre versió en el fitxer PROGQN2.M que
manté la variables lliures, obtenint el pas de les variables primals sense tenir en
compte les lliures. En el cas de que al avançar una passa alguna de les variables lliures
pasi a valdre zero o negatiu s’efectúa el canvi de variable x’ = 2 – x i es modifica
convenientment la matriu de restriccions A i el terme independent b. Aquest
algorisme alternatiu ha estat també provat amb èxit.
2. Algorisme.
El llistat de LIN.M és:
% Resoldre un sistema lineal d'n equacions amb
% factoritzaci¢ LU de la matriu A del sistema:
%
% Ax=b on A=L*U, L, U triangulars superior/inferior
%
% Us: Lin(A,b)
%
%*****************************
function xs=Lin(A,b)
%*****************************
eps = 0.00001;
[m,n]=size(A);
if(m ~= n)
error('error: matriu A no ‚s n x n');
end%if
cotaInf = 1e-12;
cotaSup = 1e32;
%--- tenim Ax=b => factoritzem: PA=LU, P: permutaci¢
[L,U,P]=lu(A);
z = inv(L)*P*b;
if(abs(U(n,n))<cotaInf) U(n,n)=cotaInf; end%if
x(n) = z(n)/U(n,n);
for i=(n-1):-1:1
s = 0;
for j=(i+1):n
s = s + U(i,j)*x(j);
end%for
if(abs(U(i,i))<cotaInf) U(i,i)=cotaInf; end%if
x(i) = (z(i) - s) / U(i,i);
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 24
end%for
%--- retorna
xs=x(1:n);
%end function
function S=triang(A)
[m,n]=size(A)
if(m~=n) error('error: matriu no és nxn'); end%if;
for j=1:n
R(j,j)=1;
sum = 0;
for i=1:(j-1)
sum=sum+R(n+1,i)*R(j,i)^2;
end%for
R(n+1,j)=A(j,j) - sum;
for k=(j+1):n
sum = 0;
for i=1:(j-1)
sum = sum + R(n+1,i) * R(j,i) * R(k,i);
end%for
R(k,j) = (A(k,j) - sum)/R(n+1,j);
end%for
end%for
S=R;
%end Function
dx = x;
dy = y;
Mb = ones(n + m,1);
%--- Par…metres
mi = 20; %nombre m…xim d'iteracions
delt = 0.1; %delt ‚s la reducci¢ aplicada per el par…metre barrera
r = 0.9; %r ‚s la reducci¢ de la long. de pas
MaxNorm = 1e12; %valor m…xim perm‚s per ||x||, ||y|| (prob il.limitat)
Eps = 0.5; %toler…ncia per les infactibilitats rho, sig i per la
%cond. de complementarietat (variable gm)
%-------------------------------------------------
%--- Trovar les direccions de moviment
%-------------------------------------------------
%--- primer: direcció dx, dy
%eqs. normals....
MA = -(A'*inv(W)*Y*A + inv(X)*Z + Q);
Mb = sig - mh*inv(X)*ones(n,1) - A'*inv(W)*Y*(rho +
mh*inv(Y)*ones(m,1) - w);
dx = lin(MA,Mb);
dx = dx';
dy = inv(W)*Y*(rho + mh*inv(Y)*ones(m,1) - w - A*dx);
%-----------------------------------
%--- Trovar la longitud de pas th
%-----------------------------------
%--- trovem m…xim -dx/x,-dy/y,-dz/z,-dw/w, -du/u, -dyb/yb ->k
k1 = -1e-50; %cota inferior per cerca del m…xim (primal i dual)
k2 = k1;
for i=1:n
if((-dx(i)/x(i))>k1)
k1 = -dx(i)/x(i);
end%if
if((-dz(i)/z(i))>k2)
k2 = -dz(i)/z(i);
end%if
end%for
for i=1:m
if((-dy(i)/y(i))>k2)
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 27
k2 = -dy(i)/y(i);
end%if
if((-dw(i)/w(i))>k1)
k1 = -dw(i)/w(i);
end%if
end%for
%--- trovem th
th1 = abs(r * (1/k1));
if (th1 > 1) th1 = 1; end%if
th2 = abs(r * (1/k2));
if (th2 > 1) th2 = 1; end%if
end%while
%--- Retorna
if(norm(x)>=MaxNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
optim = MaxNorm*ones(1,n);
break;
end%if
if(ci==mi)
fprintf('masses iteracions: avortat. x = ')
for i=1:n
fprintf('%f, ',x(i));
end%for
fprintf('\n w = ');
for i=1:m
fprintf('%f, ',w(i));
end%for
break;
end%if
%End Function
3. Prova de l’algorisme.
S’ha resolt el mateix problema quadràtic que en la pràctica 5 (fitxer de dades
PROGQ.MAT) obtenint el mateix resultat. El llistat d’execució és:
» load progq
» progqn3(A,b,c,Q,1)
iter ||rho|| ||sig|| gap fobj
===========================================================================
1.000000 242.109479 691.666104 -300.000000 200.000000
2.000000 0.000000 366.246178 2559.878660 1542.388605
3.000000 0.000000 170.195105 621.073046 541.472703
4.000000 0.000000 77.383538 443.050818 487.646286
5.000000 0.000000 37.316605 664.819022 687.536279
6.000000 0.000000 18.502488 929.628434 940.238816
7.000000 0.000000 9.764536 1120.542428 1126.059068
8.000000 0.000000 5.605070 1031.151350 1034.503749
9.000000 0.000000 3.218797 675.629030 677.888408
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 28
10.000000 0.000000 1.758133 327.897238 329.624857
11.000000 0.000000 0.928069 136.189600 137.744802
12.000000 0.000000 0.512367 39.501444 41.019137
13.000000 0.000000 0.408068 8.944760 10.487229
14.000000 0.000000 0.400519 3.261844 5.188068
15.000000 0.000000 0.339248 1.528659 4.463177
16.000000 0.000000 0.141515 0.488480 4.348393
sol.luci¢ trovada en 16.000000 iteracions
ans =
2.6681
1.6675
»
4. Conclusions.
El nombre d’iteracions ha estat pràcticament igual a l’anterior mètode que usaba el
sistema augmentat. La diferència només la podrem trovar en problemes grans i
esparsos i algorismes que utilitzin rutines de tractament de l’esparsitat.
L’ùltima funció, HA(x), retorna una matriu mn x n que conté els m hessians de les
restriccions A(i) amb el següent format: les m primeres files són el hessià de la
restricció A(1), les m seguents el hessià d'A(2), etc.
2. Algorisme.
El fitxer PROGCON.M conté el següent script:
%************************************************************************
%* Algorisme primal-dual Path-Following adaptat a programes convexos. *
%************************************************************************
%* Us: per resoldre el problema *
% min c(x) c(x) funció convexa d'n variables *
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 29
% A(x) + w = b A(x) conté m funcions còncaves *
% w >= 0 *
% escrivim *
% x = ProgCon(x0,b,info) *
% *
% on x0: punt inicial (interior) *
% *
% *
% Previament informarem les seguents funcions auxiliars: VA dóna A(x) *
% VC dóna c(x), gA retorna el gradient d'A, gC el fradient de c, Hc el *
% hessià de c i HA retorna una matriu que conté els m hessians de les *
% restriccions A(i)les m primeres files són el hessià de la restricció *
%A(1), les m seguents el hessià d'A(2), etc. * %
Paràmetre info: 0 - nom‚s d¢na resultat final *
% 1 - informa sobre l'avanç en cada iteració *
%************************************************************************
[nx,mx] = size(x);
[nb,mb] = size(b);
if (mx~=1) error('error: el paràmetre x0 ha de ser un vector'); end%if
if (mb~=1) error('error: b ha de ser un vector'); end%if
n = nx; m = nb;
y = 10*ones(m,1);
w = y;
dx = x; dy = y; dw = w;
%--- Par…metres
delt = 0.1; %delt ‚s la reducci¢ aplicada per el par…metre barrera
r = 0.9; %r ‚s la reducci¢ de la long. de pas
MaxNorm = 1e10; %valor m…xim perm‚s per ||x||, ||y|| (prob il.limitat)
Eps = 1e-6; %toler…ncia per la infactibilitat rho, sig i gap dual
MaxIter = 100; %iteracions màximes
rho=ones(n,1);
sig=ones(m,1);
gap=1; %valors temporals
if(info>0)
fprintf('\t iter \t\t ||rho|| \t ||sig|| \t |gap| \t\t fobj\n');
fprintf('\t
=========================================================================\
n');
end%if
%---------------------------------------------------------
%--- Trovar les direccions de moviment dx, dy, dw ----
%---------------------------------------------------------
%--- primer: formar el sistema MA * Mx = Mb
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 30
%--- Mx contindr… les direccions [dx;dy]
X = diag(x); %matrius diagonals
Y = diag(y);
W = diag(w);
Msuma = zeros(n,n);
HA = ha(x);
for i=1:m
Hess_i = HA((i-1)*n + 1:i*n, 1:n); %hessià de la i-èsima
restricció
Msuma = Msuma + y(i)*Hess_i;
end%for
Mb = [gc(x) - ga(x)'*y;
b - va(x) + mh*inv(Y)*ones(m,1)];
Mx = lin(MA,Mb);
Mx = Mx’;
for i=1:n
dx(i) = Mx(i);
end%for
for i=1:m
dy(i) = Mx(i+n);
end%for
%--- trovar dw
Vec = zeros(m,1);
for i=1:m
Vec(i) = -(w(i)/y(i))*dy(i);
end%for
dw = Vec + mh*(inv(Y)*ones(m,1)) - w;
%-----------------------------------
%--- Trovar la longitud de pas th
%-----------------------------------
%--- trovem m…xim -dx/x,-dy/y,-dw/w ->k
k = -1e-50; %cota inferior per cerca del m…xim
for i=1:n
if((-dx(i)/x(i))>k)
k = -dx(i)/x(i);
end%if
end%for
for i=1:m
if((-dy(i)/y(i))>k)
k = -dy(i)/y(i);
end%if
if((-dw(i)/w(i))>k)
k = -dw(i)/w(i);
end%if
end%for
%--- trovem th
th = r * (1/k);
if th > 1 th = 1; end%if
if(info > 0)
%--- func. objectiu i gap dual
fobj = vc(x);
suma = 0;
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 31
for i=1:m
suma = suma + log(w(i));
end%for
gap = mh*suma + y'*(b - va(x) + w);
fprintf('\t %f',ci);
fprintf('\t %f',norm(rho));
fprintf('\t %f',norm(sig));
fprintf('\t %f',gap);
fprintf('\t %f\n',fobj);
end%if
ci = ci + 1;
end%while
%--- Retorna
if (ci>=MaxIter) error('error: masses iteracions'); end%if
if(norm(x)>=MaxNorm)|(norm(y)>=MaxNorm)
fprintf('Problema il.limitat');
optim = MaxNorm*ones(1,n);
else
fprintf('sol.luci¢ trovada en %f iteracions',ci-1);
optim = x(1:n);
end%if
pause;
%End Function
3. Proves de l’algorisme.
S’ha provat de resoldre el següent programa convex (font: Programación Matemática,
tomo 2, UNED):
%*********************************************************
% valor de la funció A(x); es cridada per la funció
% progcon.m Retorna un vector de m components.
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
valorA = zeros(4,1);
%end function
Curs de doctorat: Mètodes de punt interior.
Alumne: Jordi Cuesta i Andrea 32
function valorC = c(x)
%*********************************************************
% valor de la funció c(x); es cridada per la funció
% progcon.m Retorna un real.
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
%end function
%*********************************************************
% gradient de la matriu A(x); es cridada per la funció
% progcon.m Torna una matriu m x n
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
gradA(1,1) = -2*x(1) + 6;
gradA(1,2) = -4;
gradA(3,1) = 1;
gradA(3,2) = 0;
gradA(4,1) = 0;
gradA(4,2) = 1;
%end function
%*********************************************************
% valor del gradient de c en x; es cridada per la funció
% progcon.m Retorna un vector d'n components.
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
gradC = zeros(n,1);
gradC(1) = 2*x(1) - 16;
gradC(2) = 2*x(2) - 10;
%end function
%*********************************************************
% Hessians de les funcions a(x); es cridada per la funció
% progcon.m Retorna una matriu mn x n
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
%end function
%*********************************************************
% Hessià de la funció c(x); es cridada per la funció
% progcon.m Retorna una matriu n x n
%*********************************************************
[n,m] = size(x);
if (m ~= 1) error('error: x ha de ser un vector columna'); end%if
if (n ~= 2) error('error: x té dimensió errònia'); end%if
HessC(1,1) = 2;
HessC(1,2) = 0;
HessC(2,1) = 0;
HessC(2,2) = 2;
%end function
» x0=[10;10]
» b=[-11;-1;0;0]
» progcon(x0,b,0)
5.2396
3.7460