大M法(Big M Method)
前面一篇讲的单纯形方法的实现,但程序输入的必须是已经有初始基本可行解的单纯形表。
但实际问题中很少有现成的基本可行解,比如以下这个问题:
min f(x) = –3x1 +x2 + x3
s.t. x1 – 2x2 + x3 + x4=11
-4x1 + x2 + 2x3 - x5=3
-2x1+x3=1
xj>=0 , j=1,2,3,4,5
写成单纯形表就是
x1 | x2 | x3 | x4 | x5 | b | |
f | 3 | -1 | -1 | 0 | 0 | 0 |
1 | -2 | 1 | 1 | 0 | 11 | |
-4 | 1 | 2 | 0 | -1 | 3 | |
-2 | 0 | 1 | 0 | 0 | 1 |
很难找到秩为3的基阵,更不用说直接出现3阶单位阵了。在实际问题中,尤其是约束条件变多时,找到基阵甚至是判定A是否满秩都十分困难,因此在程序中引入大M法(Big M Method)来获得初始的基本可行解,这样我们能处理的问题就更加多样化了。
上篇已经说过,对于m*n的矩阵A来说,找到一个m*m 的满秩方阵就能得到基本可行解,但是在这么多列向量中怎样挑出m个线性无关的向量来组成一个满秩方阵呢?如果找起来麻烦的话,不如直接添加一个m阶单位阵来的方便!
大M法
大M法又称惩罚法,它是在目标函数中添加m个人工变量M*x(M是一个任意大的正数),同时在A矩阵中添加一个m阶单位矩阵。
这样一来新的A矩阵中就有了一个m*m满秩方阵,满足单纯形法求解的初始要求,但是若要得到最小值f(x),新添加的人工变量的值必然是0的,因为M可以是很大的数,如果Xn+1不为0,f(x)可能会很大,如果无法做到令人工变量取0值,那么原问题就无可行解。
需要注意的是,添加完人工变量之后,人工变量构成一组可行解的基变量,但单纯形初始矩阵要求基变量对应的检验数为0,故需要做行变换把基变量对应的检验数置0。
例如,本文开始引入的问题经过添加人工变量后变为
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | b | |
f | 3 | -1 | -1 | 0 | 0 | -M | -M | -M | 0 |
x6 | 1 | -2 | 1 | 1 | 0 | 1 | 0 | 0 | 11 |
x7 | -4 | 1 | 2 | 0 | -1 | 0 | 1 | 0 | 3 |
x8 | -2 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
再进行行变换把基变量x6,x7,x8对应的检验数置0,得到:
x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | b | |
f | 3-5M | -1-M | -1+4M | 0 | 0 | 0 | 0 | 0 | 0 |
x6 | 1 | -2 | 1 | 1 | 0 | 1 | 0 | 0 | 11 |
x7 | -4 | 1 | 2 | 0 | -1 | 0 | 1 | 0 | 3 |
x8 | -2 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 |
进行完这步之后,就回到了单纯形法求解的基本问题,利用原来的算法继续计算就好了。
Matlab实现
BigM.m
function [ x,y ] = BigM( f,A,b ) %输入f是检验数的数组,1*n维 %输入A是约束矩阵, m*n维 %输入b是约束向量, 1*m维 %输出x是解向量 %输出y是最优解 %判断输入维数是否相符 %做初始单纯形表,加入M变量 [n,m]=size(A);%n行m列 M=10000; S=[f -1*M*ones(1,n) 0;A eye(n) b']; format rat %将结果以分数表示 [n,m]=size(S); %将人工变量的检验数置零 for k=1:n-1S(1,:)=S(1,:)+S(k+1,:)*M; end %判断检验数 r<=0 r=find(S(1,1:m-1)>0); len=length(r); flag=0; %有大于0的检验数则进入循环 while(len)%检查非负检验数所对列向量元素是否都小于等于0for k=1:length(r)d=find(S(:,r(k))>0);if(length(d)+1==2)error('无最优解!!!') %break;endend%找到检验数中最大值[Rk,j]=max(S(1,1:m-1));%最大值所在列比值为正数且最小值br/a_rkbr=S(2:n,m)./S(2:n,j);%把比值中的负数都变无穷for p=1:length(br)if(br(p)<0)br(p)=Inf;endend[h,i]=min(br);%列向量比值最小值% i+1为转轴元行号(在S中),j为转轴元列号i=i+1;%进行换基,转轴元置1S(i,:)=S(i,:)./S(i,j);%转轴元所在列其他元素都置0for k=1:nif(k~=i)S(k,:)=S(k,:)-S(i,:)*S(k,j);end end%判断检验数 r<=0r=find(S(1,1:m-1)>0);len=length(r); % %调试用,控制循环步数 % if(len>0)flag=flag+1;end % if(flag==2)break;end % S end%检验数全部非正,找到最优解%非基变量置0x=zeros(1,m-1);for i=1:m-1%找到基变量j=find(S(:,i)==1);%每列中1的个数k=find(S(:,i)==0);%每列中0的个数if((length(j)+1==2)&&(length(k)+1==n))%i为基本元列号,j是行号x(i)=S(j,m);endendy=S(1,m);%最优解S end
测试程序:
f=[3 -1 -1 0 0]; A=[1 -2 1 1 0;-4 1 2 0 -1;-2 0 1 0 0 ]; b=[11 3 1 ]; [x,y]=BigM(f,A,b) f=[5 2 3 -1]; A=[1 2 3 0 ;2 1 5 0 ;1 2 4 1 ]; b=[15 20 26]; [x,y]=BigM(f,A,b) f=[5 10 0 0 0 ]; A=[1/14 1/7 1 0 0;1/7 1/12 0 1 0;1 1 0 0 1 ]; b=[1 1 8]; [x,y]=BigM(f,A,b) [x,y]=Simplex(f,A,b)
计算结果:
转载于:https://www.cnblogs.com/oucsheep/p/3422160.html
大M法(Big M Method)相关推荐
- 机器学习数据预处理之离群值/异常值:箱图法(boxplot method)
机器学习数据预处理之离群值/异常值:箱图法(boxplot method) garbage in,garbage out. 异常值是分析师和数据科学家常用的术语,因为它需要密切注意,否则可能导致错误的 ...
- 二阶偏微分方程组 龙格库塔法_有限单元法(Finite Element Method)实现声波方程模拟(Part 2)...
2.1 前言 承接上一篇文章,前面我们已经介绍了一维声波方程有限元求解: 蓝不是蓝:有限单元法(Finite Element Method)实现声波方程模拟(Part 1)zhuanlan.zhih ...
- 二值化-大津法(OTSU)
论文 Otsu N . A Threshold Selection Method from Gray-Level Histograms[J]. IEEE Transactions on Systems ...
- 图像二值化——OTSU大津法
最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找 ...
- 同伦法(Homotopy Method)
题目:同伦法(Homotopy Method) 学习压缩感知重构算法,经常能见到同伦法,但这里首先要特别说明的是,今天这里讨论的同伦法仅仅是一种思想,而不是一个具体的算法,类似于Majorizatio ...
- matlab大津法函数,根据OSTU大津法使用Matlab实现数字图像处理segmentation的graythresh函数...
OSTU大津法算法思想: 一幅有depth个灰度级,根据每个灰度级t,可以将一幅图分为前景和背景. 前景指所有灰度级低于等于t的像素点,背景指大于t的像素点. w0指前景像素个数: w1指背景像素个数 ...
- 图像分割之大津法Otsu
中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...
- matlab写的单纯形法二阶段法 大m法,线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)...
在线性规划中的单纯形法与内点法(原理.步骤以及matlab实现)(一)中,我们讨论了单纯形法的原理和普通单纯形法的应用,本文接着讨论大M法.两阶段法和对偶单纯形法 2.2 Big M Method ( ...
- R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数
通过内平方和(Within Sum of Squares, WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最佳的聚类个数 目录
- 动态阈值--大津法理解
原文在这儿:点击打开链接 简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图 ...
最新文章
- Obtaining the String
- 苹果电脑适合python吗_m1的MacBook pro适合python开发吗?
- java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...
- java object转map_Java 面试题:百度前 200 页都在这里
- 数据结构习题之线性表
- 矩阵转置+矩阵相加(三元组)
- Vue项目打包文件过大(优化)
- 13个Python必备的知识
- 黑客游戏(强烈推荐)攻防ctf
- 熊猫TV技术与直播技术相关
- 利用亚马逊云免费搭建服务器的踩坑之旅-创建你的实例
- 计算机英语构词法,计算机专业英语的构词方法论文
- plc服务器作用,工业控制系统以及PLC的简单介绍
- 云分享YFX软件合集-开车不是儿戏!这些坏习惯,时时刻刻威胁着你的生命安全
- windows10开启/关闭超级管理员账号登陆
- C—— warning: function returns address of local variable(函数参数返回错误)
- Day651.NoSQL与RDBMS合理搭配问题 -Java业务开发常见错误
- linux中设置gvim高亮光标所在行和所在列
- python指数函数的计算_python绘制指数函数
- 麦当劳中国推出新升级巨无霸;斯凯孚大连四期新工厂项目动工 | 美通企业日报...
热门文章
- 关于高通平台9008线刷的一些注意点,供小白食用。
- 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
- 基于python实现细胞自动机
- eova使用之-集成jersey开发REST服务
- 中国未来家庭STEAM教育趋势研究报告
- 远程控制软件老是断线怎么解决?
- python分析鸢尾花数据_iris鸢尾花数据集最全数据分析
- java wsdl文件生成代码_wsdl文件生成java代码
- UDP 协议报文格式
- Visual Studio 2022配置GAMP出现 LNK2019无法解析外部符号_imp_timeGetTime@0