【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

简介: 【车间调度】基于卷积神经网络的柔性作业车间调度问题的两阶段算法(Matlab代码实现)

💥1 概述

该文提出一种基于卷积神经网络的有效两阶段算法,以求解具有机器故障的柔性作业车间调度问题(FJSP)。建立了以最大完成时间和鲁棒性为目标的双目标动态柔性作业车间调度问题(DFJSP)模型。提出了CNN构建的预测模型,并开发了一个名为RMn的替代指标来评估鲁棒性。实验结果表明,所提两阶段算法对求解DFJSP有效,RMn能够更快、更高效、更准确地评估调度的鲁棒性。

📚2 运行结果

部分代码:

function     [makespan1,RMn]=caltimen(S,pop)
Jm=pop.Jm;
T=pop.T;
PNumber=pop.PNumber;
MPNumber=pop.MPNumber;
JmNumber=pop.JmNumber;
WNumber=pop.WNumber;
Number=pop.Number;
Number_s = cumsum(Number);
NINDA=1;       
NINDB=0;        
%%
S1=S(1,1:WNumber); 
MU=zeros(PNumber,MPNumber);
PJT=zeros(PNumber,MPNumber);
s=1;
for i=1:PNumber      
    val=Number(i);
    for j=1:val      
        M=S1(1,s);
        s=s+1;
        Temp1=Jm{i,j};
        m=Temp1(M);   
        MU(i,j)=m;
        Temp2=T{i,j};
        t=Temp2(M);   
        PJT(i,j)=t;
    end
end
%%
S2=S(1,(1+WNumber):2*WNumber);
temp=zeros(1,PNumber);     
P=zeros(1,WNumber);    
for i=1:WNumber
    temp(S2(i))=temp(S2(i))+1;
    P(i)=S2(i)*100+temp(S2(i));      
end
%% 
TM=zeros(1,JmNumber);          
TP=zeros(1,PNumber);          
PVal=zeros(2,WNumber);       
t1=zeros(JmNumber,WNumber);    
t2=zeros(JmNumber,WNumber);   
TSE=zeros(5*JmNumber,WNumber);     
MPN=zeros(1,JmNumber);     
%% 
for ii=1:WNumber
    if ii==1
        PNval=P(1,ii);
        a=(mod(PNval,100));     
        b=((PNval-a)/100);      
        m=MU(b,a);
        t=PJT(b,a);
        TMval=TM(1,m);    
        TPval=TP(1,b);       
        if TMval>TPval
            val=TMval;
        else
            val=TPval;
        end
        PVal(1,ii)=val;         
        PVal(2,ii)=val+t;    
        TM(1,m)=PVal(2,ii);  
        TP(1,b)=PVal(2,ii);   
        MPN(1,m)=MPN(1,m)+1;  
        t1(m,ii)=TM(1,m)-t;   
        t2(m,ii)=TM(1,m);     
        TSE(5*m-4,1)=PNval;         
        TSE(5*m-3,1)=PVal(1,1);      
        TSE(5*m-2,1)=PVal(2,1);      
        TSE(5*m-1,1)=0;              
        TSE(5*m-0,1)=PVal(1,1);     
    else
        PNval=P(1,ii);
        a=(mod(PNval,100)); 
        b=((PNval-a)/100);  
        m=MU(b,a);
        t=PJT(b,a);
        TMval=TM(1,m);      
        TPval=TP(1,b);       
        TSEok=0;
        %% 
        for w=1:MPN(1,m)
            TSval=TSE(5*m-1,w);   
            TEval=TSE(5*m,w);     
            SJM=max(TSval,TPval);
            if (SJM+t<=TEval)
                TSEok=1;
                if TSval<=TPval
                    PVal(1,ii)=TPval;                 
                    PVal(2,ii)=TPval+t;               
                    t1(m,ii)=PVal(2,ii)-t;        
                    t2(m,ii)=PVal(2,ii);          
                    TP(1,b)=PVal(2,ii);        
                    MPN(1,m)=MPN(1,m)+1;       
                    TSE(5*m-4:5*m,w+1:WNumber)=TSE(5*m-4:5*m,w:WNumber-1);
                    TSE(5*m-4,w)=PNval;                  
                    TSE(5*m-3,w)=PVal(1,ii);             
                    TSE(5*m-2,w)=PVal(2,ii);             
                    if w-1==0
                        TSE(5*m-1,w)=0;
                    else
                        TSE(5*m-1,w)=TSE(5*m-2,w-1);         
                    end
                    TSE(5*m,w)=PVal(1,ii);               
                    TSE(5*m-1,w+1)=PVal(2,ii);          
                else
                    PVal(1,ii)=TSval;                 
                    PVal(2,ii)=TSval+t;               
                    t1(m,ii)=PVal(2,ii)-t;        
                    t2(m,ii)=PVal(2,ii);          
                    TP(1,b)=PVal(2,ii);       
                    MPN(1,m)=MPN(1,m)+1;       
                    TSE(5*m-4:5*m,w+1:WNumber)=TSE(5*m-4:5*m,w:WNumber-1);
                    TSE(5*m-4,w)=PNval;                  
                    TSE(5*m-3,w)=PVal(1,ii);             
                    TSE(5*m-2,w)=PVal(2,ii);             
                    if w-1==0
                        TSE(5*m-1,w)=0;
                    else
                        TSE(5*m-1,w)=TSE(5*m-2,w-1);          
                    end
                    TSE(5*m,w)=PVal(1,ii);               
                    TSE(5*m-1,w+1)=PVal(2,ii);          
                end
            end
            if TSEok==1
                break
            end
        end
        if  TSEok~=1
            if TMval<=TPval
                PVal(1,ii)=TPval;                 
                PVal(2,ii)=TPval+t;                
                TM(1,m)=PVal(2,ii);        
                TP(1,b)=PVal(2,ii);        
                MPN(1,m)=MPN(1,m)+1;      
                t1(m,ii)=TM(1,m)-t;        
                t2(m,ii)=TM(1,m);          
                TSE(5*m-4,MPN(1,m))=PNval;                  
                TSE(5*m-3,MPN(1,m))=PVal(1,ii);             
                TSE(5*m-2,MPN(1,m))=PVal(2,ii);            
                if MPN(1,m)==1
                    TSE(5*m-1,MPN(1,m))=0;
                else
                    TSE(5*m-1,MPN(1,m))=TSE(5*m-2,MPN(1,m)-1);  
                end
                TSE(5*m,MPN(1,m))=PVal(1,ii);               
            else
                PVal(1,ii)=TMval;                  
                PVal(2,ii)=TMval+t;               
                TM(1,m)=PVal(2,ii);
                TP(1,b)=PVal(2,ii);
                MPN(1,m)=MPN(1,m)+1;  
                t1(m,ii)=TM(1,m)-t;     
                t2(m,ii)=TM(1,m);         
                TSE(5*m-4,MPN(1,m))=PNval;                 
                TSE(5*m-3,MPN(1,m))=PVal(1,ii);             
                TSE(5*m-2,MPN(1,m))=PVal(2,ii);             
                if MPN(1,m)==1
                    TSE(5*m-1,MPN(1,m))=0;
                else
                    TSE(5*m-1,MPN(1,m))=TSE(5*m-2,MPN(1,m)-1);  
                end
                TSE(5*m,MPN(1,m))=PVal(1,ii);              
            end
        end
    end
