matlab解决带多AGV的生产车间调度研究

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编号,第三个数字为此工件的工序号。

 

  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值