matlab setdiff函数_【运筹学】对偶单纯形法的Matlab实现

26b03e5e0d752152cb1ef5fa8f63768e.png

前两篇讨论了单纯形法的Matlab实现:

张敬信:【运筹学】单纯形法求解线性规划问题的Matlab实现​zhuanlan.zhihu.com
a1a54a648af533d8ee0675ca6af2c606.png
张敬信:【运筹学】单纯形法之大M法和两阶段法​zhuanlan.zhihu.com
a1a54a648af533d8ee0675ca6af2c606.png

本篇讨论对偶单纯形法的Matlab实现。

一. 对偶单纯形法的原理和步骤

原始问题的最优基也是对偶问题的可行基。换句话说,当原始问题的基 B 既是原始可行基又是对偶可行基时,B 成为最优基。

d090af8b50d0aca82d04b37b215ef1f2.png

对偶单纯形法思想:

20159af5adf29371e19a94ac2c8a5d06.png

fc1f553bf3738a2d13f7c3f17ae8707d.png

对偶单纯形法的步骤:

73d2b72f4f53213b2dc716dce9799348.png

二. 对偶单纯形法的 Matlab 实现

算法步骤与单纯形法基本是类似的,除了进出基的判断规则有变化,所以,对 SimplexMax 函数稍加修改即可。

优点:

  1. 代码采用向量化Matlab语言实现,非常简洁;
  2. 可以把整个单纯形表直接保存下来,再输出到Excel非常方便。

缺点(欢迎指正):

  1. 各种特殊解的情况,暂时没有讨论全面;
function [x,z,ST,res_case] = DualSimplexMax(c,A,b,ind_B)
% 对偶单纯形法求解标准形线性规划问题: max cx s.t. Ax <= b x>=0
% 输入参数: c为目标函数系数, A为约束方程组系数矩阵, b为约束方程组常数项, ind_B为基变量索引
% 输出参数: x最优解, z最优目标函数值, ST存储单纯形表数据, res_case=0表示有最优解

[m,n] = size(A);              %m约束条件个数, n决策变量数
ind_N = setdiff(1:n, ind_B);  %非基变量的索引
ST = [];
format rat
% 循环求解
while true
    x0 = zeros(n,1);
    x0(ind_B) = b;                %初始基可行解
    cB = c(ind_B);                %计算cB
    Sigma = zeros(1,n);
    Sigma(ind_N) = c(ind_N) - cB*A(:,ind_N);   %计算检验数
    [~,q] = min(b);               %选出最小的b
    r = ind_B(q);                 %确定出基变量索引r
    Theta = Sigma ./ A(q,:);      %计算θ
    Theta(Theta<=0) = 10000;
    [~,s] = min(Theta);           %确定进基变量索引s, 主元为A(q,s)
    vals = [cB',ind_B',b,A];
    vals = [vals; NaN, NaN, NaN, Sigma];
    ST = [ST; vals];
    if ~any(b < 0)               %此基可行解为最优解, any存在某个>0        
        x = x0;
        z = c * x;
        res_case = 0;
        return
    end
    % 换基
    ind_B(ind_B == r) = s;      %新的基变量索引
    ind_N = setdiff(1:n, ind_B); %非基变量索引
    % 更新A和b
    A(:,ind_N) = A(:,ind_B)  A(:,ind_N);
    b = A(:,ind_B)  b;
    A(:,ind_B) = eye(m,m);
end

测试实例:

a4a3581f1a540019ab19e3f27ce79a42.png

改写为目标最大化,并化为标准型:

0bc67d065a01e42761c5fba0ba67ebb1.png
A = [-2 -4 0 1 0; -2 0 -5 0 1];
b = [-2; -3];
c = [-12 -16 -15 0 0];
ind = [4 5];
[x, z, ST, ca] = DualSimplexMax(c, A, b, ind)

运行结果:

74e314afdec291173cbfcfdcd18d3beb.png

9c50f34b47d791f3c09d2311e05b90fb.png

也可以进一步将对偶单纯形表 ST 写入Excel(略)。

主要参考文献:

胡运权,运筹学原理及应用(第六版),及其课件

对偶单纯形法详解,百度文库

[图文]对偶单纯形法详解 - 百度文库​wenku.baidu.com

————————————————————————————————

原创作品,转载请注明,版权所有,禁止盗用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值