概述
1、研究背景描述
传统生产车间调度模型很多,也有很多从此方面入手的遗传算法,但是如果加上AGV就不多了,今天讲一下比较简单的带有AGV的生产车间调度问题。一般这样的带有生产调度和AGV调度的问题需要考虑:1、车间内生产的效率最高;2、AGV运输时效率最高,所以其实可以整合为一个求最小化调度时间的问题。
2、相关问题描述
含有AGV的柔性作业车间调度问题,考虑n种工件在m台机器上加工,并且由AGV负责工件在设备间的运输过程,每个工件均有多道具有顺序约束的工序,每道工序均具有一台或者多台可选加工机器,通过合理安排工序加工顺序和加工机器,使给定指标最优化。
3、模型及编码方式描述
3.1相关的主要模型及描述如下:
3.2主要编码方式
在编码的时候主要是采用了三层编码的方式,也比较简单,这里就不再过多的赘述,下面用图展示说明:
4、编码中需要注意的问题
4.1交叉变异中的问题
由于是三层编码,所以在交叉变异时,有个问题就是由于对前面的工序机床等进行了交叉,就会出现可能不对应的问题,某些工件的工序多余,某些工件的工序缺失,因此把工件工序多余的操作变为工件工序缺失的操作,并按照交叉前个体的操作机床和AGV,来进行调整。
4.2AGV等待时间问题
有时候AGV到达机床时的时候,工件不一定加工完成了,所以这时候就需要等待,还有就是AGV的工序一定是一件一件的来做,相关逻辑需要好好安排,不然在后面的甘特图中可能出现,一个AGV在第10-15分钟搬运A但是在14分钟的时候又开始搬运B的情况。
5、主函数展示
%% 清空环境
clc;clear
%% 下载数据
load scheduleData AGV AGVNumber TAGV Jm T JmNumber
%工序 时间
%% 基本参数
NIND=40; %个体数目
MAXGEN=100; %最大遗传代数
GGAP=0.9; %代沟
XOVR=0.8; %交叉率
MUTR=0.1; %变异率
gen=0; %代计数器
%PNumber 工件个数 MNumber 工序个数
[PNumber MNumber]=size(Jm); %PNumber=Jm的行数,MNumber=Jm的列数
trace=zeros(2, MAXGEN); %寻优结果的初始值,生成2行MAXGEN列的零矩阵
WNumber=PNumber*MNumber; %工序总个数
%% 初始化
Number=zeros(1,PNumber); % PNumber 工件个数
for i=1:PNumber
Number(i)=MNumber; ... %number=[6 6 6 6 6 6]
end
%-------------如需帮忙V:18332607515
% 代码2层,第一层工序,第二层机器,第三层AGV
Chrom=zeros(NIND,3*WNumber); %chrom:40*72的零矩阵
for j=1:NIND %j=1:40
WPNumberTemp=Number; %WPNT代表每个工件的工序数,number=[6 6 6 6 6 6]
for i=1:WNumber
%随机产成工序(这段循环,是让val不为零)
val=unidrnd(PNumber); %从工件数中随机产生一个数,就是几号工件的意思
while WPNumberTemp(val)==0 %当WPNumberTemp(val)恒等于零,6个工序分配完了
val=unidrnd(PNumber); %换一个工件
end
%第一层代码表示工序
Chrom(j,i)= val; %Val是工件号,(将工件分配到每一行,形成工序)
WPNumberTemp(val)=WPNumberTemp(val)-1; %工件每分配一次,对应工序总数减一
%第2层代码表示机器
Temp1=Jm{val,MNumber-WPNumberTemp(val)}; %6-未分配工序数=已分配工序数=当前正在分配工序号
SizeTemp=length(Temp1); %有的工序,两种机器都可以加工
%随机产成工序机器
Chrom(j,i+WNumber)= unidrnd(SizeTemp); %chrom前面是工序,后面是,加工加床1or2
%第3层代码表示A GV
Temp2=AGV{val,MNumber-WPNumberTemp(val)};%6-未分配工序数=已分配工序数=当前正在分配工序号
SizeAGVTemp= length(Temp2);
%随机生成AGV
Chrom(j,i+2*WNumber)= unidrnd(SizeAGVTemp);
end
end
%-------------如需帮忙V:18332607515
%计算目标函数值
[PVal ObjV P S]=cal(Chrom,AGV,TAGV,AGVNumber,JmNumber,T,Jm);
%% 循环寻找
while gen<MAXGEN %小于进化代数
%分配适应度值
FitnV=ranking(ObjV);
%选择操作
SelCh=select('rws', Chrom, FitnV, GGAP); %rws就是轮盘赌的方法 select('轮盘赌'',矩阵,适应度,代沟)
%交叉操作
SelCh=across(SelCh,XOVR,AGV,Jm,T); %XOVR就是交叉率 across(选择完,交叉概率,工件-工序-机床矩阵1,2)
%变异操作
SelCh=aberranceJm(SelCh,MUTR,AGV,Jm,T); %MUTR就是变异率 aberranceJm(交叉完,变异率,工件-工序-机床矩阵1,2)
%计算目标适应度值
[PVal ObjVSel P S]=cal(SelCh,AGV,TAGV,AGVNumber,JmNumber,T,Jm);%第一次计算:[PVal ObjV P S]=cal(Chrom,JmNumber,T,Jm),这次是更新选择,交叉,变异后的chrom
%重新插入新种群
[Chrom ObjV] =reins(Chrom, SelCh,1, 1, ObjV, ObjVSel);%reins 完成插入子代到当前种群,用子代代替父代并返回结果种群
%将子代SelCh插入到父代Chrom,第三位参数1表示子种群的个数,第四位参数1指的是按照适应度选择,子代代替最小适应的个体。ObjV、ObjVSel是父代、子代的函数值。
%目标函数值越大的,其适应度越小。reins替换的适应度小的值,所以也就是替换函数值大的值
%代计数器增加
gen=gen+1;
%保存最优值
trace(1, gen)=min(ObjV); %产生父代最小值
trace(2, gen)=mean(ObjV); %产生父代均值
% 记录最佳值
if gen==1 %如果是第一代
Val1=PVal; %Val1=PVal为调度工序开始加工时间及完成时间
Val2=P; %Val2=P 511 321 542 .....
MinVal=min(ObjV); %MinVal=min(ObjV):MinVal=第一代父代最小值
STemp=S; %S=其基因
end
%记录 最小的工序
if MinVal>trace(1,gen) %如果当前最小值>接下来代数中的最小值
Val1=PVal;
Val2=P;
MinVal=trace(1,gen); %更改最小值为当前代数的最小值
STemp=S; %STemp更改为当前基因
end
end
%-------------如需帮忙V:18332607515
% 当前最佳值
PVal=Val1; %工序时间
P=Val2; %工序
S=STemp; %调度基因含机器基因
%% 描绘解的变化
figure(1)
plot(trace(1,:));
hold on;
plot(trace(2,:),'-.');grid;
legend('解的变化','种群均值的变化');
%% 显示最优解
figure(2);
MP=S(1,PNumber*MNumber+1:PNumber*MNumber*2); %准备求加工机床号
for i=1:WNumber %WNumber工序总个数
val= P(1,i); %加工工件及工序
a=(mod((mod(val,100)),10)); %工序
c=(((mod(val,100))-a)/10);
b=((val-a-c*10)/100); %工件
Temp1=Jm{b,a}; %Temp=Jm(工件、工序)对应的机器
mText=Temp1(MP(1,i)); %加工机床号
x1=PVal(1,i);
x2=PVal(2,i);
y1=mText-1;
y2=mText;
plotRec(x1,x2,mText);
plotRec(PVal(1,i),PVal(2,i),mText);
hold on;
fill([x1,x2,x2,x1],[y1,y1,y2,y2],[1-1/b,1/b,b/PNumber]);
text((x1+x2)/2,mText-0.25,num2str(P(i)));
end
%-------------如需帮忙V:18332607515
6、结果展示
从下面的甘特图可以看到,横坐标为时间,纵坐标为机器号,每一个方块代表一道工序,左边在X轴的时间代表其工序开始时间,即AGV开始搬运的时间,右边在X轴上的时间代表工序结束时间,其中方块上的三个数字,第一个数代表工件编号,第二个数字代表搬运此工件的AGV编号,第三个数字为此工件的工序号。方块上的三个数字,第一个数代表工件编号,第二个数字代表搬运此工件的AGV编号,第三个数字为此工件的工序号。
最后
以上就是野性鸡翅为你收集整理的matlab解决带多AGV的生产车间调度研究1、研究背景描述2、相关问题描述3、模型及编码方式描述4、编码中需要注意的问题5、主函数展示6、结果展示 的全部内容,希望文章能够帮你解决matlab解决带多AGV的生产车间调度研究1、研究背景描述2、相关问题描述3、模型及编码方式描述4、编码中需要注意的问题5、主函数展示6、结果展示 所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复