用于物品运输的3d包装算法


24

我收到了一个建立运输估计量的任务,该估计量建议在尽可能少的盒子上最好地容纳商品:

  1. 有一组已知的矩形框大小

  2. 盒子里有很多随意的矩形物品要包装

  3. 最好使用的盒子越少越好。因为运送两个盒子1x1x1比一个盒子1x2x1贵得多。这应该是这里的优先事项。

  4. 还应该对其进行优化,以尽可能使用较小的盒子作为第二优先级。(例如:如果在一个较大的框与两个较小的框之间进行选择,则应选择较大的框)

  5. 物品可以旋转以适合盒子,但是旋转必须至少限制为45°的增量(在我的研究中,似乎有些配置允许45度旋转才能更好地将矩形盒子容纳在更大的矩形盒子中) ,以90°旋转为标准。

  6. 盒子有重量限制,物品具有任意重量(例如:大小为1x1x1的物品可能比其他2x2x2物品重)

我进行了一些研究,找到了一些关于装箱和背包问题的抽象算法,并带有以下一些蛮力变化,类似于最佳拟合算法:

  1. 在“要包装的物品”列表上按递减的顺序对物品进行排序(从大到大)

  2. 对于此列表中的每个项目:

    1. 选择“二手箱”列表上的较小箱子,该箱子有足够的剩余体积和重量限制以适合该物品(我在这里使用“适合”表示适合尺寸和重量)

    2. 如果没有这样的盒子,请从已知的可能的盒子尺寸中创建一个新的盒子,该盒子是可以容纳物品尺寸和重量的最小尺寸,并将其添加到“二手盒子”列表中。

    3. 如果一个盒子适合该物品(使用下面的拟合功能),则将其添加到“此盒子的物品”列表中,并将其从“适合盒子的物品”列表中删除,在盒子内标记其相对3d位置。

    4. 从2.1开始重复,直到“要包装的物品”列表上没有适合的物品。

上面步骤2中使用的拟合检查功能:

  1. 检查包装箱的剩余容量是否适合项目的容量。如果不是,则返回false。

  2. 检查“盒子物品”重量加上当前物品重量的总和是否小于或等于盒子重量限制。如果不是,则返回false。

  3. 检查“框的项目”列表,以选择第一个具有最小Y分量并且具有足够空间用于该项目的宽度,深度和高度的框坐标,同时将其他项目视为不可用的空间。

  4. 如果该项目不适合其当前方向,请以6种可能的旋转方式之一进行旋转,为简单起见,不假设旋转45度。(旋转会导致尺寸已被测试的尺寸可以跳过。例如:将盒子旋转180°会得到与原始位置相同的尺寸,因为所有盒子和物品的相对面尺寸都相同,因此可以忽略。)

  5. 如果没有将商品以所有可能的方式旋转回其原始方向,请从步骤3重新尝试。

  6. 如果尝试了所有旋转但没有找到合适的旋转,则将当前坐标视为不可用的空间。

  7. 如果没有可用空间检查,则返回false。否则,请从步骤3再试一次。

我想知道在给定的限制条件下是否可以找到解决我问题的最佳方法。

这似乎在理论上可行,但我还没有在代码上尝试过。我想知道我是朝着正确的方向走,还是有更好,更高效的方法来做到这一点。

参考会很棒。

编辑:

我发现一些有趣的第三方API可以满足我的要求,但是必须断开连接,因此我将无法访问它们。

一些例子是:

编辑2:

一个实际的要解决的问题的示例是:

  • 我有4个尺寸为WxHxD的盒子:10x12x18、12x16x24、16x20x30、24x32x40
  • 我有4个项目的订单,分别是大小为6x8x10、2x 22x14x30和1x 22x4x20的1个项目

如何使用尽可能少的盒子,尽可能小的盒子和尽可能少的可用空间将这些物品装入一个或多个大小的盒子中?


4
不需要packing-related标签;algorithms足够:)
克里斯·西里菲斯

我很好奇,实际包装是由机器人还是由人类来完成?如果是后者,那么空间优化是否值得花时间来弄清楚如何旋转每个盒子以适合它?
foraidt 2014年

好问题。实际的包装将由人来完成,但是软件会建议每个包装盒的包装顺序和位置。不需要包装经验即可查看提供的布局并将货物放置在盒子中。首先,需要花费一些时间来适应它,但是这不需要考虑最佳配置。
里卡多·索扎

