引入

线性规划问题(松弛问题)

图解法:
使用图解法求出最优解,再使用四舍五入求出的整数解不满足条件

完全枚举法(穷举法):找出集合内所有满足条件的整数点,再带入不等式中,看是否有最优解

分支限界法

说明:
松弛问题:线性规划问题
ILP:整数规划,在线性规划的基础上对决策变量进行取整
所以线性规划无可行解则整数规划也无可行解

增加约束条件,一个个来,一次增加一个
对原始结果进行向上取整 [4.6]=5
对原始结果进行向下取整 [4.6]=4

流程:
如果添加完约束之后仍然没有找到整数解,那么此时分支限界法已经不能解决此问题了

案例

整数规划的最优解只是针对决策变量x的,与目标值Z无关
所以x1=4;x2=1;z=14.3(是整数规划的最优解)
1)当增加了x1<=3的条件之后,得出的结果中出现了非整数x2=2.67;所以此时还需要对x2向下取整与向上取整,看结果对比


判断:
得到目标值高的先进行分支

matlab代码

branchbound.m

function [newx,newfval,status,newbound] = branchbound(f,A,B,I,x,fval,bound,Aeq,Beq,lb,ub,e)% 分支定界法求解整数规划
% f,A,B,Aeq,Beq,lb,ub与线性规划相同
% I为整数限制变量的向量
% x为初始解,fval为初始值options = optimset('display','off');
[x0,fval0,status0]=linprog(f,A,B,Aeq,Beq,lb,ub,[],options);%递归中的最终退出条件
%无解或者解比现有上界大则返回原解
if status0 <= 0 || fval0 >= boundnewx = x;newfval = fval;newbound = bound;status = status0;return;
end%是否为整数解,如果是整数解则返回
intindex = find(abs(x0(I) - round(x0(I))) > e);
if isempty(intindex) %判断是否为空值newx(I) = round(x0(I));newfval = fval0;newbound = fval0;status = 1;return;
end%当有非整可行解时,则进行分支求解
%此时必定会有整数解或空解
%找到第一个不满足整数要求的变量
n = I(intindex(1));
addA = zeros(1,length(f));
addA(n) = 1;
%构造第一个分支 x<=floor(x(n))
A = [A;addA];
B = [B,floor(x(n))];%向下取整
[x1,fval1,status1,bound1] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
A(end,:) = [];
B(:,end) = [];
%解得第一个分支,若为更优解则替换,若不是则保持原状status = status1;
if status1 > 0 && bound1 < boundnewx = x1;newfval = fval1;bound = fval1;newbound = bound1;
elsenewx = x0;newfval = fval0;newbound = bound;
end%构造第二分支
A = [A;-addA];
B = [B,-ceil(x(n))];%向上取整
[x2,fval2,status2,bound2] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
A(end,:) = [];
B(:,end) = [];%解得第二分支,并与第一分支做比较,如果更优则替换
if status2 > 0 && bound2 < boundstatus = status2;newx = x2;newfval = fval2;newbound = bound2;
end

intprog.m

function [x,fval,status] = intprog(f,A,B,I,Aeq,Beq,lb,ub,e)
%整数规划求解函数 intprog()
%     其中 f为目标函数向量
%     A和B为不等式约束 Aeq与Beq为等式约束
%     I为整数约束
%     lb与ub分别为变量下界与上界
%     x为最优解,fval为最优值
%例子:
%        maximize 20 x1 + 10 x2
%        S.T.
%                5 x1 + 4 x2 <=24
%                2 x1 + 5 x2 <=13
%                   x1, x2 >=0
%                   x1, x2是整数
% f=[-20, -10];
% A=[ 5  4; 2 5];
% B=[24; 13];
% lb=[0 0];
% ub=[inf inf];
% I=[1,2];
% e=0.000001;
% [x v s]= IP(f,A,B,I,[],[],lb,ub,,e)
% x = 4     1  v = -90.0000   s = 1% 控制输入参数
if nargin < 9, e = 0.00001;if nargin < 8, ub = []; if nargin < 7, lb = []; if nargin < 6, Beq = []; if nargin < 5, Aeq = [];if nargin < 4, I = [1:length(f)];end, end, end, end, end, end%求解整数规划对应的线性规划,判断是否有解
options = optimset('display','off');
[x0,fval0,exitflag] = linprog(f,A,B,Aeq,Beq,lb,ub,[],options);
if exitflag < 0disp('没有合适整数解');x = x0;fval = fval0;status = exitflag;return;
else%采用分支定界法求解bound = inf;[x,fval,status] = branchbound(f,A,B,I,x0,fval0,bound,Aeq,Beq,lb,ub,e);
end

test.m

%例子1
% f = [-40 -90];%A = [9 7;7 20];%B = [56 70];
% lb = [0 0]';
%例子2f = [-20 -10];A = [5 4;2 5];B = [24 13];lb = [0 0];[x,fval,status] = intprog(f,A,B,[1 2],[],[],lb)

