【论文阅读】Combinatorial Benders’ Cuts for the Strip Packing Problem

news2025/7/21 4:24:49

文章目录

  • 一、摘要
  • 二、求解条形装箱的Benders分解
    • 2.1 Notation
    • 2.2 SPP的数学逻辑模型
    • 2.3 分解方法
  • 三、从问题的解决方案
    • 3.1 复杂性分析
    • 3.2 y-check的算法
      • 3.2.1 预处理过程
        • 3.2.1.1 Merge Items 合并项目
        • 3.2.1.2 Lift Item Widths 增大项目宽度
        • 3.2.1.3 Shrink the Strip 缩小长条容器
      • 3.2.2 Enumeration Tree for Problem y-Check 组合枚举树
  • 四、改进Benders Cut
    • 4.1 寻找项目的最小不可行子集
      • 4.1.1 找到可以分割成两个子问题的线
      • 4.1.2 用线去删除矩形(删矩形效率较低)
      • 4.1.3 一个一个删除矩形
    • 4.2 Lifting the Cut 提升Cut
  • 五、条形包装问题的精确算法
    • 5.1 Preprocessing and Bounds
    • 5.2 Closing the Gap
  • 六、Computational Results
  • 七、Conclusions


论文来源:(2014)Combinatorial Benders’ Cuts for the Strip Packing Problem
作者:Jean-François Côté 等人


一、摘要

  • 我们研究了条形包装问题,即一组二维矩形物品必须被包装在一个固定宽度和无限高的矩形条形中,目的是使使用的高度最小。
  • 这个问题很重要,因为它模拟了大量的现实应用,包括切割作业,如纸张或木材等材料的库存是大量的,必须以最小的浪费进行切割,调度问题,任务需要相同资源的连续子集,以及运输无法堆叠的物品时产生的集装箱装载问题。
  • 在文献中,条形包装问题已经被几种启发式和精确算法攻击,然而,小规模的基准实例仍然没有被证实的最优性。
  • 在本文中,我们提出了一种新的精确方法,可以在有限的计算量内求解大量的开放基准测试实例。
  • 我们的方法是基于Benders的分解,在主程序中,我们将项目切割成单位宽度的切片,并将它们连续地打包在条中,在从程序中,我们试图通过固定其单位宽度切片的垂直位置来重建矩形项目。如果从节点证明重建项目是不可能的,那么就向主节点添加一个切点,并重复该算法。
  • 我们证明了主问题和从问题都是强NP难问题,并通过定制预处理、上下边界技术和精确算法来解决它们。
  • 我们还提出了几种新的技术来改进标准的弯曲切割,使用所谓的组合Benders切割和额外的提升程序。
  • 大量的计算测试表明,相对于以前发表的算法,我们提出的算法提供了一个实质性的突破。

二、求解条形装箱的Benders分解

2.1 Notation

采用 normal patterns 减少摆放位置数量

什么是 normal patterns ?下面给出定义:

每个项目都尽可能往下和向左移动以改善结果,所以,任意一个项目都是挨着另一个项目或者边界的,这可以表示为,任意一个项目的摆放位置,都是其他项目的线性组合

normal patterns 的公式如下:

在这里插入图片描述
而项目的线性组合,可以通过动态规划的方式计算

2.2 SPP的数学逻辑模型

SPP可以通过使用两组变量来建模:一个二元变量 x j p x_{jp} xjp,如果项目 j j j被包装在列 p p p中,则值为1,否则为0,一个连续的非负变量 y j y_j yj给出项目j的底边框的高度。然后使用单个变量 z z z定义解的总高度。SPP可通过以下数学逻辑模型描述:
在这里插入图片描述

  • 约束条件(6)要求每个项目都精确地包装在一列中。
  • 约束(7)强制 z z z不小于占据任何列 q q q的项目的总高度
  • 约束(8)强制 z z z不小于任何项目 j j j的上边界。注意,约束(7)对模型的正确性不是严格必要的,但对我们的分解方法是必要的。
  • 逻辑约束(9)要求占用同一列 q q q的项集合对应的垂直区间 [ y j , y j + h j ] [y_j,y_j+h_j] [yj,yj+hj]不重叠。

