前情回顾:
python:关于三维装箱问题的算法研究-1
python:关于三维装箱问题的算法研究-2
python:关于三维装箱问题的算法研究-3
python:关于三维装箱问题的算法研究-4
之前的研究一直是基于组合启发式算法对货物在容器中堆叠的模拟。
演示网址, 如果打不开就是我服务器内存爆掉了,254/3年就这种效果了😂
但这种模拟不能真正的解决实际问题,只是机械的执行装载,对情况缺乏一定的判断以及判断后的处理方法。就会导致如下的情况👇:
可以看到,依赖之前的算法会导致货物堆叠参差不齐,有很多没被利用到的空隙。
基于残余空间的利用考虑,最初的想法是计算每个物件边长的最大公因数,然后把整个空间切分为按照公因数为单位一的立体小方块。
每个物件的放置其实就是对应多个立体小方块的消失。这就有点像排水法测体积,装进去一个货物,置换出一些空间。
那么,我们只需要读取一些连续的单位方块,就能确定能否放下,每次放下货物就把这些方块从列表中删除即可。
不过因货物尺寸的原因,即便是公因数也会造成这个单位方块集合非常大,一种替代的方法就是不直接生成这个集合列表,每次都对空间轴线进行遍历。
但是不管采用哪个方法,都极大的消耗计算资源,在生产过程中难以实现。
实际上 ,我们在装载的计算过程中,并不是所有的情况都是完全没有规则的,在不同的情况使用不同的装载方法,能使装载效率更高,且更规整。
基于这种思路,接下来结合贪婪算法和动态规划算法对问题进一步进行研究。
动态规划算法
通过拆分问题,定义问题状态和状态之间的关系,使得问题能够分别以不同的方式去解决。
承接前面的研究内容,一个货物被摆放到容器内可以用两组三维坐标表示:
(x , y , z)表示货物所落在的坐标位置,(inx , iny , inz)表示货物落在三个轴朝向的长度。
针对这两组三维数据,分别有
8种放置点所在位置考虑
(0,0,0)# 位置坐标全部为0,位置在原点
(0,0,1)# 位置坐标X轴,Y轴为0,位置在Z轴上
(0,1,0)# 位置坐标X轴,Z轴为0,位置在Y轴上
(0,1,1)# 位置坐标X轴为零,位置在OYZ面上
(1,0,0)# 位置坐标Y轴,Z轴为0,位置在X轴上
(1,0,1)# 位置坐标Y轴为0,位置在OXZ面上
(1,1,0)# 位置坐标Z轴为0,位置在OXY面上
(1,1,1)# 位置坐标全部不为0,位置在容器空间内部
6种货物朝向考虑
(l,w,h)# 侧放
(w,l,h)# 侧放旋转
(w,h,l)# 立放
(h,w,l)# 立放旋转
(l,h,w)# 躺放
(h,l,w)# 躺放旋转
贪婪算法
先忽略整体,对问题做出在当前最佳选择。得到的某种意义上的局部最优解
因为我们实际生产中,车柜容器的长度较长,相对较小的一面是宽高组成的侧面,所以最优做法是假定容器无限长,那么因为终末造成的缺损对整体可以忽略不计
既然暂时不考虑终末的缺损,那就是有限考虑把内侧每一层侧面填满,对宽高侧面填充的越密实,那么向外延伸就能把整个容器填充的密实。
又因为有时候顶部空间实在难以利用,所以我们在填充时先保证宽方向极限填充。
基于以上,我们就可以把问题肢解成:
在什么位置,采用什么方式,摆放什么朝向的货物,能够保证对切割出来的局部填充空间利用率最大。
如果脑力充沛,头发茂密,计算机配置优秀
也可以考虑在每步放置的位置,尝试不同的方法,选择利用率最大的,然后进行到下一步
原点考虑
(0,0,0)# 位置坐标全部为0,位置在原点,我们先来看在原点位置的摆放可能
……不想写了,就这样吧