装箱问题

装箱问题是复杂的离散组合最优化问题。所谓组合优化,是指在离散的、有限的数学结构上,寻找一个满足给定条件,并使其目标函数值达到最大或最小的解。经典的装箱问题要求把一定数量的物品放入容量相同的一些箱子中,使得每个箱子中的物品大小之和不超过箱子容量并使所用的箱子数目最少。

本题目解决的装箱问题,是在一个固定大小的集装箱中,装入大小不一,数量不定的货物,这些货物的长宽高不完全一致,且货物的总体积大于集装箱的体积。那么在把货物装进集装箱时,并不是所有货物都可以放进去,此时就有一个问题,放哪些货物,怎么样放,才能使放进去的货物总体积达到最大。设放入的货物总体积为Vuse,集装箱总体积为Vall。求如何放置才能使集装箱的空间利用率rate达到最大,三维装箱问题的本质是求放置方法最优解。

要解决这个问题,首先要决定怎么样去放置货物,在放置货物时,先放哪个后放哪个,放完一个怎么样去放另一个,空间如何去计算等等一系列问题。这里我们把三维的问题化简到一维,把货物按照一定的顺序排列起来,再根据这个排列顺序,依此将货物放进集装箱中。由此,三维空间的问题就化简为一维的排列问题。

那么,怎么样排列,能达到最优解,空间利用率达到最大,就需要算法出手解决了。

禁忌搜索算法

禁忌搜索算法(Tabu Search)是一种元启发式算法,用于在大规模搜索空间中找到近似最优解。以下是基于禁忌搜索算法解决三维装箱问题的一般流程:

初始化:

在解决三维装箱问题时,禁忌搜索算法的初始化阶段通常需要生成一个初始解,即将所有货物按照某种顺序依次放入箱子中,直到无法再放为止。初始解的生成可以采用贪心策略、随机策略、启发式策略等多种方法。

在贪心策略中,可以将所有货物按照某种规则进行排序,例如按照体积从大到小排序,然后依次将货物放入箱子中,直到无法再放为止。这种方法简单易行,但不能保证生成的解是最优的。

在随机策略中,可以随机生成多个初始解,然后通过禁忌搜索算法对这些初始解进行搜索,最终选择最优的解作为最终解。这种方法可以避免陷入局部最优解,但需要花费更多的时间和计算资源。

需要注意的是,初始解的质量对最终解的质量具有很大的影响,因此需要根据实际情况选择合适的初始化策略。同时,初始解的生成也需要考虑到禁忌搜索算法的特点,尽量避免生成过于相似或者重复的初始解。本题使用了随机策略。

S0=randperm(N_boj);                     %随机产生初始解

评价函数:

定义一个评价函数,用于评估当前解的质量。在解决三维装箱问题时,禁忌搜索算法的评价函数用于评估当前解的质量。评价函数通常由两部分组成:目标函数和惩罚项。

目标函数用于评估当前解的装箱效率,例如使用箱子的数量、剩余空间等指标来度量解的质量。一般来说,目标函数越小表示解的质量越好。

惩罚项用于惩罚不符合规则的解,例如重叠、超出箱子范围等问题。惩罚项可以通过添加一个大的惩罚值来实现。一般来说,惩罚项越小表示解的质量越好。

评价函数的设计需要根据具体问题来确定,一般需要结合实际情况和实验结果进行调整。在实际应用中,评价函数的设计对禁忌搜索算法的效率和结果质量具有重要影响。需要综合考虑搜索时间、结果质量和算法复杂度等因素,选择合适的评价函数。

%计算容器的空间利用率
V_sum = sum(record_volume,1);
V_box = box_x*box_y*box_z;rate_V = V_sum/V_box;

禁忌表:

禁忌表是禁忌搜索算法的重要组成部分,用于记录搜索过程中的禁忌信息和历史信息,以避免搜索过程中陷入局部最优解。禁忌表通常包括以下内容:

禁忌列表(Tabu List):用于记录禁忌状态的货物和放置位置。禁忌状态通常是指搜索过程中已经试图放置的货物和位置,而这些货物和位置当前不应再被选中,以避免搜索过程中出现重复或者无效的操作。

