最优化算法对偶单纯形法的matlab实现(对偶单纯形法看这一篇就够了)


前言

最优化算法对偶单纯形法的matlab实现:
要读懂本文代码需要了解:nchooseksetdiffeye等函数在matlab中的作用,以及/符号在矩阵运算中的作用。


一、单纯形法表格

在高等教育出版社《最优化方法》一书中提到的单纯形法表格如下图所示:
在这里插入图片描述
其中:c为目标函数系数, A为约束方程组系数矩阵, b为约束方程组常数项。

1.1可立即读出最优解和最优值的表格具备的特点

① 中心部位有单位子块
② 右列元素非负
③ 底行相应于单位子块的位置为0
④ 底行其他元素非负

二、对偶单纯形法的步骤(流程图)

三、对偶单纯形法的matlab实现

3.1对偶单纯形法matlab代码

function [xm,fm,noi] = duioudcxf(A,b,c)
%% 介绍
% 对偶单纯形法求解标准形线性规划问题: min cx s.t. Ax=b x>=0
% 输入参数: c为目标函数系数, A为约束方程组系数矩阵, b为约束方程组常数项
% 输出参数: xm为最求解,fm为最优函数值,noi为迭代次数
%% 准备
format rat                                                                 %元素使用分数表示
[m,n] = size(A);                                                           %m约束条件个数, n决策变量数
v=nchoosek(1:n,m);                                                         %创建一个矩阵,该矩阵的行由每次从1:n中的n个元素取出k个取值的所有可能组合构成。矩阵 C 包含 m!/((n–m)! m!) 行和 m列
index_Basis=[];
%% 提取可行解所在列
for i=1:size(v,1)                                                          %n取m的种类
    if A(:,v(i,:))==eye(m)                                                 %在中心部位A中取v的第i种取法取出m列判断是否存在m*m大小的单位矩阵
        index_Basis=v(i,:);                                                %存在单位矩阵的取法保存在列表index_Basis中
    end                       
end
%% 提取非基变量索引
ind_Nonbasis = setdiff(1:n, index_Basis);                                  %非基变量的索引,返回在1:n中出现而不在index_Basis(即基变量索引中出现的元素),并从小到大排序
noi=0;
while true
    x0 = zeros(n,1);
    x0(index_Basis) = b;                                                   %初始基可行解
    cB = c(index_Basis);                                                   %提取基向量在目标函数的系数cB
%% 判断最优解
    if ~any(b < 0)                                                         %此基可行解为最优解, any存在某个<0        
        xm = x0;
        fm = c'*xm;
        return
    end
%% 判断问题是否有解
    index=find(b<0);
    for i = 1:numel(index)
        if all(A(index(i),:)>=0)                                           %在b<0的元素,所对应行所有元素都大于0
            xm=[];
            fm = [];                                                       %原问题无可行解,对偶问题存在无界解
            return
        end
    end
%% 选择进基变量,选择离基变量
    Sigma = zeros(1,n);
    Sigma(ind_Nonbasis) = c(ind_Nonbasis)' - cB'*A(:,ind_Nonbasis);        %计算检验数
    [~,q] = min(b);                                                        %选出b中最小的数
    r = index_Basis(q);                                                    %确定离基变量索引r
    Theta = Sigma ./ A(q,:);                                               %计算b/ai
    Theta(Theta>=0) =-1000000;                                             %剔除ai>0的部分
   [~,s] = max(Theta);                                                     %筛选出最大的b/ai,确定进基变量索引s, 主元为A(q,s)
%% 换基
    index_Basis(index_Basis == r) = s;                                     %原先基变量为r的索引更换成新的基变量索引s
    ind_Nonbasis = setdiff(1:n, index_Basis);                              %筛选出非基变量索引
%% 核心——旋转运算
    A(:,ind_Nonbasis) = A(:,index_Basis) \ A(:,ind_Nonbasis);              %核心——非基变量的部分等于(=)基变量索引的矩阵的逆乘剩余非基变量的矩阵
    b = A(:,index_Basis) \ b;                                              %核心——约束方程组常数项(=)基变量索引的矩阵的逆乘原约束方程常数项目
    A(:,index_Basis) = eye(m);                                             %核心——基变量索引的矩阵更换成单位矩阵
    noi=noi+1;
end
end

3.2测试例题

clc,clear;
A=[-2 -4 -5 -1  1  0  0;
   -3  1 -7  2  0  1  0;
   -5 -2 -1 -6  0  0  1]; 
b=[0 -2 -15]'; 
c=[3 2 1 4  0  0  0]';
[xm,fm,noi] = duioudcxf(A,b,c);
disp('最优解为:');
disp(xm);
disp('最优函数值为:');
disp(fm);
disp('迭代次数为:');
disp(noi);

3.3结果

在这里插入图片描述

总结

以上就是对偶单纯形法的matlab实现,有什么疑惑的地方可以私信或者评论区提问,需要流程图的也可以私信我。
本文参考的相关文章链接:最优化算法单纯形法的matlab实现(单纯形法看这一篇就够了)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值