对偶单纯形方法
记录一下对偶单纯形的 matlab 实现代码
matlab 程序
function [xValue, fValue, iterNum] = dual_simplex(A, b, c, isMinValue)
% 输出参数:
% xValue : 最优解向量
% fValue : 最优解
% iterNum : 迭代次数
% 输入参数:
% A : 限制条件的系数
% b : 限制条件的常数项
% c : 目标函数的系数
% isMinValue : 目标函数是否是求最小值 0(求最大值) 1(求最小值)
iterNum = 0;
xValue = [];
fValue = inf;
if isMinValue == 0
c = -c; % 如果是求函数最大值,则系数取反
end
[m, n] = size(A);
A = [A eye(m, m)];
c = [c; zeros(m, 1)];
r = c';
% 获取基底, 并计算对应的基本解
bIdx = n + 1 : n + m;
nIdx = 1 : n;
while true
iterNum = iterNum + 1;
B = A(:, bIdx);
N = A(:, nIdx);
xB = B \ b;
if all(xB > 0)
xValue = zeros(n + m, 1);
xValue(bIdx) = xB;
xValue = xValue(1:n);
fValue = c(1:n)' * xValue;
disp('迭代结束,找到最优解');
break;
end
if all(N(xB < 0, :) > 0)
disp('问题可行域为空集');
break;
end
% 选择离基分量下标
idx = find(xB == min(xB(:)));
offBaseIdx = bIdx(idx);
%选择进基分量下标
alphaVector = -r(nIdx) ./ N(idx, :);
alpha = min(abs(alphaVector(:)));
inBaseIdx = nIdx(alphaVector == alpha);
r = r + alpha .* A(idx, :);
bIdx(bIdx == offBaseIdx) = inBaseIdx;
nIdx(nIdx == inBaseIdx) = offBaseIdx;
if iterNum > 100000
disp('出错,请检查输入参数后重试');
break;
end
end
end
测试程序
A = -[40, 20, 35; 10, 30, 15; 25, 25, 20];
c = [2000 1600 2500]';
b = [-0.4 -0.5 -0.3]';
[x, f, iter] = dual_simplex(A, b, c, 1);