目录

  1. 单纯形算法的MATLAB实现
  2. 大M单纯形算法的MATLAB实现
  3. 二阶段单纯形算法的MATLAB实现
  4. 对偶单纯形算法的MATLAB实现

一、理论

我的上一篇博文介绍了最基础的单纯形算法的MATLAB实现,但普通的单纯形算法都是从线性规划的规范式开始迭代,并且要求初始的规范式能显易地给出一个初始基可行解,虽说对于任意一个系数矩阵行满秩的标准型线性规划问题都可以转化为规范式,但如果对于一个每一个非规范式的线性规划问题,都需要手动转化成规范式才能求解,这样的算法似乎有点low了,于是就有了本文将介绍的一种初始基可行解的求解方法,大M单纯形算法。

首先来简述一下算法的思想,对于一个线性规划问题,第一步将其转化为标准型,此时若该标准型的系数矩阵中含有一个单位矩阵,则该标准型是一个规范式,否则引入人工变量,并在改人工变量的价格系数前加上一个充分大的正数M,作为惩罚项,这样可以使得在极小化目标函数的过程中,人工变量逐步转化为非基变量,这样最后就可以排除人工变量的影响,引入人工变量后就可以得到一个转化的标准型线性规划问题,该标准型为规范式,就可以继续用普通标准型算法进行迭代,最终求出最优解。

二、代码

算法具体的思想及一些定理的证明,随便找一本最优化理论的书就有,在此不过多赘述,上代码

function [x,y,ResultFlag]=BigMSimplexAlgorithm(A,B,C,varargin)
% 2020-3-31 臻orz
%inputs:
%   A:系数矩阵 m*n
%   B:右端向量 m*1
%   C:价格系数向量 n*1
%alternative inputs:
%   target:优化目标 0 ~ min; 1 ~ max;
%   sign:约束条件符号向量 m*1 其中
%       -1 ~ '<=';0 ~ '=';1 ~ '>'; 默认为0,即为等式
%   M:惩罚系数,为一充分大正数,默认为10*sum(sum(abs(A)))
%outputs:
%   x:最优解 n*1
%   y:最优值 num
%   ResultFlag:是否找到最优解%check inputs
ip = inputParser;
ip.addRequired('A',@(x)validateattributes(x,{'double'},...{'finite','nonnan'},'BigMSimplexAlgorithm','A',1));
ip.addRequired('B',@(x)validateattributes(x,{'double'},...{'size',[size(A,1),1]},'BigMSimplexAlgorithm','B',2));
ip.addRequired('C',@(x)validateattributes(x,{'double'},...{'size',[size(A,2),1]},'BigMSimplexAlgorithm','C',3));
ip.addParameter('target',0,@(x)validateattributes(x,...{'double'},{'scalar'},'BigMSimplexAlgorithm','target'));
ip.addParameter('sign',zeros(size(A,1),1),@(x)validateattributes(x,...{'double'},{'size',[size(A,1),1]},'BigMSimplexAlgorithm','sign'));
ip.addParameter('M',10*sum(sum(abs(A))),@(x)validateattributes(x,...{'double'},{'scalar','positive'},'BigMSimplexAlgorithm','M'));
ip.parse(A,B,C,varargin{:});%initialize
target = ip.Results.target;
sign = ip.Results.sign;
M = ip.Results.M;
[m,n] = size(A);
P = [];
x = zeros(n,1);
y = 0;
ResultFlag = 0;
j = 0;%standardization
if targetC = -C;%目标函数的转化
end
A(B<0,:) = -A(B<0,:);
sign(B<0,:) = -sign(B<0,:);
B = abs(B);%约束条件的转化
for i = sign'j = j+1;switch icase -1%引入松弛变量a = zeros(m,1);a(j) = 1;A = [A a];C = [C;0];case 1%引入剩余变量a = zeros(m,1);a(j) = -1;A = [A a];C = [C;0];end
end
n1 = size(A,2);%记录转化标准型的未知量的个数%找寻单位矩阵
for i = 1:ma = 0;for j = find(A(i,:)==1)if sum(A(:,j)==0) == m-1P = [P j];a = 1;endendif ~a%若该行无基解,引入人工变量j = zeros(m,1);j(i) = 1;A = [A j];P = [P size(A,2)];C = [C;M];end
endP = P(1:m);
CB = C(P);%基变量对应的价值系数
sigma = C'-CB'*inv(A(:,P))*A;
sigma(P) = 0;while 1if ~sum(sigma<0)if sum(P>n1)%如果基变量含有人工变量return;endx = zeros(n1,1);x(P) = B;x = x(1:n);%舍去引入的松弛变量与剩余变量if targety = -CB'*B;elsey = CB'*B;endResultFlag = 1;return;endpivot_y = find(sigma==min(sigma));pivot_y = pivot_y(1);if sum(A(:,pivot_y)<0) == mreturn;endtheta_index = find(A(:,pivot_y)>0);theta = B(theta_index)./A(theta_index,pivot_y);pivot_x = theta_index(theta==min(theta));%确定主元pivot_x = pivot_x(1);P(pivot_x) = pivot_y;%更新PCB(pivot_x) = C(pivot_y);%更新CB%更新系数矩阵B(pivot_x) = B(pivot_x)/A(pivot_x,pivot_y);A(pivot_x,:) = A(pivot_x,:)./A(pivot_x,pivot_y);a = 1:m;a(pivot_x) = [];for i = aB(i) = B(i)-A(i,pivot_y)*B(pivot_x);A(i,:) = A(i,:)-A(i,pivot_y)*A(pivot_x,:);    endsigma = sigma-sigma(pivot_y)*A(pivot_x,:);%更新sigma
end
end

