基于模拟退火优化算法的三维装箱优化matlab仿真,优化重量利用率和空间利用率

发布时间 2023-05-31 22:09:12作者: 我爱C编程

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

 

 

 

2.算法涉及理论知识概要

      模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。

       模拟退火算法(Simulated AnnealingSA)最早的思想是由N. Metropolis [1]  等人于1953年提出。1983 ,S. Kirkpatrick 等成功地将退火思想引入到组合优化领域。它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI、生产调度、控制工程、机器学习、神经网络、信号处理等领域。

 

 

 

 

 

       甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系统进展的内在关系随着时间进展的情况。以提出者亨利·劳伦斯·甘特(Henry Laurence Gantt)先生的名字命名。

       甘特图以图示通过活动列表和时间刻度表示出特定项目的顺序与持续时间。一条线条图,横轴表示时间,纵轴表示项目,线条表示期间计划和实际完成情况。直观表明计划何时进行,进展与要求的对比。便于管理者弄清项目的剩余任务,评估工作进度。

甘特图是以作业排序为目的,将活动与时间联系起来的最早尝试的工具之一,帮助企业描述工作中心、超时工作等资源的使用。

甘特图包含以下三个含义:

1、以图形或表格的形式显示活动;

2、通用的显示进度的方法;

3、构造时含日历天和持续时间,不将周末节假算在进度内。

简单、醒目、便于编制,在管理中广泛应用。

甘特图按内容不同,分为计划图表、负荷图表、机器闲置图表、人员闲置图表和进度表五种形式。

 

3.MATLAB核心程序

 

%重构箱子box: 重 长 宽 高 体积
for i=1:size(box,1)                          
    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; 
[final_solution,gbest] = GENE(pop,maxite,num_cargo,pm) ;  
 
%模拟退火进一步优化
T = T0;
Ra = [];
Rb = [];
Rc = [];
while T > T_End
    T
    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;
    Ra = [Ra,gbest];
    Rb = [Rb,PG];
    Rc = [Rc,PV];
end
 
t1=smooth(Ra,32);
t2=smooth(Rb,32);
t3=smooth(Rc,32);
figure;
plot(1:10:length(Ra),t1(1:10:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
legend('重量利用率');
figure;
plot(1:10:length(Rb),t2(1:10:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
legend('空间利用率');
figure;
plot(1:10:length(Rc),t3(1:10:end),'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
legend('综合利用率');