3整数规划-分支定界法

news/2025/10/2 9:02:23/文章来源:https://www.cnblogs.com/flowers-city/p/19123195

分支定界法(Branch and Bound Method

一、分支定界法概述

1. 定义与定位

分支定界法是求解 整数规划问题(纯整数、混合整数、0-1规划)的 核心全局优化算法,由 Land 和 Doig 于1960年提出。
其核心思想是通过“分支”(将可行域分解为子区域)和“定界”(确定最优解的上下边界),逐步排除非最优子区域(剪枝),最终找到整数最优解,避免穷举法的低效性。

2. 适用范围

  • 纯整数规划:所有决策变量均需为整数;
  • 混合整数规划:部分决策变量为整数,其余为连续变量;
  • 0-1规划:决策变量仅取 $0$ 或 $1$(可视为纯整数规划的特例,分支定界法可处理,但匈牙利法更高效)。

二、核心原理:分支、定界与剪枝

1. 三大核心逻辑

逻辑模块 核心目标 具体操作
分支(Branch) 缩小可行域 选取非整数解的变量,添加“上界/下界”约束,将原问题分解为两个互斥的子问题(子问题可行域无交集,且并集为原问题可行域的子集)
定界(Bound) 确定最优解范围 - 上界(UB):所有未剪枝子问题的松弛解目标值的最大值(初始上界为原问题松弛解的目标值);
- 下界(LB):已找到的整数解目标值的最大值(初始下界为 $-\infty$,找到第一个整数解后更新)
剪枝(Prune) 排除非最优子区域 若某子问题的松弛解目标值 $\leq$ 当前下界(或子问题无解),则该子问题无可能包含最优解,直接舍弃(剪枝),无需进一步分支

三、完整求解步骤(含剪枝逻辑)

分支定界法的求解过程是 迭代循环,直至所有子问题被“剪枝”或找到整数最优解。

  1. 步骤1:求解松弛问题
    去掉整数约束,求解对应的线性规划(松弛问题),得到松弛解 $x^$ 和目标值 $z^$。

  2. 步骤2:判断松弛解性质

    • 若松弛问题 无解:原整数规划无解,终止计算;
    • 若松弛解 $x^$ 满足整数约束:该解即为整数最优解(因松弛解是整数规划的上界,此时 $UB=LB=z^$),终止计算;
    • 若松弛解 $x^$ 不满足整数约束:进入“分支”步骤,同时将 $z^$ 设为初始上界(UB)。
  3. 步骤3:分支操作
    选取一个 非整数变量 $x_i$,添加两个互斥约束:

    • 子问题1:
      \(x_i \leq \lfloor x_i^* \rfloor\)
    • 子问题2:
      \(x_i \geq \lceil x_i^* \rceil\)
  4. 步骤4:定界与剪枝
    分别求解两个子问题的松弛解,判断:

    • 若子问题 无解:剪枝;

    • 若子问题松弛解目标值 $\leq LB$:剪枝;

    • 若子问题松弛解目标值 $> LB$:

      • 若松弛解满足整数约束:更新 $LB=\max(LB, z)$,剪枝;
      • 若松弛解不满足整数约束:保留,继续分支。
  5. 步骤5:重复迭代
    对未剪枝的子问题,继续执行步骤3–4,直至所有子问题被剪枝。最终 $LB$ 对应的整数解即为最优解。


四、经典案例演示

1. 问题条件

目标函数:
\(\max z = 3x_1 + x_2\)

约束条件:
\(2x_1 + 3x_2 \leq 14\)
\(2x_1 + x_2 \leq 24\)
\(x_1, x_2 \geq 0,\quad x_1,x_2 \in \mathbb{Z}\)

2. 求解过程

(1)初始松弛问题
最优解 $(x_1=3.25, x_2=2.5)$,$z^*=14.75$(非整数)。
边界:$UB=14.75, \ LB=-\infty$。

(2)第一次分支(以 $x_1=3.25$ 分支)

  • 子问题1($x_1 \leq 3$):解 $(3,2.67)$,$z=10.3$(非整数,保留);
  • 子问题2($x_1 \geq 4$):解 $(4,1)$,$z=14$(整数,更新 $LB=14$)。

此时:$UB=10.3,\ LB=14$。

(3)第二次分支(对子问题1分支,$x_2=2.67$)

  • 子问题1-1($x_2 \leq 2$):$z=13 < LB$,剪枝;
  • 子问题1-2($x_2 \geq 3$):$z=13.5 < LB$,剪枝。

(4)终止
所有子问题均剪枝,最优解为 $(x_1=4, x_2=1)$,最优值 $z=14$。


五、Matlab编程实现

1. 编程前提

  • linprog 只支持最小化问题。若目标为最大化,需转化为最小化:
    \(\max z \ \Leftrightarrow\ \min (-z)\)
  • 自定义 branchbound.m(递归分支定界)和 intprog.m(入口函数)。

五、Matlab编程实现(完整代码)

1. 编程核心前提

  • Matlab的linprog函数仅支持最小值问题,若目标函数为最大值(如\(\max z\)),需转化为\(\min (-z)\),求解后还原符号;
  • 需自定义branchbound.m(分支定界逻辑)和intprog.m(整数规划入口函数),协同实现迭代与剪枝。

2. 关键函数与参数

函数/参数 作用说明
linprog(f,A,B,Aeq,Beq,lb,ub,options) 求解线性规划松弛问题,f为目标函数向量,A,B为不等式约束(\(Ax \leq B\)
optimset() 设置优化参数,如'Display','off'(不显示迭代过程)、'MaxIter',1000(最大迭代步数)
误差阈值(如\(1e-5\) 判断变量是否为整数:若$
整数约束向量I 标记整数变量(如I=[1,2]表示\(x_1,x_2\)为整数)

3. 完整代码示例(求解\(\max z=20x_1+10x_2\)

(1)问题转化

  • 目标函数转化:\(\min z' = -20x_1 -10x_2\)(对应f=[-20,-10]);
  • 约束:\(5x_1+4x_2 \leq24\)\(2x_1+5x_2 \leq13\)(对应A=[5 4;2 5]B=[24;13]);
  • 变量边界:\(x_1,x_2 \geq0\)lb=[0;0]ub=[inf;inf])。

(2)intprog.m(入口函数)

function [x, fval, status] = intprog(f, A, B, I, Aeq, Beq, lb, ub, e)% 输入参数:% f: 目标函数向量(最小值),A,B: 不等式约束Ax<=B,I: 整数变量索引% Aeq,Beq: 等式约束Aeqx=Beq,lb,ub: 变量上下界,e: 整数判断误差阈值% 输出参数:x: 最优整数解,fval: 最优目标值,status: 求解状态% 参数默认值设置if nargin < 4, I = [1:length(f)]; end  % 默认所有变量为整数if nargin < 5, Aeq = []; Beq = []; end  % 默认无等式约束if nargin < 6, Beq = []; endif nargin < 7, lb = zeros(length(f), 1); end  % 默认下界为0if nargin < 8, ub = inf(length(f), 1); end    % 默认上界为infif nargin < 9, e = 1e-5; end  % 默认误差阈值1e-5% 求解初始松弛问题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;end% 调用分支定界函数求解bound = inf;  % 初始上界(最小值问题,上界为inf)[x, fval, status] = branchbound(f, A, B, I, x0, fval0, bound, Aeq, Beq, lb, ub, e);% 若为最大值问题,还原目标值符号(此处f已转化为最小值,故无需额外处理)
end

(3)branchbound.m(分支定界逻辑)

function [x, fval, status] = branchbound(f, A, B, I, x0, fval0, bound, Aeq, Beq, lb, ub, e)% 递归实现分支定界逻辑x = [];fval = bound;status = 0;% 1. 判断当前松弛解是否为整数解is_integer = true;for i = Iif abs(x0(i) - round(x0(i))) > e  % 非整数变量is_integer = false;break;endend% 2. 若为整数解,更新最优解if is_integerx = x0;fval = fval0;status = 1;return;end% 3. 若松弛解目标值≥当前上界,剪枝(最小值问题,更大的目标值无意义)if fval0 >= bound - estatus = -1;return;end% 4. 选择分支变量(此处选第一个非整数变量,可优化为“目标系数最大”策略)branch_var = -1;for i = Iif abs(x0(i) - round(x0(i))) > ebranch_var = i;break;endend% 5. 构造两个子问题的约束(添加分支变量的上下界)xi = x0(branch_var);floor_xi = floor(xi);  % 向下取整ceil_xi = ceil(xi);    % 向上取整% 子问题1:x(branch_var) ≤ floor_xiA1 = [A; zeros(1, length(f))];A1(end, branch_var) = 1;B1 = [B; floor_xi];[x1, fval1, status1] = linprog(f, A1, B1, Aeq, Beq, lb, ub, [], optimset('Display','off'));% 子问题2:x(branch_var) ≥ ceil_xiA2 = [A; zeros(1, length(f))];A2(end, branch_var) = -1;  % 转化为 -x ≤ -ceil_xi → x ≥ ceil_xiB2 = [B; -ceil_xi];[x2, fval2, status2] = linprog(f, A2, B2, Aeq, Beq, lb, ub, [], optimset('Display','off'));% 6. 递归求解子问题1if status1 >= 0[x1_int, fval1_int, status1_int] = branchbound(f, A1, B1, I, x1, fval1, min(bound, fval), Aeq, Beq, lb, ub, e);if status1_int == 1 && fval1_int < fvalfval = fval1_int;x = x1_int;status = 1;endend% 7. 递归求解子问题2if status2 >= 0[x2_int, fval2_int, status2_int] = branchbound(f, A2, B2, I, x2, fval2, min(bound, fval), Aeq, Beq, lb, ub, e);if status2_int == 1 && fval2_int < fvalfval = fval2_int;x = x2_int;status = 1;endend
end

(4)测试脚本(test.m

% 测试:max z=20x1+10x2,约束5x1+4x2≤24,2x1+5x2≤13,x1,x2≥0且为整数
f = [-20, -10];  % 转化为min(-z)
A = [5 4; 2 5];
B = [24; 13];
I = [1, 2];  % x1,x2为整数
lb = [0; 0];
ub = [inf; inf];[x, fval, status] = intprog(f, A, B, I, [], [], lb, ub);% 输出结果(还原最大值目标值)
disp('最优整数解:');
disp(x);
disp('最优目标值(max z):');
disp(-fval);  % 因f为-min(z),故还原为-z

(5)运行结果

最优整数解:41
最优目标值(max z):90

六、关键补充知识点

1. 分支变量选择策略

策略名称 逻辑 适用场景
目标系数优先策略 选择目标函数系数绝对值最大的非整数变量 收敛快
离整数最远策略 选择 $ | x_i^* - \lfloor x_i^* \rfloor | $ 最大者 快速缩小可行域
字典序策略 选择下标最小的非整数变量 简单易实现

2. 算法优缺点

  • 优点:全局最优;比穷举高效;适用范围广。
  • 缺点:大规模问题效率低;依赖松弛解质量;剪枝不一定高效。

3. 与其他算法对比

算法 优点 缺点 适用场景
分支定界法 全局最优;适用面广 大规模耗时 通用整数规划
割平面法 不需分支 约束增多 中小规模纯整数
匈牙利法 多项式时间 仅限0-1指派 任务分配
穷举法 简单直观 指数复杂度 变量极少

4. 应用场景

  • 生产计划(产品数量)
  • 物流调度(车辆数)
  • 资源分配(整数金额)
  • 选址问题(0-1决策)

七、常见问题与注意事项

  1. 浮点误差:需设阈值(如 $10^{-5}$)判断整数性。
  2. 无限循环:设置 MaxIterMaxFunEvals 防止卡死。
  3. 混合整数规划:仅对整数变量分支。
  4. 等式约束:分支不改变等式约束。

八、总结

分支定界法是整数规划的 通用全局优化算法,通过

  • 分支(划分可行域)、
  • 定界(上下界控制)、
  • 剪枝(排除劣解),

保证全局最优解。实际应用中,合理的 分支变量选择剪枝策略 能显著提升求解效率。


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西安网站建设服务网站备案个人使用

Android Deobfuscation11/11/2019本文内容ProGuard、DexGuard 和 R8 是用于对 Android 应用程序的代码进行优化和模糊处理的工具。 它会删除未使用的代码、重命名具有语义模糊名称的类、字段和方法&#xff0c;使基本代码更小&#xff0c;更难反向工程。 若要在 Android 应用中…

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)

完整教程:Ubuntu 系统安装 Prometheus+Grafana(附shell脚本一键部署↓)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family…

网站的设计与制作论文题目成都高端网站建设哪家好

这世界上有后悔药– www.houhuiyao.cc 后悔药数据恢复 站长语前面的内容也提到过update或delete误更新删除了数据后如何恢复。实际生产环境中常常因各种不同场景导致一些办法有效一些办法无效&#xff0c;当然&#xff0c;最有效的办法依然是备份&#xff01;虽然啰嗦&#xff…

重庆市住房和城乡建设部网站自己怎么开发app软件

文章目录 性能比较区别使用方式和行为 性能比较 最终总结&#xff1a;如果数据在1万以内的话&#xff0c;for循环效率高于foreach和stream&#xff1b;如果数据量在10万的时候&#xff0c;stream效率最高&#xff0c;其次是foreach,最后是for。另外需要注意的是如果数据达到10…

详细介绍:【计算机视觉】形态学的去噪

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

阿里巴巴做网站的电话号码wordpress社

JavaScript返回上一页代码区别&#xff1a; window.history.go(-1); //返回上一页window.history.back(); //返回上一页//如果要强行刷新的话就是&#xff1a;window.history.back();location.reload();window.location.go(-1); //刷新上一页

开封旅游网站建设网页推广莱西市城乡建设局网站

最近&#xff0c;Oracle采用了一种新策略&#xff0c;即每六个月发布一次新的语言版本。 该策略假定只有每个第3版都将提供长期支持或LTS。 快速说明&#xff1a; 具有LTS的当前版本是Java 8&#xff1b; Java 9仅应在2018年3月之前获得支持&#xff0c;因此已经结束。 Java…

[apple pencil二代充不上电]

不废话: 先不急着联系苹果官方ipad 插上电 2.apple pencil 2 吸附在旁边 3.等一夜 4.早上起来反复开关ipad蓝牙, 5.连上了

分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南

分布式光纤声波振动与AI的深度融合:开启智慧感知新时代 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选

2025液压扳手实力厂家推荐榜:精准扭矩与耐用品质专业之选在工业装备领域,液压扳手作为关键扭矩工具,其性能直接影响设备安装质量与运维安全。随着2025年工业技术标准的提升,市场对液压扳手的精度、耐用性及适配性提…

网站建设如何选择良好的服务器长沙网页制作网站

如何开展软件架构之概念架构 到目前为止&#xff0c;我们已经完成了需求的分析过程&#xff0c;总结来说&#xff0c;主要的步聚是 一&#xff09;需求结构化&#xff0c; 二&#xff09;分析约束影响 三&#xff09;重点关注质量需求。 那么接下来的阶段则是系统的概念架构了&…

做网站选云服务器内核大连建设网站制作

1、权限组件rbac 1、什么是权限 1 项目与应用 2 什么是权限&#xff1f; 一个包含正则表达式url就是一个权限 who what how ---------->True or Flase 2、版本1&#xff1a;用户表与权限url表 对应关系 # 版本1UserInforname pwdpermissionmodels.manytomany(Permissi…

工会网站建设请示可以做锚文本链接的网站

E201_06_02_正弦函数题目要求&#xff1a;按照三角函数泰勒级数展开式计算正弦函数值&#xff1a;,直到最后一项的绝对值小于106解题思路&#xff1a;1. 输入弧度2. 确定初始化值3. 求阶梯函数代码&#xff1a;public class E201_06_02_正弦函数 {public static void main(Stri…

Flutter完整开发指南 | FlutterDart – The Complete Guide - 教程

Flutter完整开发指南 | Flutter&Dart – The Complete Guide - 教程2025-10-02 08:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

Flutter实现闲鱼底部导航栏中间突出效果

Flutter实现闲鱼底部导航栏中间突出效果Posted on 2025-10-02 08:41 lifeisastory 阅读(0) 评论(0) 收藏 举报实现思路 在 Scaffold 组件中使用 bottomNavigationBar 和 floatingActionButton 属性建立底部导航栏…

2025试验机实力厂家品牌公司最新权威推荐榜:精准测试与技术创新标杆之选

在制造业转型升级与质量强国战略深入推进的背景下,试验机作为质量检测与材料研发的核心装备,正迎来前所未有的发展机遇。根据行业数据显示,2024年我国试验机市场规模已突破百亿元,年均复合增长率保持在12%以上,其…

AI元人文:价值共生体系统——构建人机文明的演进基石——DeeoSeek融合

AI元人文:价值共生体系统——构建人机文明的演进基石 摘要 本文针对传统AI"价值对齐"范式的局限性,提出"价值共生体系统"作为下一代智能系统的核心架构。该系统通过价值语义网络、共识决策引擎和…

详细介绍:大模型架构之GPT、LLaMA与PaLM模型

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025喷涂厂家TOP企业品牌推荐排行榜,喷涂、喷涂设备、 喷涂生产线、喷涂流水线推荐这十家公司!

在涂装行业快速发展的当下,企业对喷涂设备的需求日益提升,但诸多痛点却制约着行业升级。粉末回收效率低导致的原料浪费、换色耗时久引发的生产停滞、温度控制不准造成的涂层质量不稳定等问题,让不少企业陷入成本高企…

微科技h5制作网站模板下载网站开发的形式有

类型推导&#xff1a; 当使用 auto 关键字声明变量时&#xff0c;编译器会根据变量初始化的表达式推导出其类型。编译器会分析初始化表达式&#xff0c;并根据表达式的类型来确定变量的类型。 类型保留&#xff1a; 编译器在编译时将 auto 关键字替换为实际的类型&#xff0c;…