然后来讲一下输入输出,代码中已经有过注释,调用方式为

>> [x,y,result]=BigMSimplexAlgorithm(A,B,C,'target',0,'sign',D,'M',10);

其中A,B,C分别为系数矩阵,右端向量,价格系数向量,注意B,C为列向量即可,后面的三个均为可选输入
‘target’:为优化的目标为求最小值还是最大值,分别对应0和1,可以不设置,默认为0,即求最小值
‘sign’:为约束条件的符号,小于、等于、大于分别对应-1,0,1,也是一列向量,可以不设置,默认为0,即全为相等
‘M’:为惩罚项,是一个充分大的正数,但也不可取得过大,会导致计算量大倒是事小,主要是因为有可能会使得规划问题变得病态,即矩阵中有些元素过小,有些过大,此时在计算时由于计算机存储的精度问题,导致计算出现丢失现象,可以不设置,默认取值为10*sum(sum(abs(A)))

举个例子

对于线性规划问题

就可以有如下输入

A=[1 -2 1 0;-4 1 2 -1;-2 0 1 0];%系数矩阵
B=[11 3 1]';%右端向量
C=[3 -1 -1 0]';%价格系数向量
D=[-1 0 0]';%符号向量[x,y,result]=BigMSimplexAlgorithm(A,B,C,'target',1,'sign',D,'M',10);
%或者也可以
[x,y,result]=BigMSimplexAlgorithm(A,B,C,'sign',D,'target',1);
%后三个可选参数顺序无所谓,M可以自己设置也可以使用默认
%由于这里要求解目标函数为最大值,所以设置'target'为1
%由于约束条件有小于等于,故'sign'不可以使用默认值,需设置

最后得出的结果为

故原线性规划问题的最优解为(4,1,9,0)^T,最优值为2

