% 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