前面一篇讲的单纯形方法的实现,但程序输入的必须是已经有初始基本可行解的单纯形表。

但实际问题中很少有现成的基本可行解,比如以下这个问题:

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)相关推荐

  1. 机器学习数据预处理之离群值/异常值:箱图法(boxplot method)

    机器学习数据预处理之离群值/异常值:箱图法(boxplot method) garbage in,garbage out. 异常值是分析师和数据科学家常用的术语,因为它需要密切注意,否则可能导致错误的 ...

  2. 二阶偏微分方程组 龙格库塔法_有限单元法(Finite Element Method)实现声波方程模拟(Part 2)...

    2.1 前言 承接上一篇文章,前面我们已经介绍了一维声波方程有限元求解: 蓝不是蓝:有限单元法(Finite Element Method)实现声波方程模拟(Part 1)​zhuanlan.zhih ...

  3. 二值化-大津法(OTSU)

    论文 Otsu N . A Threshold Selection Method from Gray-Level Histograms[J]. IEEE Transactions on Systems ...

  4. 图像二值化——OTSU大津法

    最大类间方差法是由日本学者大津(Nobuyuki Otsu)于1979年提出的,是一种自适应的阈值确定的方法,又叫大津法,简称OTSU.它是按图像的灰度特性,将图像分成背景和目标两部分,或者说,是寻找 ...

  5. 同伦法(Homotopy Method)

    题目:同伦法(Homotopy Method) 学习压缩感知重构算法,经常能见到同伦法,但这里首先要特别说明的是,今天这里讨论的同伦法仅仅是一种思想,而不是一个具体的算法,类似于Majorizatio ...

  6. matlab大津法函数,根据OSTU大津法使用Matlab实现数字图像处理segmentation的graythresh函数...

    OSTU大津法算法思想: 一幅有depth个灰度级,根据每个灰度级t,可以将一幅图分为前景和背景. 前景指所有灰度级低于等于t的像素点,背景指大于t的像素点. w0指前景像素个数: w1指背景像素个数 ...

  7. 图像分割之大津法Otsu

    中文网上大津法的介绍很多,但是大多数给出的代码不是最优的而且存在分母为零的问题. 基本概念 大津法(简称Otsu)由1979年由日本学者大津提出的,是一种自适应阈值确定的方法,相关文献链接.它是根据图 ...

  8. matlab写的单纯形法二阶段法 大m法,线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)...

    在线性规划中的单纯形法与内点法(原理.步骤以及matlab实现)(一)中,我们讨论了单纯形法的原理和普通单纯形法的应用,本文接着讨论大M法.两阶段法和对偶单纯形法 2.2 Big M Method ( ...

  9. R语言层次聚类:通过内平方和(Within Sum of Squares, WSS)选择最优的聚类K值、以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最优的聚类个数

    通过内平方和(Within Sum of Squares, WSS)选择最佳的聚类K值.以内平方和(WSS)和K的关系并通过弯头法(elbow method)获得最佳的聚类个数 目录

  10. 动态阈值--大津法理解

    原文在这儿:点击打开链接 简介: 大津法(OTSU)是一种确定图像二值化分割阈值的算法,由日本学者大津于1979年提出.从大津法的原理上来讲,该方法又称作最大类间方差法,因为按照大津法求得的阈值进行图 ...

最新文章

  1. Obtaining the String
  2. 苹果电脑适合python吗_m1的MacBook pro适合python开发吗?
  3. java 把string转为keyevent_盘点现在Java强大第三方库(字符串操作),程序员都该知道!...
  4. java object转map_Java 面试题:百度前 200 页都在这里
  5. 数据结构习题之线性表
  6. 矩阵转置+矩阵相加(三元组)
  7. Vue项目打包文件过大(优化)
  8. 13个Python必备的知识
  9. 黑客游戏(强烈推荐)攻防ctf
  10. 熊猫TV技术与直播技术相关
  11. 利用亚马逊云免费搭建服务器的踩坑之旅-创建你的实例
  12. 计算机英语构词法,计算机专业英语的构词方法论文
  13. plc服务器作用,工业控制系统以及PLC的简单介绍
  14. 云分享YFX软件合集-开车不是儿戏!这些坏习惯,时时刻刻威胁着你的生命安全
  15. windows10开启/关闭超级管理员账号登陆
  16. C—— warning: function returns address of local variable(函数参数返回错误)
  17. Day651.NoSQL与RDBMS合理搭配问题 -Java业务开发常见错误
  18. linux中设置gvim高亮光标所在行和所在列
  19. python指数函数的计算_python绘制指数函数
  20. 麦当劳中国推出新升级巨无霸;斯凯孚大连四期新工厂项目动工 | 美通企业日报...

热门文章

  1. 关于高通平台9008线刷的一些注意点,供小白食用。
  2. 显示器点距 测试软件,大既是正义!最佳文本显示点距~AOC LV323HQPX显示器开箱
  3. 基于python实现细胞自动机
  4. eova使用之-集成jersey开发REST服务
  5. 中国未来家庭STEAM教育趋势研究报告
  6. 远程控制软件老是断线怎么解决?
  7. python分析鸢尾花数据_iris鸢尾花数据集最全数据分析
  8. java wsdl文件生成代码_wsdl文件生成java代码
  9. UDP 协议报文格式
  10. Visual Studio 2022配置GAMP出现 LNK2019无法解析外部符号_imp_timeGetTime@0