本文构建SimplexMax函数,通过构建单纯型表和循环迭代,求解线性规划问题的最优解

clc;clear;
%% 设置变量,调用函数
% 题目参数
A = [0 5 1 0 0;6 2 0 1 0;1 1 0 0 1];
b = [15; 24; 5];
c = [2 1 0 0 0];
ind = [3 4 5]% 无界解
% A = [-2 1 1 0;
%      1 -1 0 1];
% b = [4; 2];
% c = [1 1 0 0];
% ind = [3 4];% 无穷多最优解
% A = [-1 -1.9 1 0 0 0;
%      1 -1.9 0 1 0 0;
%      1 1.9 0 0 1 0;
%      -1 1.9 0 0 0 1];
% b = [-3.8; 3.8; 10.2; 3.8];
% c = [3 5.7 0 0 0 0];
% ind = [3 4 5 6];[x, z, ST, ca] = SimplexMax(c, A, b, ind) % 调用下述构建的方法进行求解delete('mysimpleMax.xlsx'); % 删除原有的Excel表(如果存在的话)
fprintf('正在将单纯形表写入Excel...\n');
writematrix('C1','mysimpleMax.xlsx','Sheet',1,'Range','C1');
writecell({'cB','xB', 'b'},'mysimpleMax.xlsx','Sheet',1,'Range','A2');
[~,n] = size(A);
X = strcat('x', string(1:n));
writematrix(X,'mysimpleMax.xlsx','Sheet',1,'Range','D2');
writematrix(c,'mysimpleMax.xlsx','Sheet',1,'Range','D1');
writematrix(ST,'mysimpleMax.xlsx','Sheet',1,'Range','A3');
fprintf('单纯性表写入完成\n');%% 构造解单纯形法函数
function [x,z,ST,res_case] = SimplexMax(c,A,b,ind_B)
% 单纯形法求解标准形线性规划问题: max cx s.t. Ax=b x>=0
% 输入参数: c为目标函数系数, A为约束方程组系数矩阵, b为约束方程组常数项, ind_B为初始基变量索引
% 输出参数: x最优解, z最优目标函数值, ST存储单纯形表数据,
% res_case=0表示有最优解,res_case=1表示有无界解,res_case=2表示有无穷多解[m,n] = size(A);              % m约束条件个数, n决策变量数
ind_N = setdiff(1:n, ind_B);  % 非基变量的索引
ST = [];
format rat
% 循环求解
iteration_round = 0; % 记录迭代次数
while truex0 = zeros(n,1);x0(ind_B) = b;               % 初始基可行解cB = c(ind_B);               % 计算cBSigma = zeros(1,n);          % 创建Sigma存储检验数并初始化为0Sigma(ind_N) = c(ind_N) - cB*A(:,ind_N);   % 计算并存入(非基变量)检验数[~, k] = max(Sigma);         % 选出最大检验数, 确定进基变量索引k (注:[a,b]=max(c)中,a为c中的最大值,b为c中最大值的index)
%     fprintf('确定进基变量索引:%d\n',k)Theta = b ./ A(:,k);         % 计算θ(取A的k列,使b./(A的k列))Theta(Theta == 1/0) = NaN;Theta(Theta <= 0) = NaN;
%     Theta(Theta<=0) = 10000;
%     [~, q] = min(Theta);         % 选出最小θ[~, q] = min(Theta);         % 选出最小正数θel = ind_B(q);               % 确定出基变量索引el, 主元为A(q,k)
%     fprintf('确定出基变量索引:%d\n',el)vals = [cB',ind_B',b,A,Theta];  % 存储单纯形表vals = [vals; NaN, NaN, NaN, Sigma, NaN];   % 存储单纯性表Sigma列[~,vals_width] = size(vals);    % 创建一个与vals等宽的空矩阵vals = [vals; [1:vals_width]* NaN];  % 将该行添加到vals最后作为分隔ST = [ST; vals];    % 将上述构建的单纯性表vals添加到ST矩阵中if ~any(Sigma > 0)           % 若不存在任何Sigma>0,此基可行解为最优解fprintf('得到最优解');x = x0;z = c * x;res_case = 0;returnendif all(A(:,k) <= 0)          %有无界解fprintf('有无界解');x = [];z = NaN;res_case = 1;breakendif ~any(Sigma(ind_B)>0) && any(Sigma(ind_N)==0)     % 有无穷多最优解fprintf('有无穷多最优解')x = x0;z = c * x;res_case = 2;breakenditeration_round = iteration_round + 1;fprintf('迭代第%d次\n',iteration_round)fprintf('确定进基变量索引:%d  出基变量索引: %d\n',k,el)% 换基ind_B(ind_B == el) = k;      %新的基变量索引ind_N = setdiff(1:n, ind_B); %非基变量索引(选取了ind_B和[1:n]的差集)% 更新A和bA(:,ind_N) = A(:,ind_B) \ A(:,ind_N);   % Q1 = inv(A(:,ind_B))  b = A(:,ind_B) \ b;     % b2 = inv(Q1) * b1A(:,ind_B) = eye(m,m);
end
end

