基于禁忌搜索算法的三维装箱问题

文章介绍了装箱问题作为一种组合优化问题,目标是最大化集装箱的空间利用率。通过将三维问题简化为一维排列问题,然后应用禁忌搜索算法来寻找近似最优解。算法流程包括初始化、评价函数、禁忌表、邻域搜索和停止条件。在MATLAB中实现该算法,展示装箱效果和空间利用率的优化过程。
摘要由CSDN通过智能技术生成

装箱问题

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

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

rate=V_{use}/V_{all}

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

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

禁忌搜索算法

禁忌搜索算法(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;
                end
            end
%             if container(x,y,z)==i % 货物已放置,则退出循环
%                 break;
              if ismember(i,container)
                  break;
              end
        end
        if ismember(i,container)
           break;
        end
     end
        
end

绘制图形:

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

fill3(final_x,final_y,final_z,C2);

最终效果

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

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

 

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

结语

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

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值