2018数模国赛RGV调度
参考了很多的博客终于算弄懂了一点点去年国赛B题 今天就给大家简单写下,部分思路和代码有参考大佬的,尽量每条都加上了注释方便大家理解。
一、分析
1.本机器操作一共分为4种状态:停止、移动。清洗及下成料(清洗时间忽略不计),上下料(机械臂连接两个操作,做一个的时候另一个同时做)
2.上下料,将原机器位置上的孰料拿起,机械手臂转动放生料,当第一次的时候没有熟料可拿但是由于在同一条机械手臂上所以仍然要执行上料,所以上下料的时间是一样的。
3.清洗作业:将成料放进清洗槽再将成料下料。清洗及下成料时间固定,因为即使第一次操作时,清洗槽内没有放进去的清洗好的成料,但是由于机械臂连着两个手在一起,取成料操作仍然会执行。
4.移动:题目中默认RGV只有在收到某CNC需求信号后,才会移动至该CNC处,对其进行上下料操作。
5.整个分析有这样几种情况:
- 一道工序:根据距离RGV的远近,对所有的CNC进行上料,然后不断进行>上下料>清洗>上下料
- 两道工序:将一部分CNC分为A类,一部分为B类,分别操作第一道和第二道工序,A类加工完后,将半熟料放入B类CNC执行上料下料然后清洗后到达A类继续上下料操作,A>B>A>B,AB类的分布看到某位博主用的是暴力全排的做法,说可能有优化的可能,暂时我也想不出来,后面有可能再更吧。
- 有故障可能性对于1.2都要考虑。三个变量
(1 故障时间:加工一道工序的时间内的随机整数
(2 维修时间:600-1200(原题说的是10-20分钟
(3 发生概率:(0,1)随机数小于0.01对应1% - 改进后的RGV模型,说白了就是本来是等待CNC的呼叫,RGV响应去执行,在改进后可以就是RGV提前对走到任意一个机器的时间和该机器的工作时间排列后提前到达该CNC进行等待。
二、
1.对一道工序的CNC求解
%cnc:
% 第一行:cnc位置常量
% 第二行:cnc工作变量,空闲为0,忙碌为1
% 第三行:cnc工作时间,为常量560
% 第四行:cnc上下料时间
% 第五行:cnc预计完成时间
% 第六行:cnc加工物料数
1 1 2 2 3 3 4 4
0 0 0 0 0 0 0 0
560 560 560 560 560 560 560 560
28 31 28 31 28 31 28 31
0 0 0 0 0 0 0 0
%rgv:
% 第一行:rgv初始位置变量,初始为1
% 第二行:rgv工作变量,进行上下料或清洗作业,空闲为0,忙碌为1
% 第三行:rgv一次清洗作业时间
% 第四行:rgv预计完成时间
1
0
25
0
%speedRgv:
%移动1~3个单位所需时间
20
33
46
clear all;clc;
cnc = load ('1_cnc_1.txt');
cnc(6,:)=-1;%加工物料数
rgv = load ('1_rgv_1.txt');
speedRgv = load('1_speedRgv_1.txt');
case_1_result = (1:800)';
t = 0;
r = 1; %仅计数用
while t <= 28800 %以秒为计数单位
%1.在rgv和cnc均空闲状态下,找到距离最近的cnc编号
dist = 4; %距离
signal = 0;
for i=1:8%八个工作点
if cnc(2,i) == 0 %如果cnc空闲
if abs(cnc(1,i)-rgv(1))<dist %找到距离最近的cnc并返回cnc编号
dist = abs(cnc(1,i)-rgv(1))%距离
cncNum = i%工作的是第i台机器
value = cnc(1,i); %记录cnc位置以传递给rgv
step = abs(cnc(1,i)-rgv(1)); %rgv走的步数的绝对值
end
end
end
if step ~= 0 && cnc(2,cncNum) == 0 %rgv移动到最近的cnc处不等于0。表示当左右两端表达式不相等时,结果为1。
t = t + speedRgv(step);%soeedrgv所走的步数的选择一步还是两步的时间
rgv(1) = value;
signal = 1;
end
%2.上下料和清洗操作
if cnc(2,cncNum) == 0 %目前距离最近的这台操作台是否空闲
cnc(2,cncNum) = 1; %空闲的话就变为1
rgv(2) = 1; %rgv工作状态为1
%记录加工cnc的编号
case_1_result(r,2) = cncNum;%使用了哪台机器
case_1_result(r,3) = t;%上料开始时间
t = t + cnc(4,cncNum); %上下料时间
cnc(6,cncNum) = cnc(6,cncNum) + 1;%任意一台加工物料数
signal = 1;
cnc(5,cncNum) = t + cnc(3,cncNum); %cnc预计完成时间=上下料+工作时间(加工完一个工件料时间)
if cnc(5,cncNum) ~= 0
t = t + rgv(3); %清洗作业完成时间=上下料+清洗时间
end
r = r + 1;
end
%3.更改cnc状态为空闲
for i = 1:8
if t >= cnc(5,i) && cnc(5,i) ~= 0
cnc(2,i) = 0;
end
end
if signal == 0
t = t +1; %这部分的意思就是当while每循环一次时间也走了一秒
%else
%continue;
end
end
%计算下料开始时间,即改cnc的下一次上料时间
for i = 1:800
for j =i+1:800
if case_1_result(i,2)==case_1_result(j,2)
case_1_result(i,4)=case_1_result(j,3);%如果上次的加工机器正好是同一个那么这次的下料时间也就等于上次的上料时间
break;
end
end
end
结果
今天就写到这,剩下的情况再更。