基于模拟退火算法的车间调度优化matlab仿真,输出甘特图

125 阅读4分钟

1.算法仿真效果

matlab2022a仿真结果如下:

 

 

3bf8865c14e1a8d3ddb5af4515b2bfb5_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

78aed8bd8de20a83daa94c0268e189b9_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png  

 优化目标: 最小平均流动时间

粒子数:100   循环代数:500

变异率:0.35   变异变换对数:3

模拟退火初始值:1000  模拟退火终值:0

最小平均流动时间:43   最大完工时间:61   最小间隙时间:60

最优粒子3  1  3  6  4  5  3  2  5  5  4  1  6  2  2  1  4  1  3  6  5  6  6  2  4  5  5  3  2  4  1  6  2  4  1  3

 

 

 

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

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

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

 

c4fcc75df209c29c421d680ef6247dc4_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

 

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

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

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

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

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

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

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

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

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

 

 

3.MATLAB核心程序 `restrictmatrixM=[3     1     2     4     6     5

                 2     3     5     6     1     4

                 3     4     6     1     2     5

                 2     1     3     4     5     6

                 3     2     5     6     1     4

                 2     4     6     1     5     3];%job-shop机器约束矩阵;

             

restrictmatrixT=[1     3     6    7      3     6

                 8     5     10   10     10    4

                 5     4     8     9     1     7

                 5     5     5     3     8     9

                 9     3     5     4     3     1

                 3     3     9     10    4     1];%job-shop时间约束矩阵;

             

%===============PSO算法==========================

swarminit=cell(1,swarminitNum);

swarminitLong=sum(MM(2,:));          %所有工序数即粒子长度;

for i=1:swarminitNum,

    swarminit{i}=randomparticle(MM) ;

end                                  %随机生成初始粒子群体

[popu,s] = size(swarminit);

trace = ones(1,gen);

trace(1) = 10000; % 初始全局最佳适应度设为足够大

for i = 1:s,

    bestfit(i) = 10000; % 初始个体历史最佳适应度设为足够大

end

bestpar = swarminit; % 个体历史最佳粒子初始化

for u=1:swarminitNum,

    fitlist=[0];

end

T=initT;

for step = 1:gen,

    step

    for q=1:swarminitNum,

            fitlist(q)=timedecode(swarminit{q},restrictmatrixM,restrictmatrixT,machineNum)  ;     

    end              % 计算当前粒子群每个粒子的适应度

    [minval,sub] = min(fitlist); % 求得这代粒子的适应度最小值及其下标

    if(trace(step) > minval)  ,

         trace(step) = minval;

         bestparticle = swarminit{sub};

    end

    if(step~= gen) ,

        trace(step + 1) = trace(step); % 全局最佳适应度及最佳粒子调整

    end

    T=0.97*T;

    for i = 1:s,

        tt=fitlist(i)-bestfit(i);

        if(tt<0)|(min(1,exp(-tt/T))>=rand(1,1));

           bestfit(i) = fitlist(i);

           bestpar{i} = swarminit{i};

       end

   end % 个体历史最佳粒子及适应度调整 ;

   for j = 1:s,

       if rand(1,1)<w1,

          bestparticle1=bianyi(bestparticle,changeNum,swarminitLong);

       else

           bestparticle1=bestparticle;

       end               %粒子变异;

       l1=1000;

       l2=1;

       l3=1000;

       l4=1;

       while (l1-l2)>swarminitLong,

           m=fix(swarminitLong*rand(1,1));

           n=fix(swarminitLong*rand(1,1));

           l1=max(m,n)+1;

           l2=min(m,n)+1;

       end

       while (l3-l4)>swarminitLong,

           m1=fix(swarminitLong*rand(1,1));

           n1=fix(swarminitLong*rand(1,1));

           l3=max(m1,n1)+1;

           l4=min(m1,n1)+1;

       end

       swarminit{j}=cross(bestpar{j},swarminit{j},l2,l1);

       swarminit{j}=cross(bestparticle1,swarminit{j},l4,l3);%粒子交叉;

   end

 

 

error(step)=min(fitlist);

 

end

gant(bestparticle,swarminitLong,restrictmatrixM,restrictmatrixT,b)

figure;

plot(error);`