组合优化问题
组合优化(Combinatorial Optimization,CO)数学优化研究的一个分支。主要关注的是从有限的对象集合中寻找最优解的问题。这个词的由来主要是由“组合”和“优化”两部分构成。“组合”指的是从有限的对象集合中选择一部分的过程,而“优化”则指的是在满足一定条件下,使得某个目标函数达到最大或最小。即:组合优化问题的解集合有限个的,要做的事情是在有限的集合里面找到目标最优的集合。
组合优化问题在许多实际情况中都有出现,包括经济管理、工业制造、交通运输等领域。比如:
- 0-1 背包问题:如何把体积有限、价值有限,装入容积有限的背包里,获得最大价值的装包?
- 装箱问题,bin packing,如何装箱使得所用的箱子最少?
- TSP的旅行商问题:如何选择一条道路遍历每个城市,路径最短?
- 车间调度问题:车间的加工顺序如何安排完工时间最小?
- 地图块着色问题:如何采用少量的颜色给地图块着色,两两相邻颜色不一样?
组合优化问题特征:
- 解可数的,可行域是有限的
- 最优解一定存在
- 可行方案非常多,无法用枚举的方案,NP-hard的问题
解组合优化的方式有:
- 数学规划的方法,利用数学规划求解器,寻找精确最优解。缺点:耗时。
- 启发式算法:近似方法、贪婪算法、基于规则等。解的质量有基础保证,但是耗时不确定。
- 元启发式算法:遗传算法、蚁群算法、禁忌搜索、模拟退火等。不同的问题需要调参数,解的质量不可靠。
- 机器学习算法:监督学习、强化学习、图神经网络。此方法还在探索的算法领域,对于同分布的数据,机器学习后能进行快速的求解。
本文将以一个简化的装箱问题为例,来讲解采用数学规划的方法来解决装箱这个组合优化问题。
什么是装箱问题?
装箱问题(Bin Packing Problem)是组合优化领域中的一个经典问题,主要涉及如何将一系列对象高效地装入有限数量的容器(或“箱”)中,同时满足特定的约束条件。这个问题的目标是最小化所需使用的箱子数量或者最大化箱子的装载效率,以减少空间或资源的浪费。
在数学领域,装箱问题通常被建模为整数规划问题。它的变体众多,包括一维装箱问题、二维装箱问题、多维装箱问题等,以及它们各自的约束条件,如容器容量、物品形状、摆放方向限制等。
装箱问题可以用在什么场景?

装箱问题广泛应用于各种实际场景,几个典型的应用示例包括:
- 物流与配送: 确定最小数量的货车来运输一定量的货物,同时考虑每辆货车的载重限制、体积限制以及货物的装载平衡。
- 仓库存储: 如何利用有限的仓储空间存储尽可能多的库存货物,或如何将货物高效地摆放到货架上,以便节省空间并方便存取。
- 生产包装: 在产品的包装过程中,决定最少的包装盒数量来装载不同大小的产品,或者在确保产品安全的前提下,使得各个包装盒中的空隙最小化。
- 计算资源分配: 在计算机科学领域,将不同的任务分配给有限数量的处理器或内存资源,以求最大化资源的使用效率。
- 切割优化和材料利用: 在制造业中,比如钢材、木材、玻璃等材料的切割,如何从原材料中切割出所需部件,以减少材料浪费。
- 行李装载: 确定如何在飞机的货舱内或个人行李箱中高效地安置行李和货物,以保证安全、均衡且有效地利用空间。
- 云计算资源优化: 决定如何在云计算环境中分配虚拟机到物理服务器上,以最小化服务器的数量和能耗。
装箱问题
假设我们有一批货物要运输走,这批货物包装盒的比较整齐,侧面面尺寸一样,仅厚度不同、重量不同。运输货车里可以放两列,如上图示意。
货车的总承重是10吨。为了行驶平稳,希望左右摆的货物质量差异不超过500公斤。货车可装货物的总长度(厚度)是5米。
要装的货物的信息如此表格文件所示: data/items-1010.csv
部分数据如下:
| 序号 | 包装和厚(cm) | 重量(kg) |
|---|---|---|
| 1 | 101 | 505 |
| 2 | 61 | 305 |
| 3 | 126 | 630 |
| …… | …… | …… |
| 100 | 85 | 765 |
| …… | …… | …… |
| 200 | 60 | 600 |
| …… | …… | …… |
| 1010 | 80 | 640 |
当数据维度太高的时候,采用数学规划方式计算会很慢。
我们可以拆解问题,比如分块去算某100个货物的装载方案,切割前100条数据为 data/items-100.csv 。更多分块数据方案用户可以进data文件夹自己修改。
装箱问题的数学规划建模
下面我们采用数学规划的方法来建模这个问题。
首先:定义几何,描述数据,方便后面引用
- 货物集合 I I I
- 它的描述信息参数是 厚度 l i l_{i} li 和 重量 w i w_{i} wi
- 假设有车辆集合 B B B
- 问题中有左侧和右侧的问题,定义集合 s = l e f t , r i g h t s = { left, right } s=left,right
- 关于左右侧的差异在500kg以内,在表达式上,会需要一个绝对值,属于非线性。变更成线性更简单。这里我们假设所有的火车上都是左边的重,右边的轻。则左边重量上限 W l e f t m a x = 5250 W_{leftmax} = 5250 Wleftmax=5250 kg ,右边重量上限 W r i g h t m a x = 4750 W_{rightmax} = 4750 Wrightmax=4750 kg。左边比右边重的差异上限是 W l e g t r i g h t = 500 W_{legt_right} = 500 Wlegtright=500 kg
- 两边的装货厚度要求是参数 L m a x = 500 L_{max} = 500 Lmax=500 cm
然后,设置变量来表达要解决的问题。
- 货物如何摆放,设置 0-1 变量 x i , b , s x_{i,b,s} xi,b,s,其中 i ∈ I i \in I i∈I, b ∈ B b \in B b∈B, s ∈ S s \in S s∈S。 当变量取值为1的时候,则代表货物摆放在该位置,为0的时候则不放置。
由此,我们可以用来表达装货的约束。
- 每个货物只能放一个位置,且至少是一个位置: ∑ b ∈ B , s ∈ S x i , b , s = 1 , ∀ i ∈ I \sum_{b \in B, s \in S} x_{i,b,s} = 1, \forall i \in I ∑b∈B,s∈Sxi,b,s=1,∀i∈I
- 每个货车上,装载的货物重量限制:
- 左边限制: ∑ i ∈ I x i , b , l e f t ⋅ W i ≤ W l e f t m a x , ∀ b ∈ B \sum_{i \in I} x_{i,b,left} \cdot W_{i} \leq W_{leftmax} , \forall b \in B ∑

本文聚焦组合优化问题,以装箱问题为例,介绍采用数学规划方法求解。先阐述组合优化概念、特征与求解方式,接着说明装箱问题定义、应用场景,然后对其进行数学规划建模,用MindOpt APL编程求解,最后给出求解结果并鼓励读者尝试高阶方案。
最低0.47元/天 解锁文章
1697

被折叠的 条评论
为什么被折叠?