1
我认为所有@msw都在说这种类型的问题不太可能适合“完美”的解决方案,而更适合于在合理的时间内根据启发式规则找到的可接受的解决方案提供。从数学的角度来看,这通常意味着您使用一组不同的算法和工具来进行处理,因此我认为他只是建议这样做。例如,遗传算法,模拟退火以及遵循梯度下降曲线(相对于您的启发式方法近似求解空间)的其他方法可能会在此方面带来好处。
J特拉纳2014年

1
我在这里发布一个想法。如果您认为此方法无效,可以忽略它。该解决方案(更像是优化)实际上取决于算法输入的相似程度。因此,请充分利用您的输入随时间推移将具有一些相似性的事实。您可以存储/缓存计算结果(计算复杂度很高),然后将其与输入进行比较,如果完全匹配或部分匹配,则只需要进行一些计算即可对一些较小尺寸的对象进行重新排序。当然,这引起了新的问题。
JAAAY

Answers:


4

Bin打包在计算上非常困难。考虑问题的一半:您想将产品包装在运输箱中,而不会浪费包装箱。对此的最佳解决方案将需要遍历需要用一辆卡车装运的产品的所有可能子集和所有可能的3d布置。我将为您提供最佳解决方案,因为我有一个朋友在早餐前会做六种不可能的事情。

现在,您只需要将卡车上的所有包装箱全都浪费掉即可。我的朋友做了他第二件不可能的事情,并给您解决方案。不幸的是,在上面选择的箱子尺寸下,如果您在第一个任务中选择了不同(较大或较小)的箱子,卡车中的空白空间可能会减少。如果更改一个盒子的大小,充其量只能重新包装卡车。最糟糕的是,您可能必须重新包装所有包装盒,这与我们开始遇到的问题一样困难。并且,与第一阶段一样,您必须尝试所有可能的3d布置。

我发现Skiena的《算法设计手册》有助于思考哪种类型的算法适合哪些类型的问题,但是我大部分都知道,即​​使是平凡的问题,好的解决方案也会在您遇到计算难题时迅速消失。您需要的大多数内容都适合于装箱问题,而该文章是一个很好的起点。值得注意的是,用于此目的的一些最佳算法是商业产品,因为此任务在物流中无处不在(我可以将我的货物运入的火车最少的数量是多少?等等)。如果正确的试探法可以每月为制造商节省100辆火车车,那将是一笔可观的钱。

不幸的是,有关优化启发式算法的文献并不比算法大。如果您尝试独自一人去做,我保证您会梦到要在第二个月左右移动直角棱镜。我遇到了一个库存问题,如果我不得不再次这样做,我可能会向专家(或他们的专有软件)求助。

感谢@JTrana扩展了我的评论。


感谢您的反馈意见。正如我在这个问题上所说的,我已经研究了这个主题,并提出了几种算法来提出上述建议。我只关心包装本身。所有这些信箱将通过邮局服务发送。出生前,我将不必处理卡车装载。
里卡多·索扎

那是我解释的一个很好的部分。您不能从希望您为其服务付费的公司中“提取”算法。您列出的两家公司都有API,但是打包是在它们的服务器上完成的,除了盗窃之外,您无法访问实现代码。而且您不必打包卡车,这是件好事,现在您的问题仅是困难的一半,这就是为什么公司想要向您出售解决方案而人们愿意购买服务的原因。
msw 2014年

1
我认为我们这里沟通不畅。我的表现可能不太好(您可能已经注意到,英语不是我的母语)。我不是要偷算法。我来这里是为了澄清这个问题。我已经做了一些研究,并将其放在上面的analisys示例中。也许有人遇到了同样的问题,可以给我一些更好的指导。如果我的解决方案不适用,该怎么做才能获得更好的结果?这是我真正的问题。我希望我现在让我更清楚。
里卡多·索扎

你的英语很好。我认为问题在于我们正在谈论任务的不同层次。您正在考虑实施,而我正在考虑组合爆炸。我认为解决Edit 2将帮助您从我的角度更好地理解问题。您能按照规定解决吗?没有浪费,最小数量的最小尺寸的盒子?那就是我之前提到的多重优化问题,我之前说这是不可能的:您将不得不牺牲其中至少一个因素来优化另一个因素。
msw

谢谢。我想我明白了。我没有尝试编写代码。我一直在考虑不要在更具体的解决方案之前浪费时间编码,或者至少对我的建议产生积极的反馈,因为这首先是为了引用。我仍在研究,但恐怕我必须获得这些API之一,然后查看设备(运行Win CE 6.0的数据收集器)是否可以连接到Internet。我从客户那里得到的第一条信息说,他们将无法在工作场所访问Internet。
里卡多·索扎