end
makespan1=max(max(PVal));
%% float time ftc
TSE_1 = zeros(3*JmNumber,WNumber);
TSE_2 = zeros(4,WNumber);       
kongxitime1=zeros(2,WNumber);  
Tlates = zeros(2,WNumber);          
ftc = zeros(2,WNumber);          
Avecft = zeros(2,WNumber);     
T = PVal(2,:)-PVal(1,:);
earlytime = [P;PVal(1,:);T];
earlytime = sortrows(earlytime')'; 
b1 = zeros(1,JmNumber);
for i = 1:JmNumber
    TSE1 = TSE(5*i-4,:);
    a1 = find(TSE1==0);
    b1(i) = a1(1)-1;
end
for k = 1:JmNumber
    for w = 1:b1(k)-1
        TSE_1(3*k-2,w)=TSE(5*k-4,w);
        TSE_1(3*k-1,w)=TSE(5*k-1,w+1);
        TSE_1(3*k,w)=TSE(5*k,w+1);
        TSE_1(3*k-2,b1(k))=TSE(5*k-4,b1(k));
        TSE_1(3*k-1,b1(k))=TSE(5*k-2,b1(k));
        TSE_1(3*k,b1(k))=makespan1;
    end
end
b1_S = cumsum(b1);
b1_S = [0,b1_S];
for j = 1:JmNumber
    TSE_2(1,b1_S(j)+1:b1_S(j+1)) = TSE_1(3*j-2,1:b1(j));
    TSE_2(2,b1_S(j)+1:b1_S(j+1)) = TSE_1(3*j-1,1:b1(j));
    TSE_2(3,b1_S(j)+1:b1_S(j+1)) = TSE_1(3*j,1:b1(j));
end
TSE_2 = sortrows(TSE_2')';
TSE_2(4,:) = TSE_2(3,:)-TSE_2(2,:);
Tlates(1,:) = TSE_2(1,:);
for n=1:WNumber
    if TSE_2(4,n)==0
        Tlates(2,n) = earlytime(2,n);
    else
        if ismember(n,Number_s)==1    
            kongxitime1(1,n) = TSE_2(1,n);
            kongxitime1(2,n) = TSE_2(4,n);
        else
            if TSE_2(3,n)<= earlytime(2,n+1)
                Tlates(2,n) = TSE_2(3,n)-earlytime(3,n);
            else
                Tlates(2,n) = earlytime(2,n+1)-earlytime(3,n);
            end
        end
    end
end
ftc(1,:) = Tlates(1,:);
ftc(2,:) = Tlates(2,:)-earlytime(2,:);
col=find(kongxitime1(1,:)~=0);
for m=1:length(col)
    ftc(1,col(m)) = kongxitime1(1,col(m));
    ftc(2,col(m)) = kongxitime1(2,col(m));
end
Avecft(1,:) = ftc(1,:);
xulie=find(ftc(2,:)~=0);
for r=1:length(xulie)
    Avecft(2,xulie(r)) = TSE_2(2,xulie(r))+ftc(2,xulie(r))/2;
end
%% 
Wc = reshape(PJT',1,pop.PNumber*pop.MPNumber);        
Wc(find(Wc==0))=[];
Wtot = sum(Wc);
ejc1 = Wc./Wtot.*ftc(2,:);         
%% Simulate machine breakdown
Tbusy = sum(PJT');
Pbk=Tbusy/Wtot;                
jiqi_0=find(Pbk==max(Pbk(:)));
jiqi=jiqi_0(1);                
 a1=0.5;        %a1=0; 
 a2=1;       %a2=0.5; 
 b1=0.35;      %b1=0.1; 
 b2=0.4;     %b2=0.15;
ts=unifrnd(a1*makespan1,a2*makespan1,1,1);
ts=roundn(ts,0);              
te=unifrnd(b1*Tbusy(jiqi),b2*Tbusy(jiqi),1,1);
te=roundn(te,0);              
%% Calculate the objective function value
Avekcmb=te/2+ts;         
ejc2=(1./exp(abs(Avecft(2,:)-Avekcmb))).*ftc(2,:);   
ej=[ejc1,ejc2];
%% Enter a predictive model
load ('net1-10-10.mat')  
pt=ej'; 
t1=sim(net,pt); 
RMn=t1';
end

🌈3 Matlab代码实现

🎉4 参考文献

部分理论来源于网络,如有侵权请联系删除。


[1]Guohui Zhang, Xixi Lu, Xing Liu, Litao Zhang, Shiwen Wei, Wenqiang Zhang (2022) An  two-stage algorithm based on convolutional neural network for flexible job shop scheduling problem

目录
打赏
0
0
0
0
78
分享
相关文章
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
本文系统讲解从基本强化学习方法到高级技术(如PPO、A3C、PlaNet等)的实现原理与编码过程,旨在通过理论结合代码的方式,构建对强化学习算法的全面理解。
62 10
18个常用的强化学习算法整理:从基础方法到高级模型的理论技术与代码实现
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
基于NSGAII的的柔性作业调度优化算法MATLAB仿真,仿真输出甘特图
本程序基于NSGA-II算法实现柔性作业调度优化,适用于多目标优化场景(如最小化完工时间、延期、机器负载及能耗)。核心代码完成任务分配与甘特图绘制,支持MATLAB 2022A运行。算法通过初始化种群、遗传操作和选择策略迭代优化调度方案,最终输出包含完工时间、延期、机器负载和能耗等关键指标的可视化结果,为制造业生产计划提供科学依据。
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
近端策略优化(PPO)是深度强化学习中高效的策略优化方法,广泛应用于大语言模型的RLHF训练。PPO通过引入策略更新约束机制,平衡了更新幅度,提升了训练稳定性。其核心思想是在优势演员-评论家方法的基础上,采用裁剪和非裁剪项组成的替代目标函数,限制策略比率在[1-ϵ, 1+ϵ]区间内,防止过大的策略更新。本文详细探讨了PPO的基本原理、损失函数设计及PyTorch实现流程,提供了完整的代码示例。
754 10
近端策略优化(PPO)算法的理论基础与PyTorch代码详解
基于WOA鲸鱼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB 2022a实现时间序列预测,采用CNN-GRU-SAM网络结构,结合鲸鱼优化算法(WOA)优化网络参数。核心代码含操作视频,运行效果无水印。算法通过卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征,全连接层整合输出。数据预处理后,使用WOA迭代优化,最终输出最优预测结果。
基于GA遗传优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目使用MATLAB 2022a实现时间序列预测算法,完整程序无水印。核心代码包含详细中文注释和操作视频。算法基于CNN-LSTM-SAM网络,融合卷积层、LSTM层与自注意力机制,适用于金融市场、气象预报等领域。通过数据归一化、种群初始化、适应度计算及参数优化等步骤,有效处理非线性时间序列,输出精准预测结果。
基于WOA鲸鱼优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本内容介绍了一种基于CNN-LSTM-SAM网络与鲸鱼优化算法(WOA)的时间序列预测方法。算法运行于Matlab2022a,完整程序无水印并附带中文注释及操作视频。核心流程包括数据归一化、种群初始化、适应度计算及参数更新,最终输出最优网络参数完成预测。CNN层提取局部特征,LSTM层捕捉长期依赖关系,自注意力机制聚焦全局特性,全连接层整合特征输出结果,适用于复杂非线性时间序列预测任务。
基于GWO灰狼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a,展示了时间序列预测算法的运行效果(无水印)。核心程序包含详细中文注释和操作视频。算法采用CNN-GRU-SAM网络,结合灰狼优化(GWO),通过卷积层提取局部特征、GRU处理长期依赖、自注意力机制捕捉全局特征,最终实现复杂非线性时间序列的高效预测。
|
8月前
|
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
324 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等