Best-Fit算法求解二维装箱问题

作者简介:本人擅长运筹优化建模及算法设计,包括各类车辆路径问题、生产车间调度、二三维装箱问题,熟悉CPLEX和gurobi求解器
微信公众号:运筹优化与学习

如有运筹优化相关建模或代码定制需求,可通过微信公众号联系我们

前言

之前给大家分享了三维装箱问题、遗传算法求解三维装箱问题,如果大家感兴趣可以看以下推文:

遗传算法求解三维装箱问题(上篇)

遗传算法求解三维装箱问题(下篇)-代码详解

今天我们来介绍三维装箱问题的一类变体:二维装箱问题(Two-dimensional Bin Packing Problem),即不考虑物品的高度,只考虑物品的长度和宽度。

问题简介

二维装箱问题,就是将若干个矩形物品装进大矩形容器中,并且在装箱的过程中不允许将矩形物品斜着放,只允许将物品旋转90度放置,目标为最小化大矩形容器的使用数目。

该问题及其变体在现实生活中具有广泛应用,如闸室排档问题,将不同尺寸的船舶合理停泊与船闸闸室中;二维板材剪切排样问题,将大矩形原材料裁剪为若干不同尺寸的小矩形件。

Best-Fit算法介绍

最佳适应算法是由 Burke 等人提出用于求解二维装箱问题的启发式方法。该算法的基本思想为:装箱过程中,将所有容器按照剩余空间大小升序排列,尝试将物品装入剩余空间最小的容器中。

对于Best-Fit算法,物品的装箱顺序也会算法的最终装箱效果。通常,装箱之前会按照物品的面积、长度或者宽度进行降序排列。同样,为了提升算法效率,学者们尝试融合各种元启发式算法对问题进行求解,如遗传算法、禁忌搜索算法等。其中,融合禁忌搜索策略的装箱算法伪代码如下所示。

部分代码展示

%% Best Fit Algorithm for 2D Bin Packing Problem
clc
clear

%% Initialization
Rectangle = xlsread('data');     % import data
Array=Rectangle(:,1);
rect_num = size(Rectangle,1);    % the number of rectangle
bin_size.width = 60;
bin_size.length = 60;
RectCoords = zeros(rect_num,10);  % store the ID ,vertex coordinates,BinNumber


%% Main Loop
add = 1;
SumOfBin = 1; % the number of big bin
Ai = cell(SumOfBin,1); 
[ Rect,Put ]=SortOrder(Rectangle,rect_num); % sort rectangle order

while ( add <= rect_num )
    
    neach = rect_num;
    flag = 1;
    Ai{SumOfBin} = zeros(1,bin_size.width); %initial Ai
     while ( flag ~= 0 && add <= rect_num )
        [ Ai,flag,Rect,RectCoords ] = Best_Fit( Ai,bin_size,neach,Rect,SumOfBin,RectCoords );
         if ( flag == 1 )
             add = add + 1;
             neach = neach - 1;
         else
              SumOfBin = SumOfBin + 1;
              break
         end
     end
end

%% The Final Result
FinalResult=csvread('FinalResult.csv',1,0);
[ia,~,ic] = unique(FinalResult(:,10));
ind=arrayfun(@(i)find(ia(i)==ic),1:length(ia),'un',0);
Result=arrayfun(@(i)FinalResult(ind{i},:),1:length(ia),'un',0);
for ii=1:SumOfBin
    Bin=Result{ii};
    for iii=1:size(Bin,1)
        X=Bin(iii,2);
        Y=Bin(iii,3);
        W=Rect(Bin(iii,1)).width;
        H=Rect(Bin(iii,1)).length;
        rectangle('position',[X,Y,W,H],'FaceColor',[0 0.4470 0.7410],'EdgeColor','k');
    end
end

结果展示

代码输出:装箱结果示意图

代码输出:每个货物摆放位置的坐标

参考文献

BURKE E K, KENDALL G, WHITWELL G. A new placement heuristic for the orthogonal stock-cutting problem [J]. Operations Research, 2004, 52(4): 655-71.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

eternal1995

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

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

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

打赏作者

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

抵扣说明:

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

余额充值