2.3 分解方法

对于SPP问题,从公式(5)-(11)中删除变量y可以得到下面的式子:

主程序

在这里插入图片描述
Boschetti和Montaletti(2010)使用模型(12)-(15)得到其下界,假设现在已经计算出一个整数解,然后从程序将找到问题的可行解(如果有的话)

从程序( y-check )

在这里插入图片描述

如果y-check返回一个可行解,则我们得到了原SPP实例的最优解。否则我们禁止当前的解,在主问题上加一个Cut。为了这个目的,让:

p j s = ∑ p ∈ W ( j ) p x j p s p_j^s=\sum_{p \in \mathscr{W}(j)} p x_{j p}^s pjs=pW(j)pxjps
∑ j ∈ N x j , p j s ⩽ n − 1 \sum_{j \in N} x_{j, p_j^s} \leqslant n-1 jNxj,pjsn1

假设现在我们可以找到项目 C s C^s Cs⊆N的精简子集,这样,如果我们把它的所有项目放在位置 p j s p^s_j pjs,那么问题 y − c h e c k y-check ycheck仍然有一个不可行的解决方案(我们寻找Cs的方法在§4中讨论)。然后,我们得到组合Benders的切割:
∑ j ∈ C s x j , p j j ⩽ ∣ C s ∣ − 1 \sum_{j \in C^s} x_{j, p_j^j} \leqslant\left|C^s\right|-1 jCsxj,pjjCs1

然后我们可以将SPP建模为以下主问题:
在这里插入图片描述

这种分解的优点在于,它可以利用主节点和从节点的组合结构,为它们开发定制的优化技术。

下图展示了分解的示例:
在这里插入图片描述


三、从问题的解决方案

3.1 复杂性分析

本文的作者证明了 y − c h e c k y-check ycheck是NP完全问题。有兴趣可以看看原文详细证明。

3.2 y-check的算法

针对y检验的求解,我们开发了几种算法,并利用组合枚举树,丰富了约简和深探准则,获得了最佳的计算性能。由此产生的算法,在本文的其余部分称为y-check算法,从三种新的预处理技术开始,依次调用。

3.2.1 预处理过程

3.2.1.1 Merge Items 合并项目

对于任意的项目 j ,我们可以将项目 j 左边的其他项目和右边的其他项目分成两个集合
在这里插入图片描述
首先我们考虑第一个块(从不增序排列的 p j s p^s_j pjs中取)。对于项目j左边的项目集合A,如果A中所有项目的高都小于项目j的高,则调用组合枚举树将A中的项目打包到宽度为 p j s p^s_j pjs,高度为 h j h_j hj的子区域中。如果A中所有项目都能被打包进去,那我们就将他们合并为一个新的项目k,项目k具有宽度 w k = p j s + w j w_k=p^s_j+w_j wk=pjs+wj,高度 h k = h j h_k=h_j hk=hj,x坐标 p k s = 0 p^s_k=0 pks=0。这保持了解决方案的最佳性,因为没有其他项目可以进入。

3.2.1.2 Lift Item Widths 增大项目宽度

假设现在有N个块,如果我们要对 块i 增大宽度,则我们需要从N个块中取出 块i ,放在x=0处,然后将剩下的N-1个块按照任意组合放在 块i 的右边(不重叠),假设N-1的块任意组合的最大宽度值为 W N − 1 W_{N-1} WN1,块i的宽度为 w i w_i wi,容器宽度为 W W W,则 块i 增大的宽度为 ( W − W N − 1 − w i ) (W-W_{N-1}-w_i) (WWN1wi)(任意组合的宽度可以通过动态规划求得)

3.2.1.3 Shrink the Strip 缩小长条容器

