三维装箱问题的业务场景可以参考 <电商业务中的纸箱推荐问题>. 文中考虑了如下问题.
本文提供一个基于搜索树的精确算法. 基本思想是把三维装箱问题归约(Reduce)到一个有向无环图(Directed Acyclic Graph)上的问题. 算法搜索到一个符合约束条件的有向无环图则返回true, 否则返回false.
如下图所示, 考虑任意一个物品(或者箱子), 我们可以用 , 两点的三维坐标描述其位置和大小. 设 , 那么 , 其中 是物品的长宽高. 为了方便描述, 我们用 点的坐标表示物品的位置.
假设所有物品能够被装入箱子中. 此时我们考虑一种可行的摆放方式. 对两个物品 , 分别考虑 轴方向物品之间的相对位置关系.
首先考虑 轴方向, 和 只有两种位置关系
下面我们构造有向图 . 其中
令 分别代表 中入度(in-degree)为0和出度(out-degree)为0的点集. 以上图为例, (蓝色的点), (红色的点). 对任意的 , , 用 代表从 到 的路径. 令 代表 中顶点的总权重, 即
考虑到装入箱子的物品总长度不能超过箱子的长, 我们要求 .
用类似的方法考虑 轴和 轴方向并构造 和 , 其中
下面我们得到所有物品能装入箱子的充要条件:
结合前文的讨论, 我们先总结分支的因素:
用 表示一个装箱问题的实例, 其中物品集合为 . 我们搜索的策略是用深度优先的方式依次判断 的可行性. 设 可行. 考虑 时, 我们需要对比 . 此外, 对每个物品对(pair) , , 我们要考虑 种相对位置和排放方式. 因此, 对 的任意一搜索节点, 它的分支数量是 (示意图如下).
说明 : 从根节点root开始搜索. 第一层是判断 是否可行, 由于 包含1个物品, 因此只需要考虑6种摆放方式, 即 第二层判断 是否可行, 需要比较两个物品 , 其中每个节点有36个分支, 对应6种相对位置关系和物品2的六种摆放方式的组合第三, 四层判断 是否可历轿皮行, 需要比较 和 依次类推.
注意 : 分支前必须检查两个物品间是否已经有位置关系, 若有, 则当前节点不需要分支(确保无环). 例如, 如果物品1在物品2的左边, 物品2在物品3的左边, 那么物帆搏品1一定在物品3的左边, 因此无需比较物品3在物品1左边的情况.
考虑三维装箱实例 , . 令 为 轴方向的有向无环图. 令 . 如上图所示, 我们的搜索过程需要判断 的可行性. 考虑 : 顶点个数是 , 边的个数是 , 因此 最长路(顶点权重之和最大) 的计算可以在 的时间内完成. 具体来说, 以 为例, 我们可以维护每个顶点 的肢差最长路程. 当考虑 时, 例如增加弧 或 , 我们只需要更新 所有子节点的最长路程即可.
搜索树第 层(root是第0层)对应的节点数量是 . 如上图所示, 实例 包含了 层. 因此, 从第二层到叶子节点一共有 层. 因此, 搜索树的节点总数 为:
每个节点判断可行性的时间为 . 因此算法的时间复杂度为 .
三维装箱问题利用率最高,原因轮信有以下几点:1、占角策略,即将待装物体摆放在布局容器的某一角。
2、顺橘迅放策略,即从布局容器的某一角开始将待装物体沿着容器某一边摆放。
3、在底盘装载中,将待装物体先沿着边放置,最后摆放到底盘中心。
4、在三维规则装箱中,从布局容器的某一面墙开始,一层一层地布局。在某一面墙上,确定一条边,归结为一个角。
5、在三维规则装箱中,按右、前、上的顺序找寻剩余空间,按照左、后、下的顺圆桐此序摆待装局物体。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)