home *** CD-ROM | disk | FTP | other *** search
- %function [basic,sol,cost,lambda,tnpiv,flopcnt] = fmlinp(a,b,c,startbasic)
- %
- % ***** UNTESTED SUBROUTINE *****
- %
- % Simplex routine for linear programs arising in FITMAGLP.
- % A modification of LINP that exploits some structure in FITMAGLP
- % and tailors some constants. Also tries to avoid degeneracy in
- % the special structure of FITMAGLP.
-
- function [basic,sol,cost,lambda,tnpiv,flopcnt] = fmlinp(a,b,c,startbasic)
- if nargin < 4
- disp('usage: [basic,sol,cost,lambda] = lpmagfit(a,b,c,startbasic)')
- return
- end
- flopin = flops;tnpiv=0;
- [con,var] = size(a);
- [nrb,ncb] = size(b);
- [nrc,ncc] = size(c);
- if con ~= nrb | var ~= ncc
- disp('error dimensioning')
- return
- end
- %check conditioning of startbasic and change if necessary
- startbasic=sort(startbasic); stdiff=diff(startbasic);
- if any([length(startbasic)~=con,stdiff==0,max(startbasic)>var]),
- [q2,r2,e2]=qr(a); for i=1:con, startbasic(i)=find(e2(:,i));end;
- else [q1,r1,e1]=qr(a(:,startbasic));
- [q2,r2,e2]=qr(a);
- if r1(con,con)<(1e-4)*r2(con,con),
- for i=1:con, startbasic(i)=find(e2(:,i));end;end
- end
- sol1=a(:,startbasic)\b;
- negind=find(sol1<0);
- p=length(negind);
- if p>0,posind=startbasic(comple(negind,con));
- else posind=startbasic(con); end;%if p>0
- feasbasic=startbasic;
- cost1=-sum(sol1(negind));
- if p>0, %find an initial basic feasible solution
- newstartbasic=[posind var+1:var+p];
- auga = [a -a(:,startbasic(negind))];
- augc = [2*cost1 zeros(1,var-1) ones(1,p)];
- [feasbasic,augsol,cost2,auglambda,piv] = fmlp(auga,b,augc,newstartbasic);
- tnpiv=tnpiv+piv;
- if max(feasbasic)>var,
- augc(1,1)=0;
- [feasbasic,augsol,cost3,auglambda,piv] = fmlp(auga,b,augc,feasbasic);
- tnpiv=tnpiv+piv;
- [feasbasic,err] = fmfixbas(a,feasbasic,augsol,var,con);
- if err==1, %problem with feasible solution so form degenerate one.
- feasbasic=sort(feasbasic);augsol=[1 ; zeros(con-1,1)];
- [feasbasic,err] = fmfixbas(a,feasbasic,augsol,var,con);
- end %if err==1
- end %if max(feasbasic)>var
- end %if p>0
-
- [basic,sol,cost,lambda,tnpiv] = fmlp(a,b,c,feasbasic);
- tnpiv=tnpiv+piv;
-
- flopout = flops;
- flopcnt = flopout - flopin;
- %
- % Copyright MUSYN INC 1991, All Rights Reserved
-