假设对N个块求任意组合的最大宽度为 W m a x W_{max} Wmax,直接令容器宽度等于 W m a x W_{max} Wmax(这一过程也可以通过DP实现)

3.2.2 Enumeration Tree for Problem y-Check 组合枚举树

这里我用不到,所以没有细看(好吧,确实也看不懂哈哈哈哈)。


四、改进Benders Cut

在下面,我们假设我们得到了一个解决方案S,它没有通过 y-check,我们需要通过添加Cut,将其从主问题中剔除。

我们开发了一个使用四个步骤(所有新开发的想法)的程序,前三个步骤用来寻找项目的最小不可行子集,最后一步,我们试图通过线性模型的求解添加 x j p x_{jp} xjp变量来进一步提升Cut质量。具体在下面详细介绍。

4.1 寻找项目的最小不可行子集

4.1.1 找到可以分割成两个子问题的线

第一步,寻找一条垂直的线,可以将容器内的块分成左右两部分,而没有任何一个块与该线重叠。这样就可以使得原本的容器被一份为二,其中至少有一个部分还是不可行的。这样就找到了不可行子集。同样,这个过程可以递归下去,直到所有子集不能再分。

4.1.2 用线去删除矩形(删矩形效率较低)

第二步,从左往右用一根垂直的线(列)去遍历容器横轴,每次将被线穿过的矩形移除后,再进行y-check,此时如果check通过了,那就…;如果check还是失败,说明当前被线穿过的矩形不是导致check失败的原因,可以直接将其移除,这样就找到了更小的不可行集合。

4.1.3 一个一个删除矩形

第三步根据给定的顺序一次考虑一个项目。它从S中删除当前项,并在缩减实例上重新执行y-check算法。如果结果可行,则将项目重新插入S,否则我们会找到不可行的原因,并将当前项目排除在S之外。无论如何,我们会重复下一个项目,直到所有项目都已扫描完毕。在扫描结束时,我们只剩下一个子集的项目,这仍然会导致不可行。

此步骤的结果取决于选择项目的顺序。出于这个原因,我们用不同的顺序进行了多次尝试。

第一次尝试根据面积的非递减值选择项目。

在第二次尝试中,我们为每个项目分配一个成功分数。在当前SPP实例的解决方案开始时,该值最初设置为0,然后如果在分解算法的先前迭代中从S中移除项目成功(即,如果它导致了仍然不可行的缩减实例),则该值增加一个单位。然后,我们执行的第二次尝试根据成功分数的非递减值选择项目。

第三次尝试只是随机选择项目,并执行10次。

4.2 Lifting the Cut 提升Cut

我们程序的第四步,也是最后一步。我们假设所有项目的x坐标都不再是一个确实值,而是一个范围,线性程序规定,每个项目在自己的一定范围内,任意移动,项目间的重叠关系不会改变。
线性程序的目标是,所有项目的范围总和最大。


五、条形包装问题的精确算法

前面章节中给出的数学模型和算法已被插入到求解SPP的整体算法中。该算法还利用了一些额外的技术来加速收敛到最优值,无论是来自相关文献的最佳实践,还是新开发的程序。由于这个原因,我们称之为BLUE,来自Benders的分解和上界增强。

算法1中概述了一个非正式的伪代码。
在这里插入图片描述
BLUE首先对实例进行预处理,并计算最优解值的上界U和下界L。

然后,只要L严格小于U,它就解决了SPP的识别版本,称为SPP(L),其中条带的高度固定为L,目的是找到不超过L的物品的可行包装(如果有)(该问题在文献中也称为二维正交包装问题;例如,参见Clautiaux等人2007)。SPP(L)实例首先被传递到预处理过程,然后通过两种精确的方法求解,即组合分支和定界以及第二节的Benders分解。

(由于我需要的是用这个方法解决2DBPP,而不是2DSPP,所以后面的内容就没有进行阅读了,大家感兴趣可以阅读原论文)

