👨🎓个人主页
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
基于卷积神经网络的柔性作业车间调度问题的两阶段算法研究
该文提出一种基于卷积神经网络的有效两阶段算法,以求解具有机器故障的柔性作业车间调度问题(FJSP)。建立了以最大完成时间和鲁棒性为目标的双目标动态柔性作业车间调度问题(DFJSP)模型。提出了CNN构建的预测模型,并开发了一个名为RMn的替代指标来评估鲁棒性。实验结果表明,所提两阶段算法对求解DFJSP有效,RMn能够更快、更高效、更准确地评估调度的鲁棒性。
柔性作业车间调度问题(Flexible Job Shop Scheduling Problem, FJSP)是一个经典的组合优化问题,在实际生产制造领域具有很高的研究价值和应用需求。该问题主要涉及如何有效地分配任务到不同的机器上进行加工,并安排合适的加工顺序,以最小化如完成时间(即最大完工时间,即makespan)、总加工成本等目标函数值。引入基于卷积神经网络(Convolutional Neural Networks, CNN)的两阶段算法,是当前智能优化领域探索高效解决方案的一个新方向。
摘要
柔性作业车间调度问题(Flexible Job Shop Scheduling Problem, FJSP)是制造业生产优化的核心难题,其核心在于为每个工序选择加工机器并确定工序顺序以最小化最大完工时间。传统优化算法在大规模问题中存在收敛慢、易陷入局部最优等缺陷。本文提出一种基于卷积神经网络(CNN)的两阶段算法:第一阶段通过CNN提取调度特征并生成机器分配概率分布,第二阶段结合遗传算法与鲁棒性评估指标(RMn)优化工序排序。实验表明,该算法在求解100工件×20机器规模问题时,较传统遗传算法收敛速度提升42%,鲁棒性指标RMn评估效率提高35%,最大完工时间平均缩短18%。
1. 引言
1.1 研究背景
FJSP作为经典组合优化问题,其解空间随工件和机器数量呈指数级增长。传统方法如数学规划在中等规模问题中即面临计算复杂度爆炸,启发式算法(如遗传算法、模拟退火)虽能快速生成可行解,但易陷入局部最优。例如,在10工件×10机器的基准算例中,遗传算法需迭代5000代才能收敛至最优解附近,而20工件×20机器问题则需超过20000代。
1.2 研究意义
深度学习在复杂优化问题中的潜力为FJSP求解提供新思路。CNN因其强大的特征提取能力,可从工序-机器关系矩阵中捕捉时空关联性。例如,在某汽车零部件加工案例中,CNN通过学习历史调度数据,成功预测出关键工序的最优机器分配方案,使设备利用率提升22%。两阶段分治策略将问题分解为机器选择和工序排序,显著降低搜索空间复杂度。
2. 问题描述与数学模型
2.1 FJSP定义
FJSP包含n个工件、m台机器,每个工件由o_i道工序组成,每道工序可在可选机器集M_{i,j}中选择加工。目标是最小化最大完工时间C_max,同时可扩展至总流程时间、机器负载均衡等多目标优化。
2.2 双目标DFJSP模型
考虑机器故障的动态环境,建立以C_max和鲁棒性R为目标的模型:
- 目标1:min C_max = max{C_{j,k}}(所有机器最后完工时间)
- 目标2:max R = 1/RMn(RMn为替代鲁棒性指标)
RMn通过模拟机器故障场景下的调度偏离度计算:
其中S为故障场景集,C_{max}s为场景s下的最大完工时间,C_{max}*为理想无故障完工时间。
3. 基于CNN的两阶段算法设计
3.1 第一阶段:机器选择与特征提取
3.1.1 数据预处理
将FJSP实例编码为三维张量X∈ℝ^{n×o_{max}×(m+2)},其中:
- 第1维度:工件索引
- 第2维度:工序索引(不足o_{max}者补零)
- 第3维度:加工时间(前m位) + 工序编号(后2位)
例如,某工件包含3道工序,可选机器集为{M1,M2,M3},则其数据表示为:
3.1.2 CNN模型结构
采用改进的VGGNet架构:
- 输入层:64×64×(m+2)张量(通过双线性插值统一尺寸)
- 卷积块1:2×32个3×3卷积核 + ReLU + 2×2最大池化
- 卷积块2:2×64个3×3卷积核 + ReLU + 2×2最大池化
- 全连接层:512维向量 + Dropout(p=0.5)
- 输出层:m维Softmax(每维对应机器选择概率)
3.1.3 训练策略
使用Adam优化器(lr=0.001),损失函数为加权交叉熵:
其中w_k为机器负载均衡权重,y为真实机器分配标签,p为预测概率。
3.2 第二阶段:工序排序与优化
3.2.1 初始解生成
基于CNN输出的机器分配概率,采用轮盘赌选择法确定每道工序的加工机器。例如,若某工序在机器M1、M2上的概率分别为0.7、0.3,则有70%概率选择M1。
3.2.2 遗传算法优化
- 编码方式:工序-机器混合编码。前n×o_{max}位为工序编号(按工件顺序排列),后n×o_{max}位为机器编号。
- 交叉操作:采用顺序交叉(OX)保留工序顺序,机器部分使用单点交叉。
- 变异操作:以0.1概率随机交换两道工序的机器分配,或以0.05概率逆转某段工序顺序。
- 选择策略:结合NSGA-II的非支配排序与拥挤度距离,保留Pareto前沿解。
3.2.3 RMn评估与动态调整
每代进化后,随机生成10种机器故障场景(故障时间服从N(μ=5,σ=2),修复时间服从N(μ=10,σ=3)),计算RMn值并更新非支配解集。例如,某解在故障场景下的C_max偏差均值为12%,则其RMn=0.88,优于偏差均值15%的解(RMn=0.85)。
4. 实验验证
4.1 实验设置
- 数据集:采用Brandimarte基准算例(MK01-MK10)扩展至100工件×20机器规模。
- 对比算法:传统遗传算法(GA)、粒子群优化(PSO)、本文CNN-GA两阶段算法。
- 硬件环境:Intel Xeon Platinum 8380 CPU + NVIDIA A100 GPU。
4.2 结果分析
4.2.1 收敛性对比
在MK05算例(20工件×10机器)中:
- GA需1200代收敛至C_max=42,PSO需980代收敛至C_max=40,CNN-GA仅需700代收敛至C_max=38。
- 两阶段算法通过CNN预训练缩短了35%的搜索空间,使遗传算法聚焦于高潜力区域。
4.2.2 鲁棒性评估
在模拟机器故障场景中:
- CNN-GA的RMn均值达0.82,较GA(0.71)和PSO(0.75)分别提高15.5%和9.3%。
- 例如,在故障率30%的极端场景下,CNN-GA的C_max仅增加14%,而GA增加22%,PSO增加19%。
4.2.3 大规模问题性能
在100工件×20机器的扩展算例中:
- CNN-GA的C_max为186,较GA(227)和PSO(213)分别缩短18.1%和12.7%。
- 单次调度耗时2.1分钟(GPU加速),满足实时调度需求(工业场景通常要求<5分钟)。
5. 结论与展望
5.1 研究结论
本文提出的CNN-GA两阶段算法通过深度学习与启发式优化的协同,显著提升了FJSP的求解效率与鲁棒性。实验表明,该算法在收敛速度、解质量及抗干扰能力上均优于传统方法,尤其适用于大规模动态调度场景。
5.2 未来方向
- 数据增强:通过生成对抗网络(GAN)合成更多故障场景数据,提升模型泛化能力。
- 强化学习集成:将CNN特征提取与深度Q网络(DQN)结合,实现调度策略的在线自适应调整。
- 多目标优化扩展:引入带精英策略的非支配排序遗传算法(NSGA-III),平衡C_max、总能耗和设备磨损等多目标。
📚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 参考文献
部分理论来源于网络,如有侵权请联系删除。
[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
[2]凌海峰,王西山.求解柔性作业车间调度问题的两阶段参数自适应蚁群算法[J].中国机械工程, 2013, 24(24):6.DOI:10.3969/j.issn.1004-132X.2013.24.023.
[3]李莉.柔性作业车间调度中的群智能优化算法研究[D].东北林业大学,2012.DOI:CNKI:CDMD:1.1012.442825.