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

前言

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


一、单纯形法表格

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

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

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

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

在这里插入图片描述

三、单纯形法的matlab实现

3.1单纯形法matlab代码

function [xm,fm,noi] = dcxf(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)                                                          %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,即目标函数在基变量处对应的系数
    Sigma = zeros(1,n);                                                    %Sigma为检验数向量
    Sigma(ind_Nonbasis) = c(ind_Nonbasis)' - cB'*A(:,ind_Nonbasis);        %计算检验数(非基变量),因为基变量对应的初始检验数一定为0
    [~, s] = min(Sigma);                                                   %选出最大检验数, 确定进基变量索引s;~表示忽略第一个参数(即最大值),s是索引
    Theta = b ./ A(:,s);                                                   %计算b/ai(点除)
    Theta(Theta<=0) = 10000;
    [~, q] = min(Theta);                                                   %选出最小θ
    q = index_Basis(q);                                                    %确定出基变量在系数矩阵中的列索引el, 主元为A(q,s)

%% 判断是否是最优解
    if ~any(Sigma < 0)                                                     %所有检验数都小于0,此基可行解为最优解, any表示存在某个检验数>0        
        xm = x0;
        fm = c' * xm;                                                      %算出最优解
        return
        break
    end
%% 判断是否有解
    if all(A(:,s) <= 0)                                                    %表示检验数这一列每个数都<=0,有无界解
        xm = [];
        break
    end
%% 换基
    index_Basis(index_Basis == q) = 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,m);                                           %核心——基变量索引的矩阵更换成单位矩阵
    noi=noi+1;
end
end

3.2测试例题

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

3.3结果

在这里插入图片描述

总结

以上就是单纯形法的matlab实现,有什么疑惑的地方可以私信或者评论区提问,需要流程图的也可以私信我。
本文参考的相关文章链接:运筹学—单纯形法matlab实现

  • 55
    点赞
  • 308
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
标准单纯形法是一种用于求解线性规划问题的算法。它通过迭代的方式逐步优化目标函数的值,直到找到最优解。在matlab中,可以使用单纯形法实现来求解标准型的线性规划问题。 首先,需要定义线性规划问题的系数矩阵A、常数项向量b和目标函数的系数向量c。然后,通过调用单纯形法的函数,传入这些参数,即可求解线性规划问题。 在matlab中,可以使用以下代码来实现标准单纯形法的求解: ```matlab A = \[4 1 1 0; -1 1 0 1\]; % 等式约束方程组(包括自变量与松弛变量)系数矩阵 b = \[16; 6\]; % 等式约束方程组常数项(等号右边的部分) c = \[2 3 0 0\]; % 目标函数的系数项(包括自变量与松弛变量) ind_B = \[3 4\]; % 松弛变量的变量索引,一般松弛变量设置地自变量更大,并紧截止自变量定义 iter_tag = 3; % 迭代次数 从1开始,n表示单纯形法运算了几轮 \[x, c, z, pt, ind_B, ind_N\] = SimplexMax(c, A, b, ind_B, iter_tag); ``` 这段代码中,A、b和c分别表示线性规划问题的系数矩阵、常数项向量和目标函数的系数向量。ind_B表示松弛变量的变量索引,iter_tag表示迭代次数。SimplexMax函数是一个自定义的函数,用于实现标准单纯形法的求解。它返回最优解x、最优值z、对偶变量pt以及更新后的松弛变量和非基变量的索引ind_B和ind_N。 最后,可以通过输出语句来显示求解结果,如输出松弛变量和非基变量的系数矩阵、最优解和最优值等。 希望这个回答对您有帮助。 #### 引用[.reference_title] - *1* [最优化算法单纯形法matlab实现单纯形法看这一篇就够了)](https://blog.csdn.net/xbsysy/article/details/125433686)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [运筹学 matlab实现单纯形法](https://blog.csdn.net/weixin_52624015/article/details/123662712)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [matlab 线性规划 单纯形法](https://blog.csdn.net/baishuiniyaonulia/article/details/121842337)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值