精华内容
下载资源
问答
  • 三维装箱问题MATLAB代码,注释比较少,需要学习的可以下载。
  • 装箱问题遗传算法MATLAB实现.doc,这份文档介绍了装箱问题遗传算法MATLAB实现,装箱问题遗传算法MATLAB实现.doc
  • 装箱问题matlab代码替代CMA-ES 代理CMA-ES(S-CMA-ES)是基于代理的优化演进策略。 它基于N. Hansen的CMA-ES算法,该算法与高斯过程或随机森林互连。 日志和新闻 2017/03/22:Metacentrum界面迁移到较新的版本,默认...
  • 【三维装箱】基于粒子群算法求解三维装箱问题matlab源码.md
  • 完整代码,可直接运行
  • 装箱问题matlab代码s README,Jaewook Kang演示了具有一维有限差分稀疏性的压缩传感(CS)恢复 描述: 本演示包含使用一维有限差分执行CS恢复的方法 该比较中包括的求解器如下所示: -ssAMP-BGFD : Jaewook Kang, ...
  • 装箱问题遗传算法MATLAB实现.docx,这份稳定介绍了装箱问题遗传算法的简单实现例子,可以作为参考学习
  • 装箱问题matlab代码 p2d_pemfc PEM燃料电池的两个伪2D纽曼型模型。 目标 该模型模拟质子交换膜燃料电池(PEMFC)的阴极。 尽管这些类型的燃料电池已经投入生产,但是昂贵的Pt催化剂阻碍了它们的生长和制造。 大量...
  • 装箱问题matlab代码解决方案 为解决实际和想象中的问题而开发的Python脚本和Jupyter笔记本的集合。作为一名工程师,我喜欢为各种问题找到解决方案。 我也有一个分析方面,这使我寻求对问题的更好理解或找到最佳解决...
  • 装箱问题matlab.pdf

    2021-10-13 16:13:17
    装箱问题matlab.pdf
  • 装箱问题matlab代码椭球包装 解决Matlab中不等长椭球紧密堆积的问题。 在运行代码之前,应将椭圆工具箱(ET)添加到Matlab。 去下载工具箱并安装它。 使用Lubachevsky-Stillinger算法(LSA),将椭圆体包装在给定的...
  • 针对约束条件下三维装箱问题复杂性,为提高装箱利用率,本文提出 了混合粒子群算法,该算法采用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.

    展开全文
  • 装箱问题matlab代码mrphysics_code 下面的循环包装代码是为我从事的一个辅助项目开发的。 它使用Matlab的形态运算imdilate对均匀或不均匀大小的一组圆执行随机密堆积。 要运行代码,用户输入两个项目:要打包的一组...
  • 【三维装箱】基于粒子群算法求解三维装箱问题matlab源码.zip
  • 装箱问题matlab代码混合放大器 README,演示Jaewook Kang通过MixAMP和TFOCS进行的2D稀疏信号分离() 描述: 该演示包含通过MixAMP迭代和TFOCS方法执行2D稀疏信号分离的方法。 该比较中包括的求解器如下所示: “ ...
  • 装箱问题matlab代码多层板 用于多类别分类的度量学习指导的最小二乘分类器============================ MLG-LSC Matlab代码======= ===================== 该软件包包含以下论文的源代码: Chuanxing Geng and ...
  • 【优化求解】基于遗传和模拟退火的三维装箱问题matlab.md
  • 【三维装箱】基于遗传和模拟退火的三维装箱问题matlab源码.zip
  • 【三维装箱】基于遗传和模拟退火的三维装箱问题matlab源码.md
  • 三维装箱MATLAB程序.m

    2019-11-04 13:17:21
    三维装箱MATLAB程序.m,目前求解方法主要是近似算法。
  • 装箱问题matlab代码ZJU-论文-容器-装载 此库包含我2016年在浙江大学的学士论文的主要部分。它处理3D容器包装问题,并将此问题成功转换为2D版本。 然后应用贪心算法以获得最佳解。 内容 使用Matlab实现仿真,并使用...
  • 集装箱装载是货物运输过程中重要的一步,其属于NP-hard问题。为了提高效率,降低成本,提出了以集装 箱体积利用率最大化为目标建立三维装载模型,同时考虑体积约束、重量约束、重心约束、方向约束。利用混合遗 传...

    1 简介

    集装箱装载是货物运输过程中重要的一步,其属于NP-hard问题。为了提高效率,降低成本,提出了以集装

    箱体积利用率最大化为目标建立三维装载模型,同时考虑体积约束、重量约束、重心约束、方向约束。利用混合遗

    传、模拟退火与三空间分割启发式装载算法求解模型,算法中融入局部最优解保存策略来避免局部较好解在后续的

    算法过程中出现适应度降低的情况。通过强异类算例与弱异类算例对算法进行性能测试,并结合具体的货物装载

    数据,得出三维装载图与目标函数值。结果表明,该算法应用于集装箱装载有着较好的效果。

    1.1 三维装箱问题的数学模型

    1.2 模拟退火算法

    2 部分代码

    clc
    clear all
    global box; global cargo; global lambda; global num_cargo;global num_box;global solution;
    
    %-------------------------------控制参数---------------------------
    
    lambda = 0.5;       % 重量利用率权重
    
    T0 = 100;           % 初始温度
    T_End = 1;          % 终止温度
    metropolis = 100;   % 退火算法中 metropolis链长度
    cooling = 0.98;     % 降温系数
    
    pop = 20;           %遗传算法染色体数
    maxite = 100;       %遗传最大迭代次数
    pm = 0.1;           %遗传变异概率
    %--------------------------------------------------------------------
    
    %----------------------------初始化:读取货箱信息 ----------------------------
    orginal_cargo=load('cargo');box=load('box');
    count=1;
    for i=1:size(orginal_cargo,1)           %重构货物格式 cargo: 重 长 宽 高 体积 ;其中 长>宽>高
       for j=1:orginal_cargo(i,2)
           cargo(count,1:4) = orginal_cargo(i,3:6);
           cargo(count,5) = prod(cargo(count,2:4),2); 
           cargo(count,2:4) = sort(cargo(count,2:4),'descend');
           count=count+1;
       end
    end         
    for i=1:size(box,1)                          %重构箱子box: 重 长 宽 高 体积
       box(i,5)=prod(box(i,2:4),2);            
    end
    
    num_cargo=size(cargo,1);  % 货物数
    num_box=size(box,1);      % 货箱数
    
    solution= fix((num_box)*rand(1,num_cargo))+1;   %随机生成初始解
    Scheme=transform(solution);                     %解转化成“货箱:货物”对应的形式
    [feas_solution,Scheme]= placement(Scheme);             %装箱处理
    [PG,PV,gbest ]= evaluate(feas_solution) ;      %计算适应度
    
    %--------------------------------------------------------------------
    
    %----------------------------退火------------------------
    begin=cputime;   %开始计时
    
    %遗传算法优化     GENE(染色体数/种群规模,最大迭代次数,染色体长度/维度,变异概率)
    [final_solution,gbest]=GENE(pop,maxite,num_cargo,pm) ;  
    
    %遗传执行完毕后 模拟退火进一步优化
    T = T0;
    while T > T_End
       for i=1:metropolis
           %-----------随机交换两件货物生成新解
           newsolution=final_solution;
           R1=fix(rand*num_cargo)+1;
           R2=fix(rand*num_cargo)+1;
           inter=newsolution(R1);
           newsolution(R1)=newsolution(R2);
           newsolution(R2)=inter;
           NewScheme=transform(newsolution);                   % 分配货箱
          [feas_solution,NewScheme]= placement(NewScheme);              % 装箱处理
          [NPG,NPV,pbest ]= evaluate(feas_solution);            % 评估新方案
           if pbest>gbest
               gbest = pbest;
               final_solution = newsolution;
               PG = NPG;
               PV = NPV;
               Scheme = NewScheme;
           else
               if  rand < exp( (pbest-gbest)*100*T0/T)
                   gbest=pbest;
                   final_solution=newsolution;
                   PG = NPG;
                   PV = NPV;
                   Scheme = NewScheme;
               end
           end   
       end
       T = T * cooling;
    end
    
    timecost = cputime-begin;   %计时结束
    
    
    %----------------------------输出结果------------------------
    result(Scheme,15);      %将装箱方案Scheme 按每行15个货物显示
    
    fprintf('重量利用率:\t%5.3f %%\n',PG*100);
    fprintf('空间利用率:\t%5.3f %%\n',PV*100);
    fprintf('综合利用率:\t%5.3f %%\n',gbest*100);
    fprintf('计算时间:\t\t%5.4f s\n',timecost);
    disp('图像生成中...')
    depict( Scheme, 1,'c' )   %   ( 方案,画出编号为i箱子,颜色) 颜色:r\g\b\c\m\y\k\w
    
    

    3 仿真结果

    4 参考文献

    [1]张德富, 彭煜, 朱文兴,等. 求解三维装箱问题的混合模拟退火算法[J]. 计算机学报, 2009, 032(011):2147-2156.

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

    一、获取代码方式

    获取代码方式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.

    展开全文
  • 求解三维装箱问题的启发式算法,利用Matlab语言进行实现,包含所有m函数名文件
  • 基于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...

    一、获取代码方式

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

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

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

    备注:开通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 剩余空间示意

    三、部分源代码

    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, 0, 0;
             8, 8, 13, 0, 0, 0];
    
    objN = size(Dobj, 1);
    Rcost = 10;
    
    
    
    %% shape & bounding box & start point
    
    
    
    [x, f] = genFunction(Rcost, PobjD);
    
    Ar = [1 0 0; -1 0 0; 0 1 0; 0 -1 0; 0 0 1; 0 0 -1];
    syms vx vy vz;
    Vcoor = [vx; vy; vz];
    for i=1:objN
        br = [Dobj(i,1); Dobj(i,1); Dobj(i,2); Dobj(i,2); Dobj(i,3); Dobj(i,3)];
        Gc{i} = Ar * Vcoor - br;
    end
    
    G = zeros(0);
    for i=1:objN
        G = [G; genGi(i, Dbox, Dobj, x)];
    end
    
    %%
    tic;
    [X0,~] = zoutendijk1(f, x, G, Gc, Dbox, Dobj, PobjI, PobjD);
    toc
    figure;
    plotResult(X0, Dbox, Dobj, PobjI, PobjD);
    
     
    
    
    
    
    
    
    
    
    
    
    
    
    function [ f ] = genCollision( Gc, X, x0, Dobj, o1, o2 )
    
    syms vx vy vz;
    x = [vx vy vz];
    
    Gc1 = Gc{o1};
    Gc2 = Gc{o2};
    a1 = Dobj(o1,1);
    b1 = Dobj(o1,2);
    c1 = Dobj(o1,3);
    a2 = Dobj(o2,1);
    b2 = Dobj(o2,2);
    c2 = Dobj(o2,3);
    
    R1V = [a1 b1 c1; -a1 -b1 c1; -a1 b1 c1; a1 -b1 c1;
           a1 b1 -c1; -a1 -b1 -c1; -a1 b1 -c1; a1 -b1 -c1];
     
    R2V = [a2 b2 c2; -a2 -b2 c2; -a2 b2 c2; a2 -b2 c2;
           a2 b2 -c2; -a2 -b2 -c2; -a2 b2 -c2; a2 -b2 -c2];
     
    % R1V(1,:) = [-a1, -b1];
    % R1V(2,:) = [a1, b1];
    % R1V(3,:) = [-a1, b1];
    % R1V(4,:) = [a1, -b1];
    % 
    % R2V(1,:) = [-a2, -b2];
    % R2V(2,:) = [a2, b2];
    % R2V(3,:) = [-a2, b2];
    % R2V(4,:) = [a2, -b2];
    
    newR1V = R1V;
    newR2V = R2V;
    for i=1:size(R1V,1)
        newR1V(i,:) = rt(R1V(i,:), transpose(x0(6*(o1-1)+1:6*(o1-1)+3)), transpose(x0(6*(o2-1)+1:6*(o2-1)+3)), x0(6*(o1-1)+4:6*(o1-1)+6), x0(6*(o2-1)+4:6*(o2-1)+6));
        newR2V(i,:) = rt(R2V(i,:), transpose(x0(6*(o2-1)+1:6*(o2-1)+3)), transpose(x0(6*(o1-1)+1:6*(o1-1)+3)), x0(6*(o2-1)+4:6*(o2-1)+6), x0(6*(o1-1)+4:6*(o1-1)+6));
    end
    
    temp = zeros(size(newR2V,1),3);
    minEdged = zeros(0,3);
    for i=1:size(Gc1,1)
        for j=1:size(newR2V,1)
            temp(j,:) = [subs(Gc1(i), x, newR2V(j,:)), i, j];
        end
        [~, vec] = sort(temp);
        temp1 = temp(vec(:,1),:);
        for k=1:size(newR2V,1)
            if abs(temp1(k,1)-temp1(k+1,1)) < 0.1
                continue
            else
                break
            end
        end
        minEdged = [minEdged; temp1(1:k,:)];
    end
    [~, vec] = sort(minEdged, 'descend');
    temp1 = minEdged(vec(:,1),:);
    for k=1:size(temp1,1)
        if abs(temp1(k,1)-temp1(k+1,1)) < 0.1
            continue
        else
            break
        end
    end
    maxEdged1 = temp1(1:k,:);
    
    minEdged = zeros(0,3);        % value % edge num % v num
    for i=1:size(Gc1,1)
        for j=1:size(newR2V,1)
            temp(j,:) = [subs(Gc2(i), x, newR1V(j,:)), i, j];
        end
        [~, vec] = sort(temp);
        temp1 = temp(vec(:,1),:);
        for k=1:size(temp1,1)
            if abs(temp1(k,1)-temp1(k+1,1)) < 0.1
                continue
            else
                break
            end
        end
        minEdged = [minEdged; temp1(1:k,:)];   
    end       
    [~, vec] = sort(minEdged, 'descend');
    temp1 = minEdged(vec(:,1),:);
    for k=1:size(temp1,1)
        if abs(temp1(k,1)-temp1(k+1,1)) < 0.1
            continue
        else
            break
        end
    end
    maxEdged2 = temp1(1:k,:);
          
    
    f = zeros(0,0);
    if abs(maxEdged1(1,1)-maxEdged2(1,1)) < 0.1
        for i=1:size(maxEdged1,1)
            f = [f; -subs(Gc1(maxEdged1(i,2)), x, rt(R2V(maxEdged1(i,3),:), X(6*(o2-1)+1:6*(o2-1)+3), X(6*(o1-1)+1:6*(o1-1)+3), X(6*(o2-1)+4:6*(o2-1)+6), X(6*(o1-1)+4:6*(o1-1)+6)))];
        end
        for i=1:size(maxEdged2,1)
            f = [f; -subs(Gc2(maxEdged2(i,2)), x, rt(R1V(maxEdged2(i,3),:), X(6*(o1-1)+1:6*(o1-1)+3), X(6*(o2-1)+1:6*(o2-1)+3), X(6*(o1-1)+4:6*(o1-1)+6), X(6*(o2-1)+4:6*(o2-1)+6)))];
        end
    elseif (maxEdged1(1,1) < maxEdged2(1,1))
        for i=1:size(maxEdged2,1)
            f = [f; -subs(Gc2(maxEdged2(i,2)), x, rt(R1V(maxEdged2(i,3),:), X(6*(o1-1)+1:6*(o1-1)+3), X(6*(o2-1)+1:6*(o2-1)+3), X(6*(o1-1)+4:6*(o1-1)+6), X(6*(o2-1)+4:6*(o2-1)+6)))];
        end
    else
        for i=1:size(maxEdged1,1)
            f = [f; -subs(Gc1(maxEdged1(i,2)), x, rt(R2V(maxEdged1(i,3),:), X(6*(o2-1)+1:6*(o2-1)+3), X(6*(o1-1)+1:6*(o1-1)+3), X(6*(o2-1)+4:6*(o2-1)+6), X(6*(o1-1)+4:6*(o1-1)+6)))];
        end
    end
    
    return
    
    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.

    展开全文
  • 一维装箱问题的解决

    2015-03-04 13:58:39
    利用遗传算法解决一维装箱问题,并利用matlab实现
  • matlab装箱_matlab_matlab装箱问题_装箱_五一建模_源码.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 407
精华内容 162
关键字:

装箱问题matlab

matlab 订阅