Matlab中的仿射缩放方法

时间:2019-03-20 14:08:50

标签: matlab optimization linear-programming

我正在尝试为最大化LP问题编写仿射缩放方法,并且使用了以下代码。

function [X,y,k] = affsm(A,x,c)
xx(:,1)=x';
er=1e-5
 k=1;
test=1;
r=2/3;
theta=1
while test>er/theta
D = diag(xx(:,k).^2);
AD = A*D;
dx = -(D-AD'*(AD*A')^(-1)*AD)*c';
 theta =r*min([xx(:,k)./abs(dx);1]);
 xx(:,k+1) = xx(:,k) + theta*dx ;
 test=max([c*dx ,norm(dx)]);
 k=k+1;
end
y=xx(:,k);
X=xx;
end 

我正在尝试解决以下问题

\begin{array}{c}{\max \quad Z=3 x+5 y} \\ {x+3 y \leq 60} \\ {3 x+4 y \leq 120} \\ {x \geq 10} \\ {x, y \geq 0}\end{array}

但是它给了我错误的结果我在上面的代码中做错了什么?

注意:最佳解决方案必须为$(x,y)=(12,24)$ with $z=132$

1 个答案:

答案 0 :(得分:1)

由于没有解释,我不知道您的函数应该做什么,但是要解决这种带有约束的线性方程,您可以使用linprog

% define the constraints
% Every constraints have this format: x1*x(1) + x2*x(2) ≤ n
% Where x(1) and x(2) are your variable and x1,x2 and n are integers.
A = [1 3
    3 4
    -1 0
     0 -1
    -1 0];

b = [60 120 -10 0 0];
% define the objective function
f = [-3 -5];
% solve
x = linprog(f,A,b)

结果:

x = 
    24
    12

注意到我已经反转了目标函数的符号以最大化解决方案(默认情况下linprog会最小化解决方案)