将板安装到可用长度的算法,最大限度地减少浪费

Posted

技术标签:

【中文标题】将板安装到可用长度的算法,最大限度地减少浪费【英文标题】:Algorithm for fitting boards to available lengths, minimizing waste 【发布时间】:2012-05-03 13:03:24 【问题描述】:

我正在编写一个用于木材场的应用程序。给定许多板或梁长度,目标是计算所需的板数量,同时最大限度地减少浪费。例如,一个特定维度的购物清单可能如下:

3x 2.9 米 5x 1.6 米 21x 0.9 米

在木材场,人们会检查可用的木板长度并将其输入到应用程序中。假设这个尺寸有 4.8 米的长度。

一种简单的方法是尝试将剩余的木板按降序排列:

2.9 + 2.9 = 5.8 不适合 4.8 米的电路板 2.9 + 1.6 = 4.5 没关系。

没有长度小于剩余的 0.3 米,所以这个板是“满的”。我们将再安装两个这种类型,然后我们有以下长度可供选择:

2x 1.6 米 21x 0.9 米

好的,所以这个算法运行得相当好。但是,如果我们不拟合 2.9 + 1.6,而是拟合 2.9 + 0.9 + 0.9 = 4.7 会怎样。然后,我们将每块木板浪费 0.1 米,而不是 0.3 米。

枚举所有可能组合的一个问题是,每个长度可能在一块板上出现不止一次,而一块板中适合的长度数量也会有所不同。有没有一种我可以使用的已知算法来最大程度地减少所有电路板的总浪费?

另外,如果木材场有两个或更多长度的可用长度怎么办?例如 5.4、4.8 和 3.6 米?这肯定会使事情复杂化。可以为每个可用长度运行选定的算法,并选择浪费最少的长度。但最优雅的解决方案是允许混合可用长度,因此最佳答案可能是 1x 5.4、3x 4.8、6x 3.6。但对于初学者来说,我很乐意将答案限制为一个长度。

【问题讨论】:

听起来像是切割库存问题:en.wikipedia.org/wiki/Cutting_stock_problem 【参考方案1】:

最小化浪费实际上是广义subset sum problem的优化问题,即NP-Complete,因此这个问题没有已知的多项式时间解,

虽然 NP-Complete,但可以使用动态规划为这个问题生成 pseudo-polynomial solution,或者将其减少到 knapsack(重量=值=长度,W=板尺寸),并使用它的 pseudo-polynomial solution,即非常相似。

但是,在这里更棘手的是,伪多项式解决方案假定整数,而您的示例表明情况并非如此。您可以通过使用fixed point arithmetics 表示长度来解决它(即,4.8 将显示为 48,如果您在每个长度的点后仅使用一位数字,如果您在点后使用 2 位数字,则为 480, ...)。

注意:此算法将为您最大程度地减少浪费,但不能保证最小化浪费的“最小日志数”。

在任何情况下,由于找到 any 解决方案是 NP-Hard,因此找到使用最少对数的解决方案也是 NP-Hard。

【讨论】:

我有一些阅读要做,以完全理解您的答案。但就目前而言,我至少可以评论说,尽量减少浪费就足够了,因为您为购买的总长度付费。如果总浪费相同,那么有多少板并不重要。 @Anlo:在这种情况下,建议的算法可以保证,但要注意指数行为,该算法可能出现多项式,但它是伪多项式且具有误导性,尤其是因为您在这里使用分数长度.但是,由于问题是 NP-Hard,除非您可以使用近似算法,否则您在这里没有太多选择.. 使用定点算术完全没有问题。厘米(480)可能足够好,毫米(4800)肯定是。尝试保持数字小有什么意义(即使用 480 而不是 4800)? @Anlo:很好的问题!是的!该算法的复杂度为(n*W),其中n 是日志数,W 是棋盘大小。为 4800 尺寸的电路板寻找解决方案所需的时间(和更多空间)是 480 尺寸电路板的 10 倍。【参考方案2】:

您的特定问题是所谓的“切割库存”类问题的变体。 看看***的“Cutting Stock Problem”(CSP)页面

我喜欢用简单的英语解释切割库存问题的简单版本。 来自AIMMS:

《切料问题:如何切长卷料(参考 作为原料)成规定尺寸的小卷(称为 决赛),给定每个决赛的需求。”

AIMMS 的这个pdf 不错。

请注意,研究人员提出的基本切削库存问题有很多变体。这些整数编程讲座笔记很好地表达了generalized Cutting Stock problem(见第17页)

这些 MILP 问题并不难表述,因为目标函数和约束遵循标准 CSP 的基本模式。存在大量关于有效解决这些问题的技术的研究。

如果您可以使用 LP/IP 求解器,例如 CPLEX、R 或 Excel 求解器(针对较小的问题),那么绝对值得制定您的问题并在这些求解器上进行尝试。

希望对您有所帮助。

【讨论】:

Ram,下面两个链接失效了。你能更新一下吗? @rdtsc 感谢您引起我的注意。我已经修复了损坏的链接。

以上是关于将板安装到可用长度的算法,最大限度地减少浪费的主要内容,如果未能解决你的问题,请参考以下文章

环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离

通过基于 Web 的实时音频捕获和广播,最大限度地减少延迟

为啥使用整数类型作为分区键可以最大限度地减少内存使用?

javascript 隐藏文档正文有助于最大限度地减少闪烁

持续唤醒和睡眠以最大限度地减少 Linux 上的功耗?

最大限度地减少 Salesforce Streaming API 和 Heroku Connect 之间的延迟