5.1 Preprocessing and Bounds

5.2 Closing the Gap


六、Computational Results

所有算法都在C++中实现。运行在Intel Core(TM)2 Quad CPU Q8200上,在Linux openSUSE 11.4操作系统下运行2.33 GHz。

通过设置参数RepeatPresolve=3、Reduce=3、Probe=3、Simmetry=5,并强制使用单个处理器(Threads=1),使用IBM Ilog Cplex 12.5解决了LP和MILP。

Martello等人(1999)使用标准动态规划和程序组合的背包问题解决了子集和问题。允许使用蓝色算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


七、Conclusions

我们提出了一种用于精确解决带状包装问题的创新算法,该算法基于Benders分解,并丰富了几种定制技术。我们证明了分解中出现的从属问题是困难的,但用一种实际有效的算法解决了它。

我们提高了标准Benders,通过使用组合Benders Cut的概念和一种新的提升程序进行切割,这在困难情况下非常有效。所提出的算法始终优于先前发表的方法。

它以相似或较小的计算工作量提供了大量的最优解,并首次解决了几十年来开放的经验证的最优实例。

我们提出的一般框架可以适用于解决其他二维包装问题,如二维背包和二维箱式包装。它也可以推广到更高维的问题。这些代表了有趣的未来研究方向。

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

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

相关文章

实战+代码!Selenium + Phantom JS爬取天天基金数据

功能: 通过程序实现从基金列表页,获取指定页数内所有基金的近一周收益率以及每支基金的详情页链接。再进入每支基金的详情页获取其余的基金信息,将所有获取到的基金详细信息按近6月收益率倒序排列写入一个Excel表格。 思路: 通过…

python-pandas用法大全

目录1 修改 DataFrame 某一列的数据类型2 读取和保存3 特定值的替换4 两个 DataFrame 的连接4.1 join4.2 某列作为拼接的依据5 删除某一列5.1 删除第n列5.2 删除特定名称列6 行、列重排6.1列重排6.2 行重排6.3 根据某一列的值排序6.4 随机打乱所有行7 修改某列的名称7.1 全局修…

m基于自适应门限软切换的3G和Wifi垂直切换算法的matlab仿真

目录 1.算法概述 2.仿真效果预览 3.核心MATLAB预览 4.完整MATLAB程序 1.算法概述 这里还是考虑位置信息和强度联合切换判决的方法,如果你的设备没法提供具体的位置信息的话,那么就把位置信息的权值设置为0。强度判决的权值设置为1即可。 需要传输的数…

外业精灵,在水土流失监测野外调查工作中的应用

常规的水土流失野外调查技术已难以满足现阶段区域水土流失监测工作的需求。 为探索高效、精准、高质量的水土流失数据采集技术,作者以山东沂蒙山泰山国家级重点治理区蒙阴县为例,以小流域或公里网格为调查单元,通过分析外业精灵的技术优势&a…

webpack高级配置

