Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 用单纯形算法求解线性规划问题_Matlab_Simplex - Fatal编程技术网

Matlab 用单纯形算法求解线性规划问题

Matlab 用单纯形算法求解线性规划问题,matlab,simplex,Matlab,Simplex,我正在使用linprog函数解决以下线性规划问题 %Objective Function %X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12 X13 X14 X15 X16 X17 X18 f = [0.669 0.654 0.503 0.683 0.670 0.673 0.749 0.655 0.660 0.583 1.243 0.639 2.024 2.156 1.67

我正在使用linprog函数解决以下线性规划问题

%Objective Function
     %X1    X2    X3    X4    X5    X6    X7    X8    X9    X10   X11   X12   X13   X14   X15   X16   X17   X18
f = [0.669 0.654 0.503 0.683 0.670 0.673 0.749 0.655 0.660 0.583 1.243 0.639 2.024 2.156 1.672 0.473 0.139 0.687];

A = [];   b = [];   %Sin restricciones de desigualdad

%Restricciones de igualdad son:
     %X1  X2    X3   X4   X5   X6   X7   X8   X9   X10  X11   X12  X13  X14  X15  X16  X17  X18
Aeq=[0.1 0.12 0.335 0.15 0.18 0.19 0.12 0.15 0.15 0.15   0   0.15 0.11  0   0.13  0     0  0.46; %Nitrogeno
     0.3 0.24   0   0.03 0.05 0.04 0.27 0.03 0.24 0.15   0    0   0.52 0.52  0    0     0    0 ; %Fosforo
     0.1 0.12   0   0.31 0.15 0.19 0.08 0.2  0.12 0.15  0.50  0    0   0.34 0.44  0     0    0 ; %Potasio
      0    0    0    0    0    0    0    0    0    0     0   0.26  0    0    0    0    0.50  0 ; %Calcio
      0    0    0    0   0.06  0    0    0    0    0     0    0    0    0    0   0.17   0    0]; %Magnesio


beq = [285.71 ; %Demanda nutricional de Nitrogeno (kg/ha)
       305.33 ; %Demanda nutricional de Fosforo (kg/ha)
          450 ; %Demanda nutricional de Potasio (kg/ha)
       262.50 ; %Demanda nutricional de Calcio (kg/ha)
        41.50]; %Demanda nutricional de Magnesio (kg/ha)

%Limite inferior
lb = zeros(18,1);   
%Limite superior
ub = inf(18,1);        

x = linprog(f, A, b, Aeq, beq, lb, ub, options)

Solucion_optima = f*x
当我求解时,这是抛出我的结果,但不显示单纯形表的任何结果,我使用以下命令执行它

options = optimoptions('linprog','Algorithm','dual-simplex');
我有单纯形算法

iterM=100;

In=size(Aeq,1);

Xsol=[Aeq eye(In) beq
    f zeros(1,In) 0];

for iter=1:1:iterM
    fin=Xsol(end,1:end-1)<0;
    if fin==0
        break
    end
[a,c]=min(Xsol(end,:));

Xre=Xsol(:,end)./Xsol(:,c);

i=Xre<=0;

d=Xre;
d(i)=inf;

[beq,f]=min(d);

Xsol(f,1:end)=Xsol(f,1:end)/Xsol(f,c);

for i=1:1:size(Xsol,1)

    if i~=f
        Xsol(i,:)=Xsol(i,:)-(Xsol(i,c)*Xsol(f,:));
    end
end

end

for i=1:1:size(f,2)
    d=logical(Xsol(:,i));
    X(i,1)=Xsol(d,end)
end
iterM=100;
In=尺寸(Aeq,1);
Xsol=[Aeq眼睛(英寸)beq
f零(1,In)0];
对于iter=1:1:iterM
fin=Xsol(end,1:end-1)基于OP声明,“我需要降低的成本、双重解决方案和影子价格。”

1) 双重解决方案是影子价格。影子价格是双重价格的解决方案

2) 最终的单纯形表不是实现既定目标的唯一途径(尽管它会起作用)

双重解决方案(影子价格)
您可以通过
[x,fval,exitflag,output,lambda]=linprog(\uuuuu)
获得双重解决方案。
lambda
是双重解决方案;有关
linprog
(),请参见MATLAB文档和示例。文档称这些为拉格朗日乘数

降低成本
无论是否使用双重解决方案,都可以降低成本。如果
f
是目标函数(成本)的系数,则当LP以标准形式
A*x=b
写入时,降低的成本
=f'-p'*A
。如果其他人知道更好的方法从产出中降低成本,请发布。我尽量避免使用原始公式,以免拉出基本变量的索引

关于这一点的明确参考:

贝尔西马斯、迪米特里斯和齐齐克利斯,约翰·N·1997。线性优化导论,雅典娜科学与动态思想有限责任公司,马萨诸塞州贝尔蒙特。第148页

您是否在寻找最终解决方案(基本可行解决方案)的“单纯形表”?不清楚你想要什么。请把问题弄清楚你在找什么。这是单纯形的最终表格,用于最终的解决方案。如果单纯形算法解决了(问题是可行的和有界的),那么它就以一个基本可行的解决方案结束。我相信这个解决方案(一个极值点)是由输出提供的。当你说“最终表格”时,你是指“表格”格式吗?可以通过取
inv(B)*A
获得“表格”,其中
B
是最终基础(约束矩阵
A
的某些列)。如果这是我的意思,您可以使用lambda中的解决方案创建答案。它显示了以下lambda=struct和字段:lower:[18×1 double]upper:[18×1 double]eqlin:[5×1 double]ineqlin:[]@SebastianSalazar,请原谅,我不明白您的要求。怎么了?如果这是用于学校作业,并且您已经习惯了标准的表单表示法
A*x=b
,那么使用上界=
+inf
和下界=
-inf
进行求解,并将下界改为
A
(如果您不想让
linprog
为您做这件事,请确保向问题中添加slack变量),那么输出会更熟悉。