单纯形法详解及MATLAB实现,对偶单纯形法详解及MATLAB实现
单纯形法详解及MATLAB实现,对偶单纯形法详解及MATLAB实现
单纯形法
我们以这样一个方程组做为例子,来看一下单纯形法是如何解题的
这是一个已经化成标准形式的方程组,x4和x5是我们加入的松弛变量
第一步确定一个基可行解
我们将上面方程组写作Ax=b的形式,然后从A中找出一个单位矩阵,这个单位矩阵就先做为我们的初始基矩阵,对应的解也就是基可行解。我们直接选取松弛变量的系数作为单位矩阵(这个是一定满足的),如图A矩阵对应4和5位置上的列向量组成单位矩阵
接下来很容易算出了基可行解
第二步最优性检验
也就是看一下这个解是不是最优解
简单来说,换一个x取值会不会使结果变大,如果会那这个解就不是最优解,如果不是,那我们就已经找到最优解啦。
这里当然不会是直接用眼睛看,我们是有公式的哦。
当当当,我们的检验数来啦。
首先选取基变量对应位置的c数组值
比如这里我就选取4,5位置上的c数组值,也就是0,0作为一个新的数组
我们可以记为cb=[0 0]
接下来我们对每一个变量x,xi(i=1,2,3,4,5)
计算
作为该变量所对应的检验数,m为基变量个数也就是cb数组长度,如果所有的检验数都小于等于0,那我们就找到最优解了,否则我们就要进行下一步了。
迭代运算
在开始迭代之前,我们要先看一下是不是有无界解。如果对于一个大于0的检验数,它所对应的A矩阵中的列向量元素全部小于等于0,那么我们就知道是有无界解。
否则我们就要开始迭代
具体流程我们可以用一个流程图来看一看
代码部分
首先是函数文件
function [x_opt,fx_opt,iter] = Simplex_eye(A,b,c)
%x_opt为最优解,fx_opt为最优函数值,iter为迭代次数
iter=0;%初始化迭代次数
[m,n]=size(A);%A矩阵大小
r=nchoosek(1:n,m);%选择排列
I=eye(m,m);%设置一个m阶单位矩阵,用于之后计算的比较和计算
len=length(r);
for i=1:len %从A中寻找一个单位矩阵,也就是基矩阵if A(:,[r(i,:)])==Ibs=r(i,:);break;end
end
s=[1:n];
t=setdiff(s,bs);%setdiff可以计算出s数组中有,而bs数组中没有的元素
flag=0;%flag=1唯一最优解,2无穷多最优解,3有无界解
x=[];%基变量数组
while flag==0 %开始迭代iter=iter+1;%迭代次数加1x(t)=0;x(bs)=b;cb=c(bs);c_z=zeros(1,n); %计算检验数cj-zjfor i=1:nz=sum(cb'.*A(:,i));c_z(i)=c(:,i)-z;enddisp("----------------------第"+iter+"次---------------------------");All=[cb',bs',b,A];disp(All);disp(c_z);if all(c_z <= 0)%最优解x_opt=x;fx_opt=sum(c.*x_opt);if all(c_z(t) < 0)%非基变量都小于0flag=1;%唯一最优解elseflag=2;%无穷多最优解endbreak;end[~,n1]=max(c_z);%找到最大的检验数所在位置disp(n1);disp("--------------");if all(A(:,n1) <= 0)%判断无界解,否则继续迭代x_opt=[];flag=3;break;endb1 = b./ A(:,n1);b1(b1<=0)=inf;%将小于等于0的数设为无穷大,[~,m1]=min(b1);%选出非负中的最小值对应的变量换出bs(m1)=n1;%n1对应为换入变量,m1对应换出变量t=setdiff(s,bs);A(:,t) = inv(A(:,bs))*A(:,t); %基矩阵的逆乘以非基矩阵b = inv(A(:,bs))*b; %基矩阵的逆乘以bA(:,bs) = I; %基矩阵更新为单位矩阵
end
if flag==1disp('唯一最优解');return
elseif flag==2disp('无穷多最优解');return
elseif flag==3disp('有无界解');fx_opt=inf;return
end
接下来是测试的脚本文件
A=[2 -3 2 1 0;1/3 1 5 0 1];
b=[15;20];
c=[1 2 3 0 0];
[x_opt,fx_opt,iter] = Simplex_eye(A,b,c)
运行结果
对偶单纯形法
函数接口文件
// DSimplex_eye.m
function [x_opt,fx_opt,iter] = DSimplex_eye(A,b,c)
% 输入参数: c为目标函数系数, A为约束方程组系数矩阵, b为约束方程组常数项
% 输出参数: x_opt最优解, fx_opt最优目标函数值, iter迭代次数
iter=0;%初始化迭代次数
[m,n]=size(A);%A矩阵大小
r=nchoosek(1:n,m);%选择排列
I=eye(m,m);%设置一个m阶单位矩阵,用于之后计算的比较和计算
len=length(r);
for i=1:len %从A中寻找一个单位矩阵,也就是基矩阵if A(:,[r(i,:)])==Iind_B=r(i,:);break;end
end
ind_N = setdiff(1:n, ind_B);
x=[];%基变量数组
while true % 迭代x(ind_N)=0;x(ind_B) = b;cB = c(ind_B); %计算cBSigma = zeros(1,n); %检验数数组for i=1:nz=sum(cB'.*A(:,i));Sigma(i)=c(:,i)-z;end[~,q] = min(b); %选出最小的b,换出r = ind_B(q); Theta = Sigma ./ A(q,:); %计算θTheta(Theta<=0) = inf;[~,s] = min(Theta); %确定进基变量索引s, 主元为A(q,s)vals = [cB',ind_B',b,A];vals = [vals; NaN, NaN, NaN, Sigma];disp("-----------------------第"+iter+"次--------------------------")disp(vals);if all(b >= 0) %最优解 x_opt = x;fx_opt = sum(c .* x_opt);returnenditer=iter+1;% 换基ind_B(ind_B == r) = s; %新的基变量索引ind_N = setdiff(1:n, ind_B); %非基变量索引% 更新A和bA(:,ind_N) = inv(A(:,ind_B))* A(:,ind_N);b = inv(A(:,ind_B))* b;A(:,ind_B) = I;
end
函数脚本文件
// DSimplex_eye_script.m
A=[-1 -2 -1 1 0;-2 1 -3 0 1];
b=[-3 -4]';
c=[-2 -3 -4 0 0];
[x_opt,fx_opt,iter] = DSimplex_eye(A,b,c)
运行结果
单纯形法详解及MATLAB实现,对偶单纯形法详解及MATLAB实现相关推荐
- 运筹学——matlab实现对偶单纯形法
前言 之前我已经发布了matlab实现单纯形法的相关内容,想了解的小伙伴可以点击这个链接: https://blog.csdn.net/abbcdc/article/details/111324457 ...
- 人工变量法的matlab编程运算,单纯形法程序
2分 2 230.5KB 2011-11-20 单纯形表第一部分 单纯形法之单纯形表第一部分 单纯形法之单纯形表单纯形表 计算举例 p17---例2-10 计算举例 p17---例2-10[立即查看] ...
- 对偶理论和灵敏度分析(单纯形法矩阵形式、对偶理论及转化、影子价格、机会成本、差额成本、对偶单纯形法、灵敏度分析)
对偶理论和灵敏度分析 文章目录 对偶理论和灵敏度分析 修正单纯形法-矩阵描述和计算 对偶问题的提出 原问题与对偶问题转化 对偶问题最优解的经济意义--影子价格 对偶问题约束项的经济意义--生产产品的机 ...
- 最优化算法对偶单纯形法的matlab实现(对偶单纯形法看这一篇就够了)
文章目录 前言 一.单纯形法表格 1.1可立即读出最优解和最优值的表格具备的特点 二.对偶单纯形法的步骤(流程图) 三.对偶单纯形法的matlab实现 3.1对偶单纯形法matlab代码 3.2测试例 ...
- 单纯形法以及对偶单纯形法的Matlab实现
最近在上<运筹与优化>这门课,讲到了单纯形法这部分,老师让我们上机用Matlab实现单纯形法,数学公式实现过程看不懂的我就暴力模拟了单纯形法的整个过程,包含无界解等情况. 1. 确定初始基 ...
- 单纯形法表格法例题详解_优化 |运筹学线性规划单纯形法之求解
文章申明 文章作者:臧永森 臧永森:清华大学工业工程系在读博士,研究方向:运筹优化算法的设计与应用.数据统计分析.大数据技术与应用,戚铭尧老师团队 责任编辑:阎泳楠 文章由『运筹OR帷幄』原创发布,如 ...
- 单纯形法,修正单纯形法,对偶单纯形法+解释,很长,不过比较完整,对原理解释的比较多,建议有一定心理准备
@TOC最简单的单纯形法是用来解决形如 min /max cx Ax <= b x>=0 这样的问题的,那么如何解决呢,我觉得这篇知乎上的帖子写的很好,直接搬运过来了: 我们直接给出线性规 ...
- 运筹说 第31期 | 对偶理论与灵敏度分析—对偶单纯形法
经过前几期的学习,想必大家已经理解了线性规划问题的对偶问题.相关的重要理论以及影子价格.本期,小编将带大家学习对偶单纯形法的计算步骤. 1.对偶单纯形法 (1)单纯形法回顾 在讲解对偶单纯形法之前我们 ...
- 运筹学_两阶段法对偶单纯形法_week5
目录 思维导图 例题解析 两阶段法 问题展示 解题过程 答案展示 对偶单纯形法 问题展示 解题过程 答案展示 最后吐槽 思维导图 例题解析 两阶段法 问题展示 Q:请利用两阶段法求解. 解题过程 原问 ...
最新文章
- 一次简单的代码封装经历
- Java编程思想之-主板示例
- air android 通信,Android超声波通信例子
- 两招让陌生网络访问者现出原形
- 医疗保健、零售、金融、制造业……一文带你看懂大数据对工业领域的影响!...
- cfree运行程序错误_C/C++程序调试和内存检测
- 漫画:如何给女朋友解释什么是“锟斤拷”?
- MyBatis 插入失败后爆出 500 ,如何捕获异常?
- C++基本控制类型及流程语句详解
- [模板制作技巧3]控制每页显示组的数目
- 网络抓包,不能使用路由器和交换机,必须是具有镜像功能的HUB(集线器)
- Git(3):git clone远程GitHub仓库代码出现“Permission Denied (publickey)”问题
- Java 将Excel转为XML
- 计算机字体库位置,win7电脑的字体库在哪里?
- 本地怎么传文件到服务器,本地传输文件到服务器
- sklearn 5.18.3 SGD - Maximum margin separating hyperplane
- (附源码)node.js学生钟点工管理系统 毕业设计 290011
- 多媒体互动投影解决方案——虚拟翻书
- 聊聊group lasso
- Robocode教程1——安装、运行、配置