大M单纯形算法的MATLAB实现相关推荐

  1. matlab中图像太大,图像处理:算法在MATLAB中耗时太长

    您可以使用im2col *将图片转换为列格式,以便每个块形成[64 * 4096]矩阵的列.然后对每列应用转换,并使用bsxfun来向量化错误计算. DomainImage=rand(512); Ra ...

  2. 大津算法的matlab实现

    大津算法详解 一.算法功能 ​ 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤. ​ 大津算法也称最大类间差法,由大津于1979 ...

  3. fcm算法的MATLAB实现,FCM算法的matlab程序(初步)

    FCM算法的matlab程序 1.采用iris数据库 iris_data.txt 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0 ...

  4. 2018-4-8蚁群算法---包子阳《智能优化算法以及Matlab实现》第五章

    资料来源: <智能优化算法以及matlab实现>包子阳  余继周 编著 第五章-----蚁群算法 是一种元启发式优化算法(自己理解:就是作为群体的单位个体也就是元,在里面充当着随机的选择搜 ...

  5. matlab整定串级pid,PID算法在Matlab串级控制中的应用

    PID算法在Matlab串级控制中的应用 自114 1112002039 陈艳 前言:这个专题是由王娟老师给我们授课,我感觉收获挺大的,尤其是matlab仿真软件的使用,为我以后的实验课打下良好的基础 ...

  6. 0050算法笔记——【线性规划】单纯形算法(未完全实现)

    题外话:王晓东的<算法设计与分析>看到现在,终于遇到自己琢磨不透的代码了.这里粘出来,求大神指点迷津,将代码补充完整~ 1.线性规划问题及其表示 线性规划问题可表示为如下形式: 变量满足约 ...

  7. matlab音频基频的提取,(620512681) 自相关基频提取算法的MATLAB实现

    第31卷总第80期 西北民族大学学报(自然科学版) V01.31.No.4 1 0年1 2 0 2月 Journal of Nonhw铭t University for Nationalities(N ...

  8. matlab的数值计算方法,数值计算方法中的一些常用算法的Matlab源码

    数值计算方法中的一些常用算法的Matlab源码,这些程序都是原创,传上来仅供大家参考,不足之处请大家指正,切勿做其它用途-- 说明:这些程序都是脚本函数,不可直接运行,需要创建函数m文件,保存时文件名 ...

  9. matlab实现prim算法,Prim算法和Kruskal算法的Matlab实现

    Prim算法和Kruskal算法的Matlab实现 <计算机仿真>期末大作业 Prim算法和Kruskal算法的Matlab实现 05605刘禹050697(30) 连线问题应用举例: 欲 ...

  10. 数模算法 — 蒙特卡罗算法及Matlab案例

    本文为博主编写文章,未经博主允许转载,转载请注明出处:https://blog.csdn.net/weixin_42604241/article/details/97382158 蒙特卡罗算法(方法) ...

最新文章

  1. 如何测试ASP.NET Core Web API
  2. PowerBI从SCCM数据库中分析数据和KPI展现
  3. 以太坊发token教程
  4. javascript创建对象 1
  5. Linux下C编程入门(7)
  6. 2015-05-27 用正则把oracle时间转化到mysql时间
  7. Flutter实现帧动画
  8. 【audio】耳机插拔 线控按键识别流程【转】
  9. cpout引脚是干什么的_FPGA中差分信号的定义和使用(一)
  10. 这个小伙因WannaCry勒索软件一夜成名,获得一年免费披萨
  11. Forms(The Definitive Guild to Django)
  12. mysql upsert语法_mysql – SQL标准UPSERT调用
  13. mysql 图像数据类型_MySQL数据类型
  14. 如何把java源码打成jar_将java源码打成jar包
  15. 第二章笔记:计数初步
  16. C++ 输出tm结构的各个组成部分
  17. 移动宽带安装说明一(刘欣)
  18. Linux 下 Shell 命令 IFS 分隔符 -- 应用场景 解决办法
  19. 产品设计公司该如何做好产品创新?
  20. 从李嘉图定律看程序员的收入差距

热门文章

  1. ae去闪插件deflicker使用_Ae/Pr视频去闪烁插件REVisionFX DEFlicker v1.7.1 Win大众脸已注册...
  2. Mac SDK环境变量配置
  3. Android studio环境变量配置及其作用(JDK与SDK配置)
  4. 复杂系统学习(五):细胞自动机 I:1D 和 2D CAs
  5. 编写测试用例方法之等价类划分法
  6. VMware-workstation 密钥
  7. java web表单系统
  8. 企业微信API使用基本教程
  9. 微软lumia固件服务器,IT之家学院:微软Lumia 950 XL刷Win10 ARM64教程增补进阶版
  10. Centos7安装iNode客户端