邻域搜索:

在领域搜索中,需要设计合适的邻域结构和评价函数。邻域结构描述了当前解与其邻域解之间的变化关系,即如何从当前解移动到其他解。在三维装箱问题中,邻域结构可以包括将已放置的货物移动到其他位置或者交换货物之间的位置。邻域结构需要满足以下要求:包括所有可能的邻域解;易于实现和计算;能够保证搜索结果的质量和效率。

领域搜索是禁忌搜索算法的核心部分之一,其效果和效率对算法的结果和时间有着直接影响。因此,在算法实现中需要对邻域结构和评价函数进行充分的优化和调整,以获得更好的结果和效率。

停止条件:

当达到一定的停止条件时,结束搜索,并返回最优解。

输出结果:

将最优解输出,包括货物的放置顺序和箱子的空间利用率。

MATLAB实现

程序分为四个部分,初始化,禁忌搜索,装箱过程,绘制图形

初始化:

设定集装箱大小,货物大小和数量

% 创建5x5x5的正方体容器
box_x = 5;
box_y = 5;
box_z = 5;% 创建N个小长方体
goods_set = [2 2 5; 3 1 3; 1 5 2; 2 4 2; 6 2 2;1 4 2; 3 2 3; 2 1 2; 2 4 2; 2 2 2;5 4 2; 3 2 3; 2 1 2; 1 4 2; 1 2 2;5 2 2; 5 1 2; 2 2 5; 1 3 2; 4 6 13];

禁忌搜索:

使用禁忌搜索算法,生成新的解,也就是装箱顺序,并把这个解传递给装箱过程函数,模拟装箱过程,并计算空间利用率,来判断当前解是否是最优解。

装箱过程:

按照给定的顺序把不同大小的货物装进集装箱中,并计算空间利用率

for i = 1:obj_num% 在容器中寻找可以放置货物的位置for z = 1:(box_z-h+1)for y = 1:(box_y-l+1)for x = 1:(box_x-w+1)% 检查当前位置是否可用if ~any(container(x:x+w-1, y:y+l-1, z:z+h-1))% 如果可用,将货物放置在该位置container(x:x+w-1, y:y+l-1, z:z+h-1) = i;%记录放置的序号record_index(i)  = i;%记录已经放置的体积record_volume(i) = w*l*h;%记录已经放置的物品的长宽高和坐标%XYZ长度,XYZ坐标record_obj(i,:) = [w l h x y z];%record_obj_cnt=record_obj_cnt+1;break;endend
%             if container(x,y,z)==i % 货物已放置,则退出循环
%                 break;if ismember(i,container)break;endendif ismember(i,container)break;endendend

绘制图形:

绘制一个三维图形,把装箱的情况直观显示出来

fill3(final_x,final_y,final_z,C2);

最终效果

累次迭代的放置效果以及空间利用率

适应度进化曲线,也就是空间利用率的优化过程曲线

这里只迭代了100次,效果很明显

结语

很有趣的小项目,欢迎大家来交流学习,共同进步

