% Denna fil illustrerar hur man kan lösa ett litet
% linjärprogrammeringsproblem med hjälp av matlab.
% Procenttecken betyder att raden bara är en kommentar.
%
% Problemet som löses är 
%
%   minimera x + y + z
%   då       x + 2y + 3z >= 2
%           2x +  y +  z >= 2
%                 y + 2z  = 3
%                  x,y,z >= 0
%
%
% Först ställer vi upp matrisen för olikhetsbivillkoren. Observera 
% att Ax <= b.
A = -[1 2 3
      2 1 1];
% Högerledet för olikhetsbivillkoret. Tecknet ' betecknar transponat.
b = -[2 2]';
% Matrisen för likhetsvillkoren
Aeq = [0 1 2];
% Högerledet för likhetsvillkoret
beq = 3;
% Kostnadsvektorn
c = [1 1 1]';
% Undre gränser på variablerna
l = [0 0 0]'; % l = zeros(3,1) är ett alternativt skrivsätt
% Vi har inga övre gränser, inf betyder här "infinity".
u = inf*ones(3,1);

% Vi ställer in matlabs optimeringsrutin att lösa små problem
options = optimset('LargeScale','off', 'Simplex','on');
% En startpunkt som egentligen inte används.
x0 = zeros(3,1);
% Vi löser med lp-lösaren i optimization toolbox
[x,f,exitflag,output,lambda]=linprog(c,A,b,Aeq,beq,l,u,x0,options);
% x innehåller optimallösningen, och lambda de optimala dualvariablerna
x
lambda.ineqlin
lambda.eqlin
lambda.lower

% Den som inte har optimization toolbox kan använda
% Alps i stället. Här visar vi hur det går till.
% Alps har en något annorlunda anropssyntax

Aalps = [A     % Först <= villkoren
         Aeq]; % Sedan likhetsvillkoren
balps = [b     % Motsvarande för b
         beq];
sense = [1 1 0]'; % 1 är <= villkor, 0 är likhetsvillkor
maxit = 100;
printlvl = 0; % ingen output

% Vi anropar Alps
[x,lambda,mu,status,it] = alps(c,Aalps,balps,l,u,sense,maxit,printlvl);
% Visar lösningen
x
lambda
mu