整数规划-分支定界法

分支定界法

  • 分支定界法由来
  • 分支定界法原理
  • 分支定界法思想
  • 疑惑or改进?

分支定界法由来

谨以此博客作为学习期间的记录

在生活中,整数规划(IP)或者混合整数规划(MIP)往往要比单纯的线性规划(LP)应用更为广泛。生产计划、库存规划等,都有着变量或部分变量为整数的要求。那么对于这些特殊限制(变量为整数),该如何高效求解呢?

在某些特定的条件下,线性规划的最优解为整数解,如下:
m i n c T x s . t . { A x ≥ b x ≥ 0 \begin{align*} min \quad & \mathbf{c}^T \mathbf{x} \\ s.t. \quad & \begin{cases} \mathbf{Ax} \geq \mathbf{b} \\ \mathbf{x} \geq \mathbf{0} \end{cases} \\ \end{align*} mins.t.cTx{Axbx0
其中,

  • c \mathbf{c} c 是包含目标函数系数的列向量;
  • x \mathbf{x} x是决策变量的列向量;
  • A \mathbf{A} A是包含约束条件系数的矩阵;
  • b \mathbf{b} b是包含约束条件右侧常数的列向量。

在上面的问题中,如果 A A A为幺模矩阵,那么即使不限定x为整数,最终得出的最优解也一定为整数解。
链接: 幺模矩阵-整数解特性
但是在大部分的规划问题中,A都并不满足幺模矩阵,单纯形法可以解决线性规划,但是并不能保证所得出的最优解为整数解,因此就需要一种单独针对整数变量求解的方法。
链接: 单纯形法原理

分支定界法原理

以一个实例介绍分支定界法的流程,实例参考《运筹优化常用模型、算法及案例实战——Python+Java实现》
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x ∈ Z n (整数限制) \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ \mathbf{x} \in \mathbb{Z}^n \quad \text{(整数限制)} \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20xZn(整数限制)
可行域绘制如下:
在这里插入图片描述

首先忽略 x x x为整数的限制,直接使用单纯形法进行求解。
子问题1:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20
最终解得到

Optimal Objective Value: 1055.5555555555554
x1 = 2.222
x2 = 5.556

将其向下取证,可以得到一个整数解

Optimal Objective Value: 950
x1 = 2
x2 = 5

那么根据求解结果,可以得到结论:最终的目标函数最优值将会介于[950,1055.56)之间。因为在max问题中,即使去掉了整数限制得到的最优值也只有1055.56,如果添加约束最优值只会更低,所以1055.56为目标函数值上界。而目前我们得到整数可行解的目标函数值为950,如果后续求到的解质量非常差,我们也可以把950当为问题的最优解,如果后续有更高质量的解,我们可以将更高质量的解作为最优解。根据当前解得情况,得到根节点。

子问题1:1055.56 ,x1 = 2.222,x2 = 5.556
UB = 1055.56 ,x1 = 2.222,x2 = 5.556
LB = 950,x1 = 2,x2 = 5

由于 x 2 x_2 x2的小数部分更大,为0.556。接下来以 x 2 x_2 x2将原问题进行划分为 x 2 ≤ 5 , x 2 ≥ 6 x_2 \leq 5,x_2\geq 6 x25,x26两部分
子问题2:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≤ 5 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \leq 5 \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x25
求解得到

Optimal Objective Value: 1000.0
x1 = 2.5
x2 = 5.0

子问题3:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≥ 6 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \geq 6 \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x26
求解得到

Optimal Objective Value: 1033.3333333333333
x1 = 1.333
x2 = 6.0

由于求解得到的都不是整数解,所以下界(LB)无需更新。而子问题2的当前解小于当前上界,故上界更新。子问题3的当前解小于当前上界,故上界更新。
更新求解树

x2<=5
x2>=6
子问题1:1055.56 ,x1 = 2.222,x2 = 5.556
UB = 1055.56 ,x1 = 2.222,x2 = 5.556
LB = 950,x1 = 2,x2 = 5
子问题2:1000.0,x1 = 2.5,x2 = 5.0
UB = 1000.0,x1 = 2.5,x2 = 5.0
LB = 950,x1 = 2,x2 = 5
子问题3:1033.33,x1 = 1.333,x2 = 6.0
UB = 1033.33,x1 = 1.333,x2 = 6.0
LB = 950,x1 = 2,x2 = 5

可行域划分如下
在这里插入图片描述
由于子问题3的上界大于子问题2的上界。那么可以假设子问题3具有更大的潜力,因此优先从子问题3开始搜索。

由于子问题3中 x 1 x_1 x1的小数部分更大,为0.333。接下来以 x 1 x_1 x1将原问题进行划分为 x 1 ≤ 1 , x 2 ≥ 2 x_1 \leq 1,x_2\geq 2 x11,x22两部分
子问题4:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≥ 6 x 1 ≤ 1 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \geq 6 \\ x_1 \leq 1 \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x26x11
求解得到

Optimal Objective Value: 1025.0
x1 = 1.0
x2 = 6.167

子问题5:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≥ 6 x 1 ≥ 2 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \geq 6 \\ x_1 \geq 2 \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x26x12
求解得到

Infeasible or unbounded model

子问题5不可行。
由于求解得到的都不是整数解,所以下界(LB)无需更新。而子问题4的当前解小于当前上界,故上界更新。
更新求解树

x2<=5
x2>=6
x1<=1
x1>=2
子问题1:1055.56 ,x1 = 2.222,x2 = 5.556
UB = 1055.56 ,x1 = 2.222,x2 = 5.556
LB = 950,x1 = 2,x2 = 5
子问题2:1000.0,x1 = 2.5,x2 = 5.0
UB = 1000.0,x1 = 2.5,x2 = 5.0
LB = 950,x1 = 2,x2 = 5
子问题3:1033.33,x1 = 1.333,x2 = 6.0
UB = 1033.33,x1 = 1.333,x2 = 6.0
LB = 950,x1 = 2,x2 = 5
子问题4:1025.0,x1 = 1.0,x2 = 6.167
UB = 1025.0,x1 = 1.0,x2 = 6.167
LB = 950,x1 = 2,x2 = 5
子问题5:不可行解

只能从子问题4开始搜索了,继续划分为 x 2 ≤ 6 , x 2 ≥ 7 x_2 \leq 6,x_2 \geq 7 x26,x27
子问题6:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≥ 6 x 1 ≤ 1 x 2 ≤ 6 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \geq 6 \\ x_1 \leq 1\\ x_2 \leq 6 \\ \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x26x11x26
求解得到

Optimal Objective Value: 1000.0
x1 = 1.0
x2 = 6.0

子问题7:
m a x z = 100 x 1 + 150 x 2 s . t . { 2 x 1 + x 2 ≤ 10 3 x 1 + 6 x 2 ≤ 40 x 1 , x 2 ≥ 0 x 2 ≥ 6 x 1 ≤ 1 x 2 ≥ 7 \begin{align*} max \quad &z = 100x_1 + 150x_2 \\ s.t. \quad & \begin{cases} 2x_1+x_2 \leq 10 \\ 3x_1+6x_2 \leq 40 \\ x_1,x_2 \geq 0\\ x_2 \geq 6 \\ x_1 \leq 1\\ x_2 \geq 7 \\ \end{cases} \\ \end{align*} maxs.t.z=100x1+150x2 2x1+x2103x1+6x240x1,x20x26x11x27
求解得到

Infeasible or unbounded model

模型无解。
由于子问题6得出了整数解,且整数解大于下界,因此上界下界同时更新。
更新之后的求解树如下:

x2<=5
x2>=6
x1<=1
x1>=2
x2<=6
x2>=7
子问题1:1055.56 ,x1 = 2.222,x2 = 5.556
UB = 1055.56 ,x1 = 2.222,x2 = 5.556
LB = 950,x1 = 2,x2 = 5
子问题2:1000.0,x1 = 2.5,x2 = 5.0
UB = 1000.0,x1 = 2.5,x2 = 5.0
LB = 950,x1 = 2,x2 = 5
子问题3:1033.33,x1 = 1.333,x2 = 6.0
UB = 1033.33,x1 = 1.333,x2 = 6.0
LB = 950,x1 = 2,x2 = 5
子问题4:1025.0,x1 = 1.0,x2 = 6.167
UB = 1025.0,x1 = 1.0,x2 = 6.167
LB = 950,x1 = 2,x2 = 5
子问题5:不可行解
子问题6:1000.0,x1 = 1.0,x2 = 6.0
UB = 1000.0,x1 = 1.0,x2 = 6.0
LB =1000.0,x1 = 1.0,x2 = 6.0
子问题7:不可行解

此时子问题6的上界等于下界,算法收敛,退出。
最优解如下:

Optimal Objective Value: 1000.0
x1 = 1.0
x2 = 6.0

那么,还有一个问题。就这样结束了吗?子问题2还没有进行搜索,就可以确定子问题6的解为原问题最优解了吗?

答: 子问题2无需再搜索了,子问题2当前UB为1000,继续往下搜索,增加约束,UB只会越来越低,因此子问题2的孩子节点不可能再有解>1000的情况,因此可以确定子问题6得出的解即为最优解。

分支定界法思想

分支定界法的核心思想有以下几部分

  1. 对可行域的划分,根据当前非整数解划分解空间
  2. 剪枝策略

疑惑or改进?

在子问题中,如果将求解得到的非整数解向下取整,若可行,同样可以更新下界。这样上界和下界同时更新,模型可以更快收敛。为什么没有这样做呢?

上述用到的代码链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/265651.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STL中优先队列的模拟实现与仿函数的介绍

文章目录 仿函数优先队列的模拟实现 仿函数 上回我们说到&#xff0c;优先队列的实现需要用到仿函数的特性 让我们再回到这里 这里我们发现他传入的用于比较的东西竟然是一个类模板&#xff0c;而不是我们所见到的函数 我们可以先创建一个类&#xff0c;用于比较大小 struc…

【toolschain algorithm cpp ros】cpp工厂模式实现--后续填充具体规划算法,控制器版的已填充了算法接入了仿真器

写在前面 现在局势危机&#xff0c;于是想复习一下之前写的设计模式&#xff0c;之前提到&#xff0c;做过一个闭环仿真器&#xff08;借用ros&#xff09;&#xff0c;见https://blog.csdn.net/weixin_46479223/article/details/134864123我的控制器的建立遵循了工厂模式&…

Excel 获取当前行的行数

ROW() 获取当前行 ROW()1 获取当前行然后支持二次开发

视频号小店一件代发怎么做?

我是电商珠珠 视频号团队于22年7月开始发展自己的电商平台-视频号小店。由于是新平台&#xff0c;并在今年开始有很多人关注。 所以平台相对来说并没有什么很严格的规则&#xff0c;特别是对于无货源一件代发这一块&#xff0c;没有什么成文的规定。 对于商家来说同样可以依…

阅读笔记-PRECISE ADJACENT MARGIN LOSS FOR DEEP FACE RECOGNITION

PRECISE ADJACENT MARGIN LOSS FOR DEEP FACE RECOGNITION 深度人脸识别的精确相邻边缘损失 1、这篇论文要解决什么问题&#xff1f;要验证一个什么科学假设&#xff1f; 问题&#xff1a;首先&#xff0c;在以往的损失函数中提到的“边际”是Softmax 决策边界之间的边际&am…

JDBC 知识点总结篇

JDBC 知识点总结篇 JDBC 接口 Java DataBase Connectivity Java数据库连接&#xff0c;由官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口&#xff0c;各个数据库厂商实现该套接口 代码 // 本代码只提供一个样例&#xff0c;请根据自己实际情况修改代码 // 1.…

如何使用 NFTScan NFT API 在 Base 网络上开发 Web3 应用

Base 是 Coinbase 使用 OP Stack 开发的最新以太坊第 2 层&#xff08;L2&#xff09;网络&#xff0c;用于解决以太坊等主要区块链面临的可扩展性和成本挑战。Coinbase 将其描述为“安全、低成本、对开发人员友好的以太坊 L2&#xff0c;旨在将下一个 10 亿用户带入 Web3”。B…

一个简化版的IPD产品开发各阶段的流程

IPD好不好&#xff1f;当然好&#xff01;IPD适不适合我们行业&#xff1f;当然适合&#xff0c;可以说&#xff0c;任何一个行业都可以借鉴IPD的理念和实践提高产品开发的效率&#xff0c;提升客户满意度。IPD复不复杂&#xff1f;当然复杂&#xff01; 关于IPD的框架和体系&…

【Linux基础开发工具】gcc/g++使用make/Makefile

目录 前言 gcc/g的使用 1. 语言的发展 1.1 语言和编译器自举的过程 1.2 程序翻译的过程&#xff1a; 2. 动静态库的理解 Linux项目自动化构建工具-make/makefile 1. 快速上手使用 2. makefile/make执行顺序的理解 前言 了解完vim编辑器的使用&#xff0c;接下来就可以尝…

Java程序员-你真的了解死锁吗

Java程序员-你真的了解死锁吗 ​ &#x1f495;"i need your breath"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容:死锁的成因和必要条件 ​​ ​​​​​ 一.什么是死锁 死锁&#xff1a;就是多个线程/进程因为相互等待而使得各自持有的资源无法继续执行&am…

❀My学习Linux小记录之UID和GID(用户ID和组ID)❀

❀My学习Linux小记录之UID和GID&#xff08;用户ID和组ID&#xff09;❀ 目录 ❀My学习Linux小记录之UID和GID&#xff08;用户ID和组ID&#xff09;❀ 用户ID&#xff08;UID&#xff09; 组ID&#xff08;GID&#xff09; 登陆 Linux 系统时&#xff0c;虽然输入的是自己…

Iceberg:ZOrder的实现及执行流程分析

ZOrder简介 使用Z-Order索引&#xff0c;可以按任意维度对数据进行排序&#xff0c;以获得更加高效且均衡地范围查询。它即可以作为一级索引&#xff0c;直接影响底层数据组织形式&#xff0c;甚至可以取代二索引&#xff08;更加节省内存&#xff0c;吞吐量也理更高&#xff…

调度工具之dolphinscheduler篇

前言 随着开发程序的增多&#xff0c;任务调度以及任务之间的依赖关系管理就成为一个比较头疼的问题&#xff0c;随时少量的任务可以用linux系统自带的crontab加以定时进行&#xff0c;但缺点也很明细&#xff0c;不够直观&#xff0c;以及修改起来比较麻烦&#xff0c;容易出…

【MybatisPlus快速入门】(3)SpringBoot整合MybatisPlus 之 Lombok插件安装及MybatisPlus分页代码示例

目录 1.Lombok1.1 步骤1:添加lombok依赖 2.2 步骤2:安装Lombok的插件1.3 步骤3:模型类上添加注解2 分页功能2.1 步骤1:调用方法传入参数获取返回值2.2步骤2:设置分页拦截器2.3 步骤3:运行测试程序 之前我们已学习MyBatisPlus在代码示例与MyBatisPlus的简介&#xff0c;在这一节…

07-JVM调优工具详解及调优实战

文章目录 前置启动程序Jmap堆信息堆内存dump Jstack远程连接jvisualvm启动普通的jar程序JMX端口配置tomcat的JMX配置 jstack找出占用cpu最高的线程堆栈信息 JinfoJstat垃圾回收统计堆内存统计新生代垃圾回收统计新生代内存统计老年代垃圾回收统计老年代内存统计元数据空间统计J…

【MySQL】MySQL的数据类型

MySQL的数据类型 一、数据类型分类二、数值类型1、整数类型2、bit类型3、小数类型 三、字符串类型四、时间日期类型五、enum和set类型enum和set查找 数据类型的作用&#xff1a; 决定了存储数据时应该开辟的空间大小和数据的取值范围。决定了如何识别一个特定的二进制序列。 …

MySQL子查询、WITH AS、LAG查询统计数据实战

需求 给出一个比较常见的统计类业务需求&#xff1a;统计App&#xff08;包括iOS和Android两大类&#xff09;每日新注册用户数、以及累计注册用户数。 数据库采用MySQL&#xff0c;根据上面的需求&#xff0c;不难设计表如下&#xff1a; create table os_day_count(stat_d…

原型链污染[JavaScript]

一、原型链污染 此类型一般存在以nodejs编写的后端程序当中&#xff0c;其中Express是一个流行的Node.js Web应用程序框架 1.JavaScript 1.1 原理 引入 解释&#xff1a;直接先读代码来理解原型链污染 // let jack {b:2} console.log(typeof jack) // 它的类型是obejct con…

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

React 中的 ref 和 refs:解锁更多可能性(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…
最新文章