数学建模 分支限界算法求解整数规划原理以及编程实现相关推荐

  1. 数学建模 割平面算法求解整数规划基本原理与编程实现

    基本思想 松弛问题:线性规划 割掉一块全部都是小数的区域(这一部分取不到整数) 案例 1)横坐标x1,纵坐标x2 2)蓝色小三角形的区域:x2:(1,7/4) x1:(0,3/4) 这块区域,x1与x ...

  2. 数学建模 匈牙利算法求解整数规划基本原理与编程实现

    投资问题(0-1规划) 匈牙利算法求解0-1规划问题 解答: 项目之间是互斥关系,所以使用x1+x2+x3=1; 项目5是以项目1为先验条件,所以x5<=x1,意味着x1=1时,x5=1或0 , ...

  3. 数学建模——差分算法(求解偏微分方程)

    差分算法(求解偏微分方程) 差分算法是数学建模比赛中的一种十分常见的代码,在2018A题和2020A中均用到一维热传导模型,模型的求解用的就是差分算法,具体如何解可以自己去查看相关论文. 定义 差分方 ...

  4. 数学建模、运筹学之整数规划(原理、例题、代码)

    数学建模.运筹学之整数规划(原理.例题.代码) 一.何为整数规划? 二.整数规划与线性规划 三.分枝定界法 四.0-1整数规划 一.何为整数规划? 整数规划具有深远的实际应用价值,因为现实生活中的规划 ...

  5. 数学建模之减肥计划 matlab编程,数学建模matlab算法大全第02章整数规划.pdf

    数学建模matlab算法大全第02章整数规划 第二章 整数规划 §1 概论 1.1 定义 规划中的变量(部分或全部)限制为整数时,称为整数规划.若在线性规划模型中, 变量限制为整数,则称为整数线性规划 ...

  6. 数学建模–模拟退火算法

    文章目录 数学建模--智能算法 1.简介 模拟退火算法 1. 简介 2.数学建模中的模拟退火算法原理 3.模拟退火算法流程及应用 1.Metropolis采样算法 2. 退火过程实现算法 3.举个栗子 ...

  7. 数学建模基本算法模型Chapter1--线性规划

    数学建模基本算法模型Charpter1–线性规划(LP) By 进栈需检票 一.线性规划基本概念 1.Linear Programming (LP问题) 列出方程组不等式求解(基本形式) 包含目标函数 ...

  8. 数学建模图论算法学习总结

    数学建模图论算法学习总结 图论基本知识 B站视频: https://www.bilibili.com/video/av18374161/?p=35 https://www.bilibili.com/v ...

  9. 数学建模必备算法模型,全新升级!

    转眼间2019年已经过去了四分之一,近日,2019年数学建模国赛的时间也已经出来啦,确定为9月12日(周四)18时至9月15日(周日)20时. 随着各种各样的数模比赛源源不断地开展,时不时有小伙伴私聊 ...

最新文章

  1. 上交2017计算机专业就业,上海交通大学计算机科学与工程系(CSE)
  2. IIS6.0 日期格式问题
  3. strong、copy和mutableCopy详解
  4. 使用镜像源安装EASY_INSTALL和PIP教程
  5. Centos或者Redhet开通telnet
  6. azure webjob java_使用 WebJobs 运行后台任务 | Azure Docs
  7. GeoServer使用CSS渲染地图
  8. 用css sprites(图像拼合技术)优化css加快网站速度[转]
  9. 树和森林与二叉树的转换、树和森林的遍历
  10. 文件下载时,IE与FireFox对文件名编码的不同处理! Content-Disposition
  11. 手把手教你玩华为eNSP模拟器
  12. 2016版excel_想要下班直接打卡,这些Excel技巧可以帮到你
  13. java动态生成pdf 合并两个pdf文件功能三
  14. HDU1922 POJ3004 Subway planning “神题”留名
  15. 用Xenu检查死链发现域名后有//
  16. 研发质量管理工作经验总结(二)----质量管理技能
  17. scala简介 什么是Scala?
  18. LocalDateTime计算两个时间的间隔
  19. Apple TV 人机界面指南
  20. 菜鸟零基础建站入门指引(仅供参考)

热门文章

  1. 第二节:重写(new)、覆写(overwrite)、和重载(overload)
  2. 使用 Syslog 连接 Sentinel
  3. 软件测试几个概念 --dev sit uat
  4. 简易有WEB文件服务器,Python实现简易版的Web服务器(推荐).pdf
  5. 连续反应matlab,MATLAB和Monte Carlo法在连续反应动力学中的应用.pdf
  6. win7和mysql乱码,win7 mysql中文乱码怎么处理
  7. 【牛客 - 188C】水图(bfs树的直径,思维)
  8. 【POJ - 2909 】Goldbach's Conjecture (哥德巴赫猜想,数论,知识点结论)
  9. phison主控ps3111量产工具_从固态硬盘拆解看门道 深入解读闪存编号和主控容量...
  10. 建房子 最安全图纸_妄想山海初期该怎么办?砍树狩猎建房子,还能拆别人的房子...