1

在创建新算法时,最近我自己做了一个打包算法(我知道它仍有一定的优化潜力),我总是采用最简单的方法:

我将如何做,并尝试将其转换为一种算法:从我的(机器人)人工智能老师Rolf Pfeifer那里我仍然铭记在心,有时可以通过一些非常简单的规则来创建明显的智能,因此不要过度设计我尝试不足

  1. 识别太大的物品(不适合任何给定盒子的物品)
  2. 尝试找到可能的最佳包装箱(通过交叉比较总体积和物品尺寸)
  3. 从大到小订购商品,从小到大订购商品(空格)
  4. 将最大的物品放入最小的空间
  5. 如果找不到最大的物品,则尝试跳过下一个直到不再适合
  6. 对于其余项目,请搜索新的最佳框。...

    X.总是考虑特殊事件(特大物品,奇怪的形式,如果一个盒子只包含一件物品,不带盒子发送物品会更好吗?等),但是您也可以通过决策的方式进行启发树。

当然,您获得的进一步建议还有很多,我只是将这些想法作为起点。从那里有很多方法。一种替代方法是将一个盒子分成小块(例如5cmx5cmx5cm)并以占用/空闲状态对其进行跟踪,另一种方法可以称为3d俄罗斯方块等。

使用这种方法,您不必担心组合爆炸。另一方面,如果我们谈论的是物品的运输量,可能会发生组合爆炸,但是再说一遍:您真的认为公司会逐项检查装箱单吗?不,他们不会采用分而治之的解决方案:通过使用标准化的体积(例如,托盘或固定大小的盒子)来划分复杂性。因此,即使是出于实用性考虑,不仅要考虑培训,有时员工的时间也是金钱。一列火车可以装载x个托盘,每个托盘的体积都是固定的,因此将物品包装到托盘中,但是又一次,一个托盘可能由多个订单组成,因此请使用固定的盒子存放物品,然后将其装入托盘中,然后再装载进入火车。

至少这就是我作为一个人处理任务,得到最好的盒子,然后在可用的最小空间中逐一放置最大物品的方式(并添加一点预览)。

就像我的算法一样,最终您可能没有最佳的解决方案,但是有了一个很好的启发式方法,您就可以进一步完善它。

有时从第一步开始就很容易找出自己的问题,当然,偏离路线最好不是跨过边缘步骤,而是有点聪明……有时您可能会被迫探索其他选择最好的还是实施“退一步”。

但是,正如我从我的AI老师那里学到的(Rolf Pfeifer,很抱歉再次打扰):有时,您可以使用一些非常简单且规则很少的规则集来创建明显的智能行为>在示例中提到的紧急行为,他们编程了一些偏僻的小车,如果他们检测到右侧的障碍物,如果左侧有障碍物则向右转,如果没有障碍物或障碍物在前方,则直走。如此放置3或4个机器人,将其放置在3m x 3m的正方形中,上面有很多乒乓球,这导致了一个令人惊奇的事实,即机器人似乎正在清理,将乒乓球推到角落,即使机器人仅编程以避免障碍。

PD:我从这种方法中发现的唯一现实世界偏差是当我在兼职工作时担任大型音乐会的舞台演出者,例如metalla,铁娘子,布兰妮·斯皮尔斯,保罗·麦卡特尼,U等等。国际旅行会逐项列出准确的装箱单。计算一次完成(人或机器不知道),然后进行复制。有时,当他们第一次打包时,他们甚至会逐层制作图片并将其粘贴在卡车中,以便当地工作人员准确知道,哪个盒子必须在何时何地进行充电。但这也是一种特殊的包装需求,因为一次旅行他们总是使用相同的箱子和卡车。


1

您在帖子中提到的启发式方法似乎很有趣。

我建议进行一些修改,以改善最终解决方案。

给定一种将所有物品装在一个盒子中的解决方案,请尝试将两个小盒子的内容合并到一个大盒子中(这将有助于提高使用尽可能少的盒子的标准)。

或者,每次启动一个新盒子时,可以选择可以容纳当前项目的最大盒子,而不是使用可以容纳当前项目的最小盒子,将每个项目分配给一个盒子后,尝试分配一个新盒子。盒子到一个小盒子。

同样,在拟合函数中,您可以想象改变加载顺序,而不是考虑其他盒子的位置固定。这应该让您找到更好的解决方案,但要花费更长的运行时间。


这似乎是有趣的改进。我已经很久没有碰到这个问题了。也许我应该在这几天尝试一下。谢谢。
里卡多·索扎
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.