摇树(tree shaking) 我主要是想说摇树失败的原因(tree shaking 失败的原因),先讲下摇树本身效果 什么是摇树? 举个例子 首先 webpack.config.js配置 const webpack require("webpack");/**…

Educational Codeforces Round 138 (Rated for Div. 2)

A:思维 题意:给一定的N*N的板子,里面放有一些乌鸦,这些乌鸦会攻击自己的所在行与所在列,问给定一个数量的乌鸦,问是否能够移动某只乌鸦,使得形成和平局面? 方法:我们发现…

股票涨跌量化怎样进行策略分析?

股票涨跌量化其实是通过Python调用Tushare库计算深证成指实时,对股票的成交量涨跌幅,主要是通过相关分析选择合适的成交量涨跌幅来计算的一种量化策略分析方法,也可以根据绘制股票的成交量涨跌幅度与当日股价的涨跌幅描绘出来。如果我们想快速…

目标检测论文解读复现之八:基于YOLOv5s的滑雪人员检测研究

前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文&#xff0c…

Unity使用NaveMesh实现第一人称视角移动

系列文章目录 Navemesh寻路系列文章 文章目录 目录 系列文章目录 文章目录 前言 一、NavMeshPath是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 navemesh已经大量使用到游戏中,但大部分寻路都是使用SetDestination函数,给予一个目标…

SpringBoot+Vue项目大学校园防疫与服务系统的设计与实现

文末获取源码 开发语言:Java 使用框架:spring boot 前端技术:JavaScript、Vue 、css3 开发工具:IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库:MySQL 5.7/8.0 数据库管理工具:phpstudy/Navicat JDK版…

C++初阶 Vector模拟实现

q. > 作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步 本篇博客介绍:本篇博客会模拟Vector实现 学习目标 模拟默认函数实现模拟迭代器实现模拟容器大小相关函数模拟修改内容相关函数模拟访问容器相关函数 我…

xss挑战之旅11-19关

文章目录前言第11关:referer第12关:User-Agent第13关:cookie第14关:exif xss第15关:ng-include第16关第17关第18关第19关:flash xss前言 靶场:XSS挑战之旅 1-10关 11-20关 第11关:r…

『LeetCode|每日一题』---->颜色填充

目录 1.每日一句 2.作者简介 『LeetCode|每日一题』颜色填充 1.每日一题 2.解题思路 2.1 思路分析(DFS) 2.2 核心代码 2.3 完整代码 2.4 运行结果 1.每日一句 我的宇宙为你藏着无数个星球 2.作者简介 🏡个人主页:XiaoXiaoChe…

Git之路

文章目录指南介绍实战任务一:sb项目任务二:idea实战任务三:分支实战(待续)指南 如果你想在简历上写“会常用的Git的命令“,那么这篇文章值得你要看,那我们需要掌握什么呢?其实会简单的操作就行&#xff0c…

Matplotlib绘图-快速上手可视化工具

Matplotlib快速上手一、初识Matplotlib1.1 认识Matplotlib的图像结构1.2 绘制一个折线图二、给图像添加修饰2.1 自定义x的刻度2.2一图多线2.3一图绘制多个坐标系子图三、主流图形的绘制3.1绘制柱状图一、初识Matplotlib 是Python最常见的可视化工具之一 1.1 认识Matplotlib的…

csrf跨站请求伪造

文章目录csrf跨站请求伪造1、前戏2、csrf校验2.1、from表单如何符合校验2.2、ajax如何符合校验3、csrf相关装饰器FBVCBVcsrf跨站请求伪造 1、前戏 """ 钓鱼网站搭建一个跟正规网站一摸一样的界面(中国银行)用户进入到我们的网站&#x…

HyperLynx(三十)高速串行总线仿真(二)

高速串行总线仿真(二) 仿真实例 1.探索多层板中的PCI-E串行通道 2.设置叠层以减小损耗 3.分析通道的不同配置对损耗的影响 4.检测驱动端规范 5.检查接收器规范 6.通过仿真得出整个通道的驱动约束限制 1.探索多层板中的PCI-E串行通道 在本节练习中&…

人工智能学习:Microsoft COCO数据集读取(7)

Microsoft COCO(Common Objects in Context)是微软研发维护的一个大型的数据集。包含了30多万张图片和91个目标分类。可用于目标识别(Object Detection)、场景感知(Penoptic Segmentation)、语义分割&#…

【数据结构】——单链表

目录 1.链表 1.1 链表的概念及结构 1.2 链表的分类 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 1.3实现一个单链表(无头单项非循环链表增删查改的实现) 1.链表结构的创建 2.创建一个节点 3.创建一个链表 4.打印链表 5…

解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手

大家好,又见面了。 在前面的几篇文章中,我们一起聊了下本地缓存的动手实现、本地缓存相关的规范等,也聊了下Google的Guava Cache的相关原理与使用方式。比较心急的小伙伴已经坐不住了,提到本地缓存,怎么能不提一下“地…