基于禁忌搜索算法的三维装箱问题相关推荐

  1. 基于最低水平面的三维装箱问题的启发式算法

    ⭐️ 前言 小编之前写过一篇博文:求解三维装箱问题的启发式深度优先搜索算法(python),详述了基于空间选择的三维装箱算法.本文考虑了一个事实:在某些情况下,我们在摆放物品时,总是优先选择较低的平面 ...

  2. 基于禁忌搜索算法的TSP问题求解matlab仿真

    目录 1.算法概述 2.仿真效果 3.matlab仿真源码 1.算法概述 禁忌搜索(Tabu Search,TS)算法是组合优化算法的一种,是局部搜索算法的扩展.禁忌搜索算法是人工智能在组合优化算法中 ...

  3. 【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码

    1 内容介绍 设计了一种基于禁忌搜索的遗传算法,利用遗传算法提供的并行搜索主框架,结合禁忌算法的个体串行搜索方式,能扩大搜索空间,快速实现全局优化.把基于禁忌搜索的遗传算法与启发式方法相结合用来求解背 ...

  4. 【优化布局】matlab基于禁忌搜索算法求解基站选址问题代码

    1 简介 物流配送中心选址问题在物流网络规划中占有非常重要的地位,选址的合理与否直接关系到配送中心未来的发展.针对企业选址的一般要求,以配送中心总成本最小为目标,构造了一种物流配送中心选址模型.该模型 ...

  5. 【路径规划】基于禁忌搜索算法求解初始点和终点确定的取送货路径问题matla代码

    1 简介 研究了带时间窗的取送混合车辆路径问题.问题中,每个客户带有取货和送货两个时间窗,每个客户处的取货和送货任务可以通过访问一次全部完成,也可以分两次访问分别完成送货和取货任务.在对该类问题进行描 ...

  6. 【优化规划】基于matlab禁忌搜索算法求解配电网无功补偿优化规划问题【含Matlab源码 1842期】

    一.基于禁忌搜索算法的无功优化参数选择及流程 禁忌搜索方法是Glover F在1986年首次提出的一种智能启发式算法.鉴于禁忌搜索算法是对局部邻域搜索的一种扩展,通过引入一个灵活的存储结构和相应的禁忌 ...

  7. 领域搜索算法java_使用JAVA实现算法——禁忌搜索算法解决TSP问题

    packageBasePart;importjava.io.BufferedReader;importjava.io.FileInputStream;importjava.io.IOException ...

  8. 遗传-粒子群算法遗传-禁忌搜索算法求解TSP问题

    1. 前言 上一篇博文[五种常见启发式算法求解TSP问题-总结篇]中,总结了五种常见启发式算法在求解TSP问题上的效果,其中遗传算法的求解质量最差,而粒子群算法和禁忌搜索算法的求解效果最佳,因此本文计 ...

  9. 实验10 禁忌搜索算法求解tsp问题

    传送门(所有的实验都使用python实现) 实验1 BP神经网络实验 实验2 som网实验 实验3 hopfield实现八皇后问题 实验4 模糊搜索算法预测薄冰厚度 实验5 遗传算法求解tsp问题 实 ...

最新文章

  1. php 类中的各种拦截器
  2. HttpMessageConverter转换类型
  3. jpa 查找最后一条数据_查找数据的最后1条记录,你用了2小时,同事1分钟就搞定了...
  4. 【MATLAB】数据类型 ( 矩阵 | 随机数函数 | 生成矩阵 )
  5. 新BOJ 88. 最值问题
  6. php date( ymd_PHP-date(),time()函数的应用
  7. 【DP】【容斥】Nice to Meet You(AT3634)
  8. 如何将一棵LSM-Tree塞进NVM
  9. filter - date 日期插件
  10. 研究生跟了一个很棒的导师是种怎样的体验?
  11. 【Cocos 3d】粒子特效的制作与使用
  12. office word安装mathtype报错,找不到mathpage.WLL文件
  13. 永中word页码怎么从第二页开始_word转pdf软件有哪些?word转pdf软件怎么操作?
  14. Python免费发短信时报错
  15. 关于高通QPST平台功能和选项的一些简单说明
  16. 计算机是如何工作的? ----李泽源
  17. go语言基础-----06-----匿名字段、同名字段
  18. Caffe 源码 - BatchNorm 层与 Scale 层
  19. 速看 2021-2022年23项重大网络犯罪统计数据
  20. 关于Trunk、Hybrid、Access、Tag、Untag、Pvid的关系

热门文章

  1. GOF23设计模式之桥接模式
  2. Illustrator CS5扭曲功能初学者必读(2)——宽度工具
  3. 电路中的基尔霍夫定律理解与使用
  4. mysql中select使用方法,MySQL中select语句介绍及使用示例
  5. c语言中余数取整,C 逻辑运算, 移位运算 , 取整 , 取模(取余)
  6. Logger日志文件记录
  7. 利用百度poi计算城市能级及评价街道范围便利度、生活宜居情况等
  8. MySQL基础之多表查询
  9. 4米乘以12米CAD图_身高1米6,却能在12顺位被选中?单场4分19助,他有多强?
  10. 考研政治(一)马克思原理