精华内容
下载资源
问答
  • 三维装箱问题MATLAB代码,注释比较少,需要学习的可以下载。
  • 3D with rotation on matlab 三维装箱问题代码 实测可以运行 MATLAB代码 欢迎下载
  • 本程序能按照剩余空间最小的原则得出最优三维装箱顺序。
  • 本人参加2019MCM,对于三维装箱问题,装好箱子使所用缓震材料最少(不是装满箱子)的个人解决策略和国外教授写的可视化程序
  • 完整代码,可直接运行
  • 三维装箱问题——最佳适应解法(BestFit),利用Java实现,借鉴于GitHub项目,大篇幅修改完成,数学建模专用。
  • 三维装箱MATLAB程序.m

    2019-11-04 13:17:21
    三维装箱MATLAB程序.m,目前求解方法主要是近似算法。
  • 3维装箱问题 C语言实例 可以运行 欢迎您下载使用 如果有问题可以私聊我
  • 基于改进粒子群算法的三维装箱优化研究,杨志强,牛占文,本文提出一种适用于求解三维装箱问题的改进粒子群优化算法。该算法在简化粒子群优化算法的基础上,引入小生境技术实现初始种群的
  • 三维装箱问题Java代码的简单实现过程

    万次阅读 多人点赞 2016-07-06 10:48:58
    **三维装箱问题Java代码的简单实现过程**  时间:2016年7月  作者:竹林春雨  QQ:6996899 (一) 前言 勤勤恳恳地码农了很多年,也没少在CSDN上下东西,一直没有贡献过什么,突然略感愧疚。恰好最近领导指派...

    时间:2016年7月
                                  作者:竹林春雨
                                   QQ:6996899

    (一) 前言

    勤勤恳恳地码农了很多年,也没少在CSDN上下东西,一直没有贡献过什么,突然略感愧疚。恰好最近领导指派设计一款类似库房管理的软件,其中涉及到零售商库房商品打包出库的部分,刚好碰到商品装箱问题。将思路和大家分享,如有不妥,望及时指正,可联系QQ或者直接留言。
      
    (二) 背景及业务叙述

    顾客下完订单以后,零售商库房将商品打包出库;库房工作人员将订单所购买的商品装到零售商所提供的不同型号的箱子中,打包寄送给顾客。
      顾客下的订单中包含各式各样的大小规格的商品,有一些不能倒置,像玻璃瓶的酒水饮料、易碎物品,带重力感应的仪器设备,都不可倒置。
    供应商提供不同种类的箱型,以方便商品的二次包装。
      装箱工人需要根据实际情况将不同类型的商品放置到合适的箱子中去。

    (三) 问题叙述

    首先,装箱工人在装箱过程中需要对订单的商品选择箱型,评估商品体积和箱子容积的正确比例,这一过程极其耗费资源,给仓库作业带来困难的同时还降低了作业效率。
      其次,所送商品会出现装箱不合理的情况,如,顾客只是买一款体积很小的商品,收到的确是一个很大很空的箱子,浪费资源的同时,也给用户带来困惑,同时零售商的专业性也遭到了质疑。

    (四) 编写目的以及适用读者

    为了帮助作者实现算法过程中能够捋清思路,不迷失方向。

    (五) 需求(自己整理,如有偏差,见谅)

    1,自动计算出某一订单需要各种规格的箱子各多少个。
    2,商品绝对不可以倒置(旋转180度、上下颠倒)。但是某些商品可以躺着放(旋转90度、横向放置)。
    3,尽可能不浪费箱子资源,箱子尽可能装满。

    (六) 定义

    术语定义:

    1, 箱型:箱子的型号,记录记录箱子内部空间的长宽高等属性。箱型的长宽高特指箱体内部的长宽高。
    2, 常规箱型:最常用的箱子型号,符合大多数商品,以及方便搬运的体积。
    3, 特型:最不常用的箱型,不方便运输以及码放。例如:装晾衣杆的特长箱型、装大号电冰箱的特大号箱型。
    4, 常规指数:箱型的orderNum属性,用来表示优先使用的箱子,和不推荐使用的特型箱子。(数字越大,越常规)
    5, 容积:特指箱子的容量。
    6, 剩余容积:箱子装入一个商品后还剩多少空间,箱子的剩余空间用构造好的若干个更小的箱型表示。
    7, 体积:特指商品的体积。(这里每个箱子只装一个商品,剩下的空间将分割成更小的3个箱子)
    8, 满:箱子中放不下订单中任何其他商品的时候,箱子状态为满。
    9, 未满:箱子中还可以放下订单中的其他任意小件商品时候,箱子状态为未满。
    10, 爆箱:箱子还有一部分空间,但是订单中最小的商品体积比箱子的剩余容积大。
    11, 符合度:特指一组商品和某种箱型的符合度,数值越小,越符合。符合度公式:0-(剩余容积+容积–常规指数)得到的数字越大,符合度越高。

    规则定义:

    1, 所有箱子均为标准的长方体或者正方体。长宽高为内围长宽高(从箱子内部测量,如果是从箱子外部测量,需减去箱壁的厚度)。
    2, 所有商品均描述为矩形,长宽高为外围长宽高。
    3, 装箱时,优先放置大件商品。如果大件商品放不满的情况下,考虑次小商品,直到放满为止。
    4, 装箱时,优先选择容积小的箱子。容积更小的箱子如果能够装下商品,则剩余容积会更小,说明箱子更适合商品。其次优先选择常规指数最大的箱子。(值越大越常规,值越小表示是非常规箱型甚至是特型箱)
    5, 如果订单中的商品恰好已经装完,箱子未满,尝试更换容积更小的箱子。如果爆箱则换回原来的箱型。
    6, 如果订单中的商品恰好已经装完,出现爆箱,尝试更换小一号箱子,后继续装箱剩余商品。如果此时箱子已经是最小,则更换成多个箱子装箱。
    7, 将箱型按照符合度值由大到小的顺序排列。如果箱子可以装满的情况下优先选择符合度值大的箱子。
    8, 将箱型按照容积从小到大的顺序排列。如果箱子装不满优先尝试小的箱型。
    9, 箱子优先放置大件商品,然后放置次大商品,最后放订单中最小的商品。
    10, 优先尝试使用单个箱子完成一个订单的商品的包装,其次尝试使用多箱完成一个订单的商品包装。
    11, 如果所有的箱子都不能一个箱子装下单个订单内的全部商品,才会启用多个箱子来装商品。(个别特性箱可能只正对某一款商品,此时该箱型可以不参与该逻辑运算。)

    (七) 数据模型

    实体关系ER
    这里写图片描述

    实体清单
    这里写图片描述

    实体属性

    1. 订单
      这里写图片描述

    2. 订单项
      这里写图片描述

    3. 商品
      这里写图片描述

    4. 箱子
      这里写图片描述

    5. 箱型
      这里写图片描述

    6. 订单的盒子清单项
      这里写图片描述

    7. 客户
      这里写图片描述

    (七) 实现过程

    单个商品的一次装箱过程

    商品的长宽高以及箱子的长宽高分别如下图所示:
    这里写图片描述
                       图一
    单个商品装入箱子中以后如下图所示:
    这里写图片描述

    装进箱子中以后所产生的剩余空间如下图所示:
    这里写图片描述

    在商品可以装入箱子的情况下,每装入一次,可以产生三块新的空间,也就是新的箱子。三个新的箱子的大小是可以通过计算得到的。

    假如上述方案,商品的长度、宽度或者高度中任意一个维度的值要大于箱子的长度、宽度或者高度的话,表示箱子装不下此商品,需要使用其它的摆放方案解决装箱问题。下文列出三种其它方案,加上上述方案,一共四种。

    其它摆放方案

    假设商品不可以倒置(其实商品在矩形形态下,倒置和正常放置占用空间一样,所以不考虑该情况),第二种方案是将上一种(前一章节的图三)横向旋转90度,假如横向旋转180度商品的占用空间和不旋转没有任何区别,所以该情况也不考虑,通过总结得出四种方案,以下将列出其余的三种方案。

    第二种方案

    将箱子内部的商品,在商品正常摆放(正面朝上)情况下,横向向右旋转90度得到下图的三个新的箱子(剩余空间):

    这里写图片描述

    第三种方案

    如果商品不介意放倒(平躺)的话,那么就会有第三种方案,在商品正常摆放(正面朝上)情况下,向左倾斜90度,得到如下三个剩余空间:

    这里写图片描述

    第四种方案

    如果商品不介意放倒(平躺)的话,那么就会有第四种方案,在商品处于第三种方案摆放姿态的情况下,向右旋转90度,得到如下三个剩余空间:

    这里写图片描述

    (八) 小结

    上述内容,对一次装箱过程进行了分解,每次需要一个商品和一个空箱子,同时会产生三块新的更小的剩余空间。这三块剩余空间又可以看作是新的箱子。和新的合适自己的空间大小的商品去匹配。

    那么,这就是一个递归算法,方法输入一款商品和一个箱子,每一次递归都会产生三个新的箱子,新的箱子又可以装入其它更小的商品。

    如此循环往复,直到每一个新的箱子连最小的商品都装不下了,或者没有任何商品可以装进箱子里了,这个过程就会自动结束。这是递归的出口条件。

    其实,当然没有那么简单,图二所示的商品放入箱子的方法至少分为4种,每一种都需要尝试一下,以求得最合理的剩余空间;另外还有一订单多商品多箱子。

    (九) 可能存在的问题

    1, 箱子没有实际装满(”装满”的定义非本文中定义的)。
    2, 用户会认为系统推荐的装箱方案不是太合理的安排。特型箱被匹配到常规商品上。例如:可能会有一种特别细长的箱型、而某种商品又恰好长宽都匹配,一字码放很多件后,刚好填满,这也是一个很奇葩的结局,需要特别考虑。
    3, 部分箱型和商品需要手动匹配,因为某些箱子本来就是专门为指定的商品量身定做的。

    (十) 尾声

    程序员总是沉浸在自己的世界里、忽视身边的朋友、父母、妻子和孩子、最近南方洪灾不断、而执拗的老父刚刚负气而回、生活总有那么多的不如意。

    如果此文还有一点价值的话,那就算是献给我需要感恩的人们吧…
      
    作者在后来研发的新款WMS中就采用了该算法来计算和评估商品所需要的箱型。
      
      代码请参考: http://smallcode.cn/post/4

    展开全文
  • 针对约束条件下三维装箱问题复杂性,为提高装箱利用率,本文提出 了混合粒子群算法,该算法采用BF启发式算法配合改进的自适应权重粒子群算法实现.通过仿真试验,结果表明该混合粒子群算法对解决部分约束条件下装箱问题 ...

    1 简介

    针对约束条件下三维装箱问题复杂性,为提高装箱利用率,本文提出 了混合粒子群算法,该算法采用BF启发式算法配合改进的自适应权重粒子群算法实现.通过仿真试验,结果表明该混合粒子群算法对解决部分约束条件下装箱问题 较之传统研究遗传算法利用率和准确率更高,具有不同程度的可行性.

    1.1 粒子群算法

       粒子群算法(PSO)属于群智能算法的一种,是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物(即通常优化问题中所讲的最优解),鸟群的任务是找到这个食物源。鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即我们所说的找到了最优解,即问题收敛。

    (1)粒子群算法的流程

       粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度

    和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。粒子群算法的思想相对比较简单,主要分为:1、初始化粒子群;2、评价粒子,即计算适应值;3、寻找个体极值;4、寻找全局最优解;5、修改粒子的速度和位置。下面是程序的流程图:

    img

    (PSO流程)

    1.2 三维装箱问题

    2 部分代码

    clc;clear;close all;
    Vmax = 1;%速度限制
    Vmin = -1;
    nodes=50;%节点数目
    links=150;%边数目
    dims=nodes*(nodes-1)/2;%种群维数
    c1 = 1.49445;
    c2 = 1.49445;
    maxgen = 300;    %进化次数
    sizepop = 100;   %种群规模
    % 惯性权重
    w=1;
    % 线性递减惯性权重
    w_max=0.9;
    w_min=0.4;
    pop=zeros(sizepop,dims);%初始化种群
    trans_index=zeros(1,dims);%初始化转换索引
    %% 产生初始粒子和速度
    for iter = 1:sizepop
       %初始化种群
       xx=randperm(nodes);
       yy=randperm(nodes);
       A=zeros(nodes,nodes);%连通阵,AA的迹为0
    
    
               fitnesspbest(j) = fitness(j);
           end
           % 群体最优更新
           if fitness(j) > fitnessgbest
               gbest = pop(j,:);
               fitnessgbest = fitness(j);
           end
       end
       record(1,i)=fitnessgbest;
       fprintf('%d     %f\n',i,fitnessgbest);  %输出结果
    %% 适应度值变化绘图
    plot(record);
    xlabel('gen');
    ylabel('fitness');
    end

    3 仿真结果

    img

    4 参考文献

    [1]杜振, 宫会丽. 解决约束三维装箱问题的混合粒子群算法[J]. 计算机光盘软件与应用, 2014, 000(022):115-116.

    展开全文
  • 有一些物品,需要将这些物品装到箱子中,求装箱情况,那么我们应该思考如何装箱装箱时要遵循什么样的准则。
  • 三维装箱决策问题

    千次阅读 2021-01-23 11:59:39
    三维装箱决策问题2.三维装箱决策问题分析3.算法描述(1) 原理描述(3) 时间复杂度分析 1.三维装箱决策问题 三维装箱问题即研究如何用最少数量的箱子将物品装起来。其描述如下: 假设有n个物品,其长宽高信息分别为(l1...

    1.三维装箱决策问题

    三维装箱问题即研究如何用最少数量的箱子将物品装起来。其描述如下:

    假设有n个物品,其长宽高信息分别为 ( l 1 , w 1 , h 1 ) (l_1,w_1,h_1) (l1,w1,h1), ( l 2 , w 2 , h 2 ) (l_2,w_2,h_2) (l2,w2,h2) ( l n , w n , h n ) (l_n,w_n,h_n) (ln,wn,hn)。有容器,其容积分别为 V V V。用最少的箱子,将全部物体都装起来。

    对于每个物品 i i i,假设其放入箱子的顺序,角度以及位置是 ( S i , R i , P i ) (S_i, R_i, P_i) (Si,Ri,Pi)。需要求解出集合{ ( S 1 , R 1 i , P 1 ) . . . . . ( S n , R n , P n ) (S_1, R_1i, P_1).....(S_n, R_n, P_n) (S1,R1i,P1).....(Sn,Rn,Pn)},使得所用容器数量最少。本质上是离散组合最优化问题。

    而三维装箱决策问题描述如下:

    假设有n个物品,其长宽高信息分别为 ( l 1 , w 1 , h 1 ) (l_1,w_1,h_1) (l1,w1,h1), ( l 2 , w 2 , h 2 ) (l_2,w_2,h_2) (l2,w2,h2) ( l n , w n , h n ) (l_n,w_n,h_n) (ln,wn,hn)。有容器,其容积分别为 V V V。是否能用 m m m个容器,将全部物体都装起来。

    可以看出,问题从计算最少容器数量变为能否用一定数量的容器能够装下。解决该问题,只需要解答出是,或者否即可。

     
     

    2.三维装箱决策问题分析

    三维装箱决策问题是NP-Complete问题。此类问题能够在多项式时间内验证答案是否准确,可是目前并没有任何算法能够在多项式时间内解得答案。意味着对于此类问题,一般只能采用诸如暴力解等时间复杂度很高的算法求解。当物品数n和容器数量k增加时,求得最优解所需时间也会急剧增长。

    想要减短计算时间,可以使用启发式算法计算。启发式算法大致如下:

    一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。

    其核心是基于直观或者经验去构造算法。对于装箱,理解为基于平时装箱的经验,优先选择某些组合,或者放弃某些组合。如装箱时,一般会把体积最大的物品放在最下面,这种经验可以帮助排除掉一些不合理的组合,提高计算速度。最后,尽管计算出的结果牺牲一定的准确性,但是可以缩短计算时间。而经验若足够合理,也能使得计算结果准确性不会过于低。

    一种经典的Bin packing problem启发式算法是First-Fit (FF)算法其核心思想是按照一定顺序取物品,一旦当前物品能够找到合适的角度和位置能够放入容器中,则放进去。其思想与现实中装箱的方法一定程度上吻合。另外该算法也被验证出有不俗的性能,能够保证计算出来的结果小于最优结果的1.7倍。

    本文将介绍一种基于First-Fit算法实现的的包材推荐算法。

     
     

    3.算法描述

    (1) 原理描述

    在这里插入图片描述

    如图所示,首先建立三维坐标系,其中三个轴分别为Weight轴Height轴Length轴。当物体放入坐标轴时,使用其左后下顶点的坐标表示其位置。将包装箱按照各轴对应的方向置于坐标轴原点中。

    接着将商品按照一定规则排序(如按体积从大到小),依次放入包装箱内。当一个商品放入箱子时,可以通过旋转物体调整方向。假设物体的尺寸为 ( w , h , l ) (w, h, l) (w,h,l),则一共有一下六种情况:

    Weight轴Height轴Length轴
    w w w h h h l l l
    h h h w w w l l l
    h h h l l l w w w
    l l l h h h w w w
    l l l w w w h h h
    w w w l l l h h h

    对于第一个商品,将其放在原点处。如果当前方向无法放入,则旋转商品,直到放入为止。商品1放入后,接着放商品2。此时商品2可以选择放在商品1的前方右方或者上方。如下图所示:

    在这里插入图片描述
    依次尝试将商品2放在这三个位置中,如果放不进,则旋转商品,一旦找到能商品放进包装箱的位置和方向,则将商品2放入。当商品3放入时,我们可以选择将商品3放入商品1的前方右方或者上方,商品2的前方右方或者上方。同理寻找可以将商品3放入包装箱的位置和方向,一旦找到,则将其放入。

    同理对于商品n,可以选择放在商品( 1 1 1 n − 1 n-1 n1)的前方,右方或者上方。尝试不同的位置和方向,一旦校验到商品n超出包装箱或者与包装箱中别的商品位置有重合,就通过旋转或者改变位置的方式寻找下一个存放的方式,直至商品能够放进去位置。若商品无法放入包装箱中,则认为当前包装箱无法容纳所有商品,对下一种包装箱进行计算。

    即可得代码逻辑如下:

    sorted_box_list <- 按照体积排序的所有包材
    sorted_sku_list <- 排好序的sku
    total_sku_volume <- sku总体积
    rotation_list <- 六种方向
    
    for box in sorted_box_list:
       if box_volume < total_sku_volume then continue
       else 
    	   fit <- false
    	   for rotation in rotation_list:
    	      if can_put(sku1, rotation, (0, 0, 0)) then 
    	          fit <- true
    	          put_into_box(sku1, rotation, (0, 0, 0))
    	          break
    	   if fit = false then continue
    	       
    	   for skui in sorted_sku_list[1:]:
    	     fit <- false
    	     find_position:
    		      for item in box_item_list:
    		          for position in [item_front, item_top, item_right]for rotation in rotation_list:
    			              if can_put(skui, rotation, position) then 
    			                 fit <- true
    			                 put_into_box(skui , rotation, position)
    			                 break find_position
    	     if fix = false
    	        then continue
    	     return box
           
    

    (3) 时间复杂度分析

    假设一共有 k k k种包装箱,订单商品有 n n n个。对于第 i i i个商品,最多能够旋转6个方向,并且尝试放在箱子的 i − 1 i-1 i1个商品的前、右和上3个方向。因此最多需要尝试 3 × 6 × ( i − 1 ) = 18 ( i − 1 ) 3×6×(i-1)=18(i-1) 3×6×(i1)=18(i1)种情况。因此可以计算得到本算法最坏情况下时间复杂度为:

    T ( n ) = k × 18 × ( 1 + 2 + 3 + . . . . . . + n − 1 ) = 18 k × ( n − 1 + ( n − 1 ) ( n − 2 ) 2 ) = 18 k × n ( n − 1 ) 2 = 9 k n 2 − 9 k n = O ( k n 2 ) \begin{aligned} T(n) &=k×18×(1+2+3+......+n-1) \\ &= 18k×(n-1 + \frac{(n-1)(n-2)}{2})\\ &= 18k ×\frac{n(n-1)}{2} \\ &= 9kn^2-9kn \\ &= O(kn^2) \end{aligned} T(n)=k×18×(1+2+3+......+n1)=18k×(n1+2(n1)(n2))=18k×2n(n1)=9kn29kn=O(kn2)

    展开全文
  • 三维装箱:给定装载的四个约束:长,宽,高,限重,若干待装载货箱的信息:长,宽,高,重量,求满足约束的情况下,最佳的装载方式(或是达到最高载重,或是达到最大装载体积),以货物的装载顺序和在卡车中的位置...

    一、获取代码方式

    获取代码方式1:
    通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

    获取代码方式2:
    通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,可获得此代码。

    获取代码方式3:
    完整代码已上传我的资源:【三维装箱】基于matlab求解三维装箱优化问题【含Matlab源码 949期】

    备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);
    订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

    二、三维装箱简介

    1 前言
    三维装箱问题(Three Dimensional Container Loading Poblem)指在满足容积限制、外形几何限制和稳定性限制等条件的情况下,把一定数量体积较小的物品放入具有较大容量的一个或多个箱子,达到所用箱子数量最少、空间利用率最高、稳定性最好、装载价值最高、容重比最高等目的组合优化的问题。三维装箱问题广泛存在于运输和包装等行业的物资装载过程中,因此,如何针对实际应用需求设计具有较高操作性和装载效率的三维装箱求解算法,对于提高社会经济效益具有积极作用。

    自20世纪60年代开始,三维装箱问题便因切割库存问题而提出,引起了学者关注,并被证明是具有较高复杂度的NP难问题。经过多年发展,三维装箱问题的求解不仅在枚举法、分支定界法等确定性算法上取得了进步。随着元启发式算法、遗传算法、粒子群算法等现代启发式算法的崛起,三维装箱问题的研究更加深入,逐步出现了带有多种现实约束和求解目标的复杂算法。其中,近年来具有代表性的相关研究如下所述。

    Lodi等[9]受到一维装箱问题求解算法的启发,针对三维装箱问题提出了基于“先高后面积”(Height First-Area Second)的分层策略的结构式禁忌搜索算法,实验证明算法在分层堆放的情况下能得到较好的结果。Crainic等考虑了装载盒子时箱子剩余空间的描述和备选定位点的重要作用,为寻找每次装载时的合适空间位置和最优定位点,提出了极点(Extreme Points,EPS)的概念和计算方法,并设计了基于极点的三维装箱启发式算法。Karabulut[12]和Kang[13]等先后以规则长方体箱装载最大量规则长方体盒为研究目标,在设计深度、底部和左部方向优先装载(Deepest Bottom Left with Fill)物资装载策略的基础上,提出了基于遗传算法的三维装箱策略求解算法,2个研究的区别在于后者在前者的基础上,对装载剩余空间进行了更为细致的描述。Ramos等重点考虑了运输行业货物装载时静止时的纵向稳定性和行进时的横向稳定性,并提出了具有较高操作性的稳定性评价指标和基于顺序的货物装载启发式算法。

    尽管三维装箱问题研究的深度和广度在不断延伸,相关研究的模型建立、算法设计和实际应用也取得了众多成果,但是一些现实约束仍难以满足,解决方法也存在较大的局限性。其中,现有求解三维装箱问题较为常用的遗传算法,在交叉算子设计、变异算子设计和进化性能等方面表现不足。

    1 问题描述
    1.1 基本问题描述

    除球体、非规则立方体等形状盒子的装箱特例外,经典的三维装箱问题(见图1)可描述为:用一定数量的长宽高分别为Li,Wi和Hi的箱子(Container),按照一定顺序和装载规则根据不同转向逐个装入一定数量的长、宽、高分别为lj,wj和hj的盒子(Box)中,实现箱子容量的利用率最大、盒子堆放的稳定性最好、装载价值最高或容重比最恰当等其一或多种目标,并满足外形约束、容积约束、稳定性约束、盒子属性相关性约束、载重约束等实际限制。
    在这里插入图片描述
    图1 三维装箱问题示意
    根据文献对三维装箱问题的分类法,该研究以SBSBPP类(Single Bin-Size Bin Packing Problem,有限数量单类型箱体三维装载问题)为研究对象,研究如何在单个规则长方体箱子中装载尽量多的盒子(这些盒子具有相似度较小且分散较大的特点),以最大限度地提高箱子的空间利用率。此研究旨在解决每个盒子应以何种顺序、何种方向放置在具体空间位置的问题,即提供具体的盒子装载方案。此过程需满足如下现实约束。
    1)外形约束。进行装载时,所有盒子的几何顶点不能位于箱子之外,装进箱子的盒子在空间上不能发生重叠。
    2)容积约束。装载盒子的总体积不能超过箱子的容积。
    3)稳定性约束。装载盒子的堆放需满足重心要求,不能出现悬空或重心偏移的情况。
    基本假设:盒子质量均匀分布,其质心位于其几何中心;不考虑盒子总质量超载的问题;盒子装载时应与箱子的边长方向平行(即不斜放)。

    1.2 箱体最大剩余空间描述
    最大剩余空间(Allowable Packing Area,简写为APA)指进行盒子装载前的最大长方体形闲置空间,每个最大剩余空间可用最靠近原点的长方体顶点三维坐标和最远离原点的长方体顶点三维坐标合并表示,全部的最大剩余空间即构成最大剩余空间集(简写为APAs)。盒子的装载是在箱子的最大剩余空间中按照一定规则进行的,最大剩余空间的刻画关系到盒子的放置和空间容纳能力,对于盒子的装载至关重要。该研究采用文献中的I-DBLF算法,完成最大剩余空间的描述。每装入一个箱子,其最大剩余空间将按照盒子的边界和x,y,z轴进行划分和更新。如图2a所示,空置箱子的最大剩余空间只有1个,表示为(0,0,0),(Li,Wi,Hi);在临原点位置装入一个长、宽、高分别为lj,wj和hj的盒子后,最大剩余空间更新为3个(见图2b—d),最大剩余空间集为{((Li-lj,0,0),(Li,Wi,Hi)),((0,0,Hi-hj),(Li,Wi,Hi)),((0,Wi-wj,0),(Li,Wi,Hi))}。最大剩余空间的计算过程较为复杂,因篇幅所限,此处不做赘述,具体可见文献。
    在这里插入图片描述
    图2 剩余空间示意
    2 本案例代码说明
    三维装箱:给定装载的四个约束:长,宽,高,限重,若干待装载货箱的信息:长,宽,高,重量,求满足约束的情况下,最佳的装载方式(或是达到最高载重,或是达到最大装载体积),以货物的装载顺序和在卡车中的位置表示。
    求解思路:先把尺寸统一的货箱打包成合适的尺寸,以降低装载的复杂度。其次,设置策略为每个货箱选择合适的落脚点。最后,对多种装箱方式进行挑选,只对若干优秀的方式继续装填,舍弃劣解。
    主程序 main (展示使用方法)
    主装箱算法 final_zhuangxiang (整体框架)
    对箱子进行分类打包 classification
    对打包后的箱子及没打包的箱子进行装箱 zhuangxiang1

    三、部分源代码

     function [real_PATH,objective,surplus_box]=final_zhuangxiang(PATH,box,truck)
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    %%函数名称:主装箱算法 final_zhuangxiang
    %%入口参数:已装车的货物 PATH(cell格式,5行(左下坐标+信息+名称+名称+旋转方向)多列)  待装箱的货物信息 box(cell格式,第一行为长宽高重,第二行为货物的名称,第三行同第二行,第四行是旋转方向)  货车信息 truck
    %%出口参数:装车的货物 real_PATH(格式同上述PATH) 当前车辆的优化目标 objective(max(v/V,w/W))   未能装车的剩余货物 surplus_box
    %%函数功能说明:
        %%输入已装车的货物,未装车的货物,truck进行装车,步骤如下:
        %%步骤1:打包
        %%步骤2:对打包后的箱子+未打包的箱子进行装车
        %%步骤3:解包
        %%步骤4:评价
    %%注意:
    %%by SebastianLi, At ZhengZhou, 25th February, 2021
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    %% 如果PATH不为空,并以剩余的空间作为约束进行打包,以防止打包过大
    truck1=truck;
    if isempty(PATH)==0
        t=zeros(size(PATH,1),1);
        num_PATH=1;
        angles=[];
        w=0;
        for j=1:size(PATH{num_PATH, 1},1)
            s=eightangle(PATH{num_PATH, 1}{j, 1},PATH{num_PATH, 1}{j, 2});
            angles(end+1:end+8,:)=s;
            w=w+PATH{num_PATH, 1}{j,2}(1,4);
        end
        truck1=[truck(1,1)-max(angles(:,1)),truck(1,2),truck(1,3),truck(1,4)-w];  % 只考虑x方向的剩余空间
    end
    
    %% 对于两种方向的箱子进行打包,取打包后箱子数小的打包方式作为最终打包
    s2={};
    for i=1:size(box,2)  
        s=box{1, i};
        s1=[s(1, 2),s(1, 1),s(1, 3),s(1, 4)];
        s2(1,i)={s1};
        s2(2,i)=box(2, i);
    end
    s2(3,:)=s2(2, :);
    s2(4,:)={0};
    [Allbox1,~,~]=classification(s2,truck1);  % 对全部旋转后的箱子进行分类打包
    Allbox1(4,:)={1};
    
    [Allbox2,~,~]=classification(box,truck1); % 对未旋转的箱子进行分类打包
    Allbox2(4,:)={0};
    if size(Allbox1,2)>=size(Allbox2,2)       %  取打包后箱子数小的打包方式作为最终打包
        Allbox=Allbox2;
        y1=1;
    else
        Allbox=Allbox1;
        y1=0;
    end
    
    %% 对打包后的箱子+未打包的箱子进行装车
    s2={};       % 旋转后的Allbox
    for i=1:size(Allbox,2)  
        s=Allbox{1, i};
        s1=[s(1, 2),s(1, 1),s(1, 3),s(1, 4)];
        s2(1,i)={s1};
        s2(2,i)=Allbox(2, i);
        s2(3,i)=Allbox(3, i);
        s2(4,i)={y1};
        if strcmp(Allbox{2,i}(1:3),'bag')==1
            for j=1:size(s2{3,i},1)
                s2{3,i}{j,1}=[s2{3, i}{j, 1}(1,2),s2{3, i}{j, 1}(1,1),s2{3, i}{j, 1}(1,3)];
                s2{3,i}{j,2}=[s2{3, i}{j, 2}(1,2),s2{3, i}{j, 2}(1,1),s2{3, i}{j, 2}(1,3),s2{3, i}{j, 2}(1,4)];
            end
        end
    end
     Allbox=[Allbox,s2];  % 把旋转前后的箱子都放在一起
    [final_PATH,~,surplus_box]=zhuangxiang1(PATH,Allbox,truck);
    % show(final_PATH)
    %% 把surplus_box中的bag拆分出来
    if isempty(surplus_box)==0
        ss={};
        for i=1:size(surplus_box,2)
            if strcmp(surplus_box{2,i}(1:3),'bag')==0   % 如果不是bag
                if surplus_box{4,i}==0
                    ss(:,end+1)=[surplus_box(1,i);surplus_box(2,i)];
                else
                    ss(:,end+1)=[{[surplus_box{1, i}(1,2),surplus_box{1, i}(1,1),surplus_box{1, i}(1,3),surplus_box{1, i}(1,4)]};surplus_box(2,i)];
                end
            else
                if surplus_box{4,i}==0
                    for j=1:size(surplus_box{3,i},1)
                        ss(:,end+1)=[surplus_box{3,i}(j,2);surplus_box{3,i}(j,3)];
                    end    
                else
                        for j=1:size(surplus_box{3,i},1)
                        ss(:,end+1)=[{[surplus_box{3,i}{j,2}(1,2),surplus_box{3,i}{j,2}(1,1),surplus_box{3,i}{j,2}(1,3),surplus_box{3,i}{j,2}(1,4)]};surplus_box{3,i}(j,3)];
                        end
                        
                end
            end
        end
        surplus_box=ss; 
        surplus_box(3,:)=surplus_box(2,:);
        surplus_box(4,:)={0};
    end
    
    %% 拆分bag
    if isempty(final_PATH)==1  % 如果所有的箱子都不能装车
        real_PATH={};
        objective=0;
    else
        real_PATH={};  % 把bag再拆分成箱子
        for i=1:size(final_PATH{1, 1},1)
            if strcmp(final_PATH{1, 1}{i, 3}(1:3),'bag')==0
                real_PATH(end+1,:)=final_PATH{1, 1}(i,:);
            end
            if strcmp(final_PATH{1, 1}{i, 3}(1:3),'bag')==1
                    s=final_PATH{1, 1}{i, 4};
                    for j=1:size(final_PATH{1, 1}{i, 4},1)
                        s{j,1}=final_PATH{1, 1}{i, 4}{j, 1}+final_PATH{1, 1}{i, 1};
                        s{j,4}=s{j,3};
                        s{j,5}=0;
                    end
                    real_PATH(end+1:end+size(s,1),:)=s;
            end
        end  
    %% 评估货车的装载情况
        v=0;
        w=0;
        for i=1:size(real_PATH,1)
            v=v+real_PATH{i, 2}(1,1)*real_PATH{i, 2}(1,2)*real_PATH{i, 2}(1,3);
            w=w+real_PATH{i, 2}(1,4);
        end
    
        V=truck(1,1)*truck(1,2)*truck(1,3);
        W=truck(1,4);
    objective=max(v/V,w/W);
    end
    
     
    

    四、运行结果

    在这里插入图片描述

    五、matlab版本及参考文献

    1 matlab版本
    2014a

    2 参考文献
    [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
    [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
    [3]周品.MATLAB 神经网络设计与应用[M].清华大学出版社,2013.
    [4]陈明.MATLAB神经网络原理与实例精解[M].清华大学出版社,2013.
    [5]方清城.MATLAB R2016a神经网络设计与应用28个案例分析[M].清华大学出版社,2018.

    展开全文
  • 但这种模拟不能真正的解决实际问题。 实际上 ,我们在装载的计算过程中,并不是所有的情况都是毫无规则的,在不同的情况使用不同的装载方法,能使装载效率更高且更规整。 基于这种思路,接下来结合 贪婪算法 和 ...
  • 编程语言:Java 特点:具有可视化人机交互界面 有疑问的话,欢迎提问!
  • 基于matlab求解三维装箱优化问题 二、源代码 close all; clear; clc; %% set data Dbox = [10, 10, 10]; Dobj = [1, 1.5, 1; 1, 1.5, 1]; PobjI = [7, 5, 5, 0, 0, 0; 3, 5, 5, 0, 0, 0]; PobjD = [3, 3, -3, 0...
  • ax.plot3D([x+dx, x+dx], [y, y], [z, z+dz], **kwargs) return ax #显示图形的函数:Items = [[num[0],num[1],num[2],num[3],num[4],num[5],num[6]],] #Items是N个列表的列表,里面的每个列表数据[放置点O三维坐标...
  • 这里是只给出后面用python实现三维装箱可视化的代码。 基本思路 使用python中的matplotlib库中的Axe3D方法实现多个箱子的堆叠。 代码 以下是 代码. // An highlighted block # -*- coding: utf-8 -*- # @Author: ...
  • 基于 三维装箱问题的算法研究-1 的基础上 对整个装箱过程发生的函数进行封装 # -*- coding: utf-8 -*- from matplotlib import pyplot as plt #设置图表刻度等格式 from matplotlib.ticker import MultipleLocator, ...
  • 三维装箱模型

    千次阅读 多人点赞 2021-05-06 18:18:51
    设要求把n种数量有限的货物装入m种类型的集装器中各类型集装器若干,集装器的最大载重量和容积分别位M、V,第i种货物的数量、三维尺寸和重量分别为nin_{i}ni​、li×wi×hil_{i} \times w_{i} \times h_{i}li​×wi...
  • 完整代码,可直接运行
  • 三维装箱Python

    千次阅读 2020-03-21 09:43:14
    找到了一个Python三维装箱代码,可是安装pyscipopt时显示没有model模块,也安装不了functools怎么办啊
  • 代码效率太低,货品一多会导致内存溢出.求优化或给出更好的解决方案 ``` package com.example.demo.box; import java.util.*; public class GoodsInBox { /*箱子的型号,盛放空间*/ private Map,Map,...
  • 在考虑一些实际应用中的约束条件下,提出了一种三维集装箱装载的改进遗传算法。算法中考虑了货物放置方向、装载容积等约束条件,给出了有效的解码算法。实例仿真结果说明该算法的有效性和实用性,可以直接在实际中应用...
  • 维装箱问题

    2021-02-17 17:08:47
    Bin Packing Problem 一、 问题描述 二、 算法介绍及实现 注:(1)以下的文字表达中,桶 == 箱子, 空间 == 容量; (2)每个算法对应的程序默认读取所有测试文件并计算结果与耗时;...代码实现: //算法一 #in
  • 使用 R 语言求解三维装箱问题

    千次阅读 2019-01-29 13:57:10
    文章目录搭建 R 语言环境下载指定的 R 语言包检验是否成功安装 R指定 R 包的镜像源安装`devtools`安装其他本项目需要依赖的源运行代码示意 搭建 R 语言环境 您可以从 R-3.2.2 for Windows(32/64位)下载R的Windows...
  • 箱体积利用率最大化为目标建立三维装载模型,同时考虑体积约束、重量约束、重心约束、方向约束。利用混合遗 传、模拟退火与三空间分割启发式装载算法求解模型,算法中融入局部最优解保存策略来避免局部较好解在后续...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,015
精华内容 1,606
关键字:

三维装箱问题代码