注意:本文采用的对单纯性表进行操作的方法并不是改进单纯型法,如果需要使用改进单纯型法进行求解请参考其他文章,并对下述操作进行改进

    % 换基ind_B(ind_B == el) = k;      %新的基变量索引ind_N = setdiff(1:n, ind_B); %非基变量索引(选取了ind_B和[1:n]的差集)

使用MATLAB求解线性规划问题,并输出单纯形表,识别无界解和无穷多最优解情况相关推荐

  1. 线性规划问题的数学建模matlab,数学建模讲座之三——利用Matlab求解线性规划问题(linprog函数).ppt...

    数学建模讲座之三--利用Matlab求解线性规划问题(linprog函数) 利用Matlab求解线性规划问题 线性规划是一种优化方法,Matlab优化工具箱中有现成函数linprog对如下式描述的LP ...

  2. 利用matlab求解线性规划,数学建模讲座之三利用matlab求解线性规划问题(linprog函数)...

    数学建模讲座之三利用matlab求解线性规划问题(linprog函数) 利用利用 Matlab求解线性规划问题求解线性规划问题河北科技河北科技 大学大学*第第 1页页利用 Matlab求解线性规划问题 ...

  3. matlab 线性规划求最大值,MATLAB求解线性规划(含整数规划和01规划)问题.pdf

    MATLAB求解线性规划(含整数规划和01规划)问题 MATLAB 求解线性规划(含整数规划和0-1 规划)问题 线性规划是数学规划中的一类最简单规划问题,常见的线性规划是一个有约 束的,变量范围为有 ...

  4. MATLAB求解线性规划问题(附问题及代码)

    MATLAB求解线性规划问题 问题 1.(生产问题)某工厂计划生产甲.乙两种产品,主要材料有钢材3500kg,铁材1800kg,专用设备能力2800台时,材料与设备能力的消耗定额及单位产品所获利润如表 ...

  5. 用matlab怎么求线性规划,用MATLAB求解线性规划

    <用MATLAB求解线性规划>由会员分享,可在线阅读,更多相关<用MATLAB求解线性规划(17页珍藏版)>请在人人文库网上搜索. 1.用MATLAB优化工具箱解线性规划,mi ...

  6. matlab求解参数线性规划问题,实验三十用MATLAB求解线性规划问题

    <实验三十用MATLAB求解线性规划问题>由会员分享,可在线阅读,更多相关<实验三十用MATLAB求解线性规划问题(27页珍藏版)>请在人人文库网上搜索. 1.实验三十 用MA ...

  7. matlab 求解线性规划问题

    线性规划 LP(Linear programming,线性规划)是一种优化方法,在优化问题中目标函数和约束函数均为向量变量的线性函数,LP问题可描述为: minf(x)\min f(x):待最小化的目 ...

  8. matlab 矩阵线性规划,MATLAB求解线性规划(含整数规划和0-1规划)问题

    对于这类线性规划问题,数学理论已经较为完善,可以有多种方法求解此类问题.但写这篇文章的目的并不是为了介绍数学理论,我们这里主要讲解如果利用工具求解这一类线性规划问题. 最著名,同时也是最强大的数学最优 ...

  9. 利用Matlab求解线性规划问题

    线性规划是一种优化方法,Matlab优化工具箱中有现成函数linprog对如下式描述的LP问题求解: % min f'x % s.t .(约束条件): Ax<=b % (等式约束条件): Aeq ...

最新文章

  1. java中字节_java中的变量各占得字节数
  2. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第11章-大系统的分散控制
  3. Spring MVC 和 Spring 总结
  4. android tablerow 间隔,android-如何使TableRow从右到左
  5. oracle 怎么附加数据库,Oracle 如何附加数据库
  6. 一加7T Pro渲染图曝光:后置相机出乎意料
  7. StereoPannerNode
  8. 华为7c手机怎么恢复出厂设置_华为手机越用越卡,恢复出厂设置真有用?别乱来,看完就明白了!...
  9. SciPy 非线性方程求解 | Python技能树征题
  10. 指针错位导致对FSD误判
  11. 三菱modbusRTU通讯实例_PLC编程 | 用三菱PLC控制机械手实例
  12. Mybatis对象中含有list对象
  13. java反编译luyten使用
  14. SAP ABAP 字符串替换
  15. 8Uftp连接服务器错误
  16. 注册表Windows桌面设置
  17. java中求矩形面积,java求矩形面积
  18. 开会总结【1】ADL129
  19. EMV L2 - 应用选择
  20. linux 开机自动挂载光驱,随记:Linux 两种方式实现光驱自动挂载

热门文章

  1. 32位和62位操作系统
  2. 万字详解!Git 入门最佳实践
  3. 无法忘却——《你的名字。》——说不出口
  4. {竞拍} A5从1.21转战HS2
  5. Ajax 原理是什么?如何实现?
  6. souce insight symble window 关闭
  7. 模拟电路设计(14)---三点式振荡器
  8. OCR-paddleocr
  9. 基于ssm神农中药药方管理系统
  10. LeetCodd——单词搜索(java)——回溯算法