【三维装箱】遗传算法求解三维装箱优化问题【含Matlab源码 3408期】

文章讲述了如何使用遗传算法解决三维装箱问题,以找到切割形状(如长宽373,201和406,229)下的木板切割数量和位置,以实现原材料利用率最大化。算法包括编码策略、适应度函数和遗传操作,虽然不能保证全局最优,但通常能得到满意的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

⛄一、三维装箱简介

1 问题产生
当初这个问题是由于有人问我的,大概是去年的五一建模比赛,赛后我朋友一直没有解决,因此我就好奇的尝试了下。问题如下:
假设有一块原材料木板,长宽确定(分别为3000,1500),有两种切割形状(可是更多切割形状),切割形状p1为长宽(373,201),切割形状p2为长宽(406,229),那么请问两者切割数量以及最后的切割位置(保证原材料木板利用率最高的情况下)?

2 解决思路
由于这一块问题中主要我想阐述如何实现装箱,重点不在于遗传算法(当然想了解可以关注我,我其它文章有遗传算法描述),为了确定利用率最高,也就是最后的剩余面积最小,由于问题的无序,我们只能借助遗传算法来实现局部(接近全部)搜索。具体方法如下:

【step1】
我们在已知木板大小和所需矩形形状下,假设矩阵切割方式只切割出一类矩形,以此来求一类矩形最大切割数量。对于矩形p1最多能切割60块,对于矩形p2最多能切割48块木板。借助2进制求得染色体为6位数。

【Step2】
我们用遗传算法对切割方式进行搜索,在已知最大切割数量的情况下,我们用bit[6]表示物品p1的染色体编码,用bit1[6] 表示物品p2的染色体编码。 在此我们取种群数量为F=100,在上述个体模拟情况下,染色体为二进制,转化成十进制,则个体矩阵取值范围为【0~63】。则个体适应度函数为木板利用率作为适应度考量标准:
Fit=已切割面积(p1切割数量乘以p1面积+p2切割数量乘以p2面积)/原材料面积
当个体Fit>1时我们取该个体适应度为0,以保证不影响迭代。取交叉概率为0.7,变异概率为0.1,我们取最大迭代数为1000。
下面是重点:
个体染色体矩形切割算法过程如下:
(1)我们将木板在问题一模型基础划分成1500*3000(取原材料和所用切割材料的长宽公约数作为最小单位,这里是1)的单元网格图,并记录每个网格初始状态为0、并记最右侧点为(xw,0),最上侧点为(0,yh)。然后对于个体是否能进行分割判断,即Fit不等于0,以作为个体矩形存放顺序以1、对于任一个切割矩形,有两种切割方式(水平和垂直切割),因此对每一个矩形产生一个随机数决定是水平还是垂直切割(用0、1表示)。
(2)一开始从位置(0,0)切割,每切割完一个矩形,产生两个可用点,也就是切割这个矩形后的矩形右下角以及左上角在原材料的坐标点,一开始原材料只有一个可用点,切割一个后就变成了两个可用点,也就是每切割一个矩形,占用一个可用点,生成两个可用点。
(3)可用点用一个队列表示,先产生的先用,效果会很好(先右下角,再左上角,很重要)。
(4)对于每一个可用点,如何已被作为切割点,则将这个可用点删除(表示已用),否则假设该可用点为(a,b),下一个切割矩形以及切割方式已知为(e,r)摆放切割,那么判断该可用点是否可用的方式为:
1、满足yh-b>r。
2、满足可用点队列中横坐标比a大的最小可用点坐标,假设为(a1,b2),那么a1-a>e,如果没用这样的可用点,则应满足xw-a>e。
如果两者都满足,则进行切割,否则,该可用点不可用(删除,和已用的可用点一样处理掉),该矩形尝试下一个可用点。
(5)判断原材料矩形是否切割完,结束条件为:**
1 可用点队列为空,也就是所用可用点都用完了。
2 该个体的两类矩形染色体需要切割的数量完成,也就是这类个体切完了。

随机数生成的方式来随机生成第一代种群, 每一代种群在进化时有:
选择:在模拟进化中,通过编码来更新个体适应度,表现较好的个体的染色体遗传到下一代的概率会更大,因此我们以增加算子的方式来选择个体和保留个体。
操作:在确定个体选择后,通过操作来实现遗传到下一代的具体操作。在此,我们以直接替换下一代更新种群的一些个体。
交叉:我们通过随机数生成的方式来表达概率,当满足发生条件时,通过改变最近的两个个体的部分染色体来实现,例如:在第 次判断时,当满足条件,我们再生成一个随机数,对染色体进行前个染色体节点交换。
变异:通过随机数的方式来检验变异概率,满足条件时,对该个体的染色体所

3 完成效果
由于遗传算法的帮助,一般收敛结果较为满意,但无法保证为最优解,是近似最优解,但解决思路是没问题的。可能算法复杂度较高。
结果如下:

P1、P2最优切割方案

序号| P1的数量 |P2的数量 | 利用率
1 | 0| 48 | 99.1723%
2 | 12 | 38 |98.5042%

这里是该问题利用该算法求得的最优的两种结果。

4 问题扩展到三维
该算法可以扩展到三维,只是在可用点的产生和删除方面有更多的考虑,占用一个可用点切割一个三维长方体后产生三个可用点,后面还是差不多的原理。

⛄二、部分源代码

% 使用遗传算法得到最大装载方式
% 定义初始种群为100个
% 交叉方式为两两交叉组合,分裂概率为0.7
% 变异方式为随机变异,变异概率为0.3
% 然后进行选择 选择前面最优的100个

rateCom=0.9;%结合概率
rateAbe=0.1;%变异概率
populations=20;%种群大小
Maxtime=20;%最大迭代时间
BigSet=[1,1,1,100;
2,2,2,100];% 表示可用箱子,前三个属性表示箱子三维尺寸,第四个属性为箱子数量
xscale=10;
yscale=10;
zscale=10;%箱子尺寸限制

%----使用遗传算法-----%
%xscale 表示容器x长度
%yscale 表示容器y长度
%zscale 表示容器z长度
%SolutionPosition 物体摆放点(左前下角)
%SolutionQ 物体摆放种类
%SolutionD 物体摆放方向
%SolutionV 物体体积
[SolutionQ,SolutionD,SolutionPosition,SolutionV]…
=Genetic(rateCom,rateAbe,populations,BigSet,xscale,yscale,zscale,Maxtime);

%根据得到的位置序列,对应的物体种类、物体方向进行绘图
plotPermute(SolutionPosition,SolutionQ,SolutionD,BigSet);

⛄三、运行结果

在这里插入图片描述

⛄四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]江宝钏,熊伟清.一种求解三维集装箱装箱问题的混合遗传算法[J].计算机工程与应用. 2007(26)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab领域

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值