%% 输入变量
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编号')