国赛RGV单工序动态调度算法

%% 输入变量
clear;close all
tmove1=input('移动1个单位所需时间');
tmove2=input('移动2个单位所需时间');
tmove3=input('移动3个单位所需时间');
cnc=input('完成一个一道工序的物料所需时间');
odd=input('1#,3#,5#,7#一次上下料所需时间');
even=input('2#,4#,6#,8#一次上下料所需时间');
clear=input('清洗作业所需时间');%输入题目所给的三组参数
tupd=[odd even odd even odd even odd even];%输入上下料所需时间
result=[];%初始化用于保存最终的结果(四列)
tD=zeros(8);%初始化RGV移动时间矩阵


%%  构造RGV移动的时间矩阵
for i=1:8
    for j=1:8
        k=ceil(i/2);%RGV的位置(1-4)
        g=ceil(j/2);%机器的位置(1-4)
        a=abs(k-g);%计算移动的距离
        b=fix(a/3);
        c=fix((a-3*b)/2);
        tD(i,j)=b*tmove3+c*tmove2+(a-3*b-2*c)*tmove1;%更新时间
    end
end


%%  进行贪心模拟
L=1;  %为上个生料选出的CNC
tm=zeros(8,1);%初始化每个CNC距离下次空闲所需的时间
T=0;%初始化计时为零
j=0;%商品数
cm=zeros(8,1);%初始化上一次每个CNC所容纳的生料
while T<=28800
    if all(tm)%如果所有的CNC都不空闲则在原地等待
        m=min(tm);%返回距离下次空闲所需时间最短的一个
        tm=tm-m;%更新所有时tm
        T=T+m;%计时更新
    else
        j=j+1;%更新生料序号
        result(j,1)=j;%将生料序号置于第一列
        result(j,3)=T;%将初始时间置于第三列
        i=find(tm==0);%找出空闲的CNC
        time=tD(L,i)+tupd(i)+clear;%分别计算每个空闲的CNC距离该生料上下料并清洗结束所需要的时间
        time1=time';%转置为列向量
        m=min(time1);%找出最短的时间
        b=find(time==m);%找出最短的时间所在的序号
        a=i(b(1));%找出最短的时间的CNC,若有多个便默认取第一个
        L=a;%将该CNC序号赋给L即更新RGV目前所处的CNC位置
        T=T+m; %计时更新
        i=find(tm~=0);%找到处于工作状态的CNC
        tm(i)=tm(i)-m;%将处于工作状态的CNC距离下次空闲所需的时间进行更新
        tm(a)=cnc;%将选出来的CNC距离下次工作状态所需要的时间进行更新,即更新为加工时间
        bm=cm(a);%返回选出来的CNC上次所容纳的生料序号
        cm(a)=j;%更新该位置的cm
        if bm~=0  %如果选出来的序号不是0,即上次该位置不为空
            result(bm,4)=T; %下料时间点赋给结果的第四列
        end
        result(j,2)=a;%将选出来的CNC序号更新为结果的第二列
    end
end


%% 绘制RGV运动的过程图
i=[0];
situ=zeros(2,4);
x=[1 4];
y=[1 2];
im=image(x,y,situ,'CDataMapping','scaled')
colorbar
for j=1:100000
    situ=zeros(2,4);
    i=i+1;
    if result(i,4)>28800 || result(i,4)==0
        break;%如果时间超过就退出循环
    end
    situ(result(i,2))=100;
    temp=situ(1,:);
    situ(1,:)=situ(2,:);
    situ(2,:)=temp;%由于matlab默认从上向下,与题目的图是上下反着,故调换位置
    im.CData=situ;%更改句柄的数据更新位置
    title(['RGV的调度轨迹图,当前时间为',num2str(result(i,3))])
    pause(0.001)
end


%% 绘制CNC变化折线图,输出结果
disp(['最多加工完成的生料数目分别为'])
disp(i-1)
figure(2)
plot(result((1:i-1),2),'k-') 
xlabel('次数')
ylabel('CNC编号')

 

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值