对偶单纯形法 matlab 实现代码

对偶单纯形方法

记录一下对偶单纯形的 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);

加油

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值