如何以编程方式确定如何将较小的盒子装入较大的包装中? [关闭]

Posted

技术标签:

【中文标题】如何以编程方式确定如何将较小的盒子装入较大的包装中? [关闭]【英文标题】:How can I programmatically determine how to fit smaller boxes into a larger package? [closed] 【发布时间】:2008-09-26 16:03:10 【问题描述】:

有没有人知道现有的软件或算法来计算运送多件物品的包裹大小?

我的库存数据库中有一堆已定义长度、宽度和高度尺寸的物品。鉴于这些尺寸,我需要计算有多少购买的商品可以放入预定义的盒子尺寸。

【问题讨论】:

有趣的问题。起初我在考虑如何计算每个项目的面积与盒子的可用面积相比,但是当你有一些不是完美的立方体的东西时,这真的行不通……你可以有空间留在盒子里而不是可用空间。嗯... 感谢 Rich B 改进了这个问题的标题。特别是在最近的 SO 播客中添加“以编程方式”。 【参考方案1】:

这是一个Bin Packing 问题,它是 NP 难的。对于少量的对象和包,您也许可以简单地使用蛮力方法尝试所有可能性。除此之外,您还需要使用某种启发式方法。 Wikipedia 文章包含一些详细信息,以及您可能想要查看的论文的参考。

当然,另一种选择是从一个非常简单的算法开始(例如简单地“堆叠”物品)并使用该算法计算合理的运输上限,然后如果您的人工包装员可以做得更好,您可以制作一个微利。或者假设您的包装不理想,稍微打折您的计算价格。

【讨论】:

你的定义是准确的,我投票赞成你的答案,因为它提供了一些有用的参考信息。理想情况下,我想找到一个现成的解决方案。 polara:你找到解决办法了吗?【参考方案2】:

关于“3D Bin 包装”的文献非常广泛。您可以通过跟踪Professor David Pisinger 的出版物来获得一个很好的概览。他还发布了为数不多的带有源代码的 bin 打包的高质量实现之一:3dbpp.c

我自己的物流工具包pyShipping 带有用于仓储应用程序的 3D Bin Packing 实施。它基本上实现了 4D 装箱(3D 尺寸和重量),并在第二个运行时间内获得了典型订单尺寸(几十个包装)的可接受解决方案。它现在在生产中(即仓库)使用了几个月,以确定要使用的装运箱的上限。仓库工人通常能够更有效率地打包,但我没关系。

【讨论】:

源代码链接已失效 嗨@Qwertie,我想我在这里找到了源代码:hjemmesider.diku.dk/~pisinger/3dbpp.c【参考方案3】:

Pisinger 是为数不多的发帖 working code 的学者之一。在他的一篇论文中,他提到了“最小深度”问题。

这是一个实用的efficient algorithm 用于3D 矩形包装盒,可以调整封闭盒的高度。

这是php 中的一个实现。

【讨论】:

【参考方案4】:

您是想查看有多少单一类型适合特定大小的包装,还是尝试混合类型?

听起来您正在尝试解决Knapsack Problem。您也许可以找到一些适合您特定要求的算法。请理解,很难找到 有效 算法,因为问题是 NP 完全的(尽管根据您的具体要求,您可能能够找到有效的近似值,或者您的输入可能足够小没关系)。

【讨论】:

您的描述和引用的链接也是准确的。就像 Arachnid 提到的装箱问题一样,可能存在大量不同的可能解决方案,因为能够将物品横向翻转到盒子中。 OP发布的问题不是背包的实例。【参考方案5】:

如果要手动打包盒子,那么您可以考虑编写一个算法,该算法可以完成合理人类会做的事情。我建议这样做的原因是,除非您想为每个订单打印出包装说明,否则无论谁在为您打包,都将不得不考虑如何将订购的物品放入已分配给该订单的多个盒子中。顺序。

然后,这可能会导致您的人工包装员来 SO 询问如何以编程方式锻炼如何将 n 件物品打包到 m 个盒子中。 :-P(他们也可能要求去做,向你寻求指示等)。

只要你的算法能做一个有理智的人会做的事,我个人会接受它的运费估算。

【讨论】:

【参考方案6】:

当存在许多包和/或许多约束时,元启发式方法可以很好地处理现实世界的装箱问题。一种开源 Java 实现是 Drools Planner。

【讨论】:

【参考方案7】:

也许这听起来很明显,但记住问题可能是值得的,然后手工完成其中的一些。为 NP-hard 中的任意输入和框找到最有效的解决方案,但通过限制问题空间并接受一些低效率,NP 大小可能是合理的,通过记忆,您可能能够带来“常见情况" 时间大大缩短。

从分层包装的角度考虑问题也可能会有所帮助。

【讨论】:

谢谢。是的,Arachnid 也提出了启发式方法。它的应用是计算运费,我可以想象一个完全自动化的解决方案会提出各种不切实际的安排。【参考方案8】:

经过大量搜索,我找到了一个可能对某人有所帮助的 GitHub 存储库。函数PackingService.Pack()Container 列表和Item(s) 列表作为参数打包并返回结果,其中包含大量信息,包括

"集装箱装箱百分比及装箱和拆箱清单"

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。

以上是关于如何以编程方式确定如何将较小的盒子装入较大的包装中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 git 中,如何避免将较小的更正合并到在原始内容的每一行之间插入一行新内容的分支中的冲突?

Android ImageView 将较小的图像缩放到具有灵活高度的宽度,而不会裁剪或扭曲

在另一个声音文件中查找一个声音文件

HBase 链 MapReduce 作业,将较小的表广播到所有 Mapper

在线性时间内将小的排序列表合并为更大的排序列表的算法,没有重复项

面积图显示较大的值低于较小的值