图1是一个智能加工系统的示意图,由8台计算机数控机床(Computer Number Controller,CNC)、1辆轨道式自动引导车(Rail Guide Vehicle,RGV)、1条RGV直线轨道、1条上料传送带、1条下料传送带等附属设备组成。RGV是一种无人驾驶、能在固定轨道上自由运行的智能车。它根据指令能自动控制移动方向和距离,并自带一个机械手臂、两只机械手爪和物料清洗槽,能够完成上下料及清洗物料等作业任务(参见附件1)。
图1:智能加工系统示意图
针对下面的三种具体情况:
(1)一道工序的物料加工作业情况,每台CNC安装同样的刀具,物料可以在任一台CNC上加工完成;
(2)两道工序的物料加工作业情况,每个物料的第一和第二道工序分别由两台不同的CNC依次加工完成;
(3)CNC在加工过程中可能发生故障(据统计:故障的发生概率约为1%)的情况,每次故障排除(人工处理,未完成的物料报废)时间介于10~20分钟之间,故障排除后即刻加入作业序列。要求分别考虑一道工序和两道工序的物料加工作业情况。
请你们团队完成下列两项任务:
任务1:对一般问题进行研究,给出RGV动态调度模型和相应的求解算法;
任务2:利用表1中系统作业参数的3组数据分别检验模型的实用性和算法的有效性,给出RGV的调度策略和系统的作业效率,并将具体的结果分别填入附件2的EXCEL表中。
表1:智能加工系统作业参数的3组数据表 时间单位:秒
系统作业参数 |
第1组 |
第2组 |
第3组 |
RGV移动1个单位所需时间 |
20 |
23 |
18 |
RGV移动2个单位所需时间 |
33 |
41 |
32 |
RGV移动3个单位所需时间 |
46 |
59 |
46 |
CNC加工完成一个一道工序的物料所需时间 |
560 |
580 |
545 |
CNC加工完成一个两道工序物料的第一道工序所需时间 |
400 |
280 |
455 |
CNC加工完成一个两道工序物料的第二道工序所需时间 |
378 |
500 |
182 |
RGV为CNC1#,3#,5#,7#一次上下料所需时间 |
28 |
30 |
27 |
RGV为CNC2#,4#,6#,8#一次上下料所需时间 |
31 |
35 |
32 |
RGV完成一个物料的清洗作业所需时间 |
25 |
30 |
25 |
注:每班次连续作业8小时。
#include
#include
#include
int main(){
int M[4]={0,18,32,46};
int T1=27; //CNC1,3,5,7一次上下料所需时间
int T2=32; //CNC2,4,6,8一次上下料所需时间
int W11=545; //加工完成一个一道工序的物料所需时间
int C=25; //完成一个物料的清洗作业所需时间
int T=0;
int RGV_X=0; //RGV在第一个位置
int CNC_Flag[8]; //0表示没有在加工,1表示正在加工,2表示加工完成
int CNC_WT[8]; //记录CNC已工作时间
int CNC_X[4]; //CNC_X[i]=1表示GRV要去第i个位置
int i;
int length=-1; //记录路径长度
int min1=5; //记录最短路径
int min2=-1; //记录要去的最短的点
int count=0; //记录成件
int count2=0;
for(i=0;i<8;i++){
CNC_Flag[i]=0; //一开始CNC都处于没有加工状态
CNC_WT[i]=0; //一开始CNC已工作时间都是0
}
for(i=0;i<4;i++){
CNC_Flag[i]=0; //一开始RGV那里都不用去
}
while(T<28800){ //时间未到时
if(CNC_Flag[0]==0 || CNC_Flag[1]==0 || CNC_Flag[0]==2 || CNC_Flag[0]==2){ //CNC1或2发信号
CNC_X[0]=1;
}
if(CNC_Flag[2]==0 || CNC_Flag[3]==0 || CNC_Flag[2]==2 || CNC_Flag[3]==2){ //CNC3或4发信号
CNC_X[1]=1;
}
if(CNC_Flag[4]==0 || CNC_Flag[5]==0 || CNC_Flag[4]==2 || CNC_Flag[5]==2){ //CNC5或6发信号
CNC_X[2]=1;
}
if(CNC_Flag[6]==0 || CNC_Flag[7]==0 || CNC_Flag[6]==2 || CNC_Flag[7]==2){ //CNC7或8发信号
CNC_X[3]=1;
}
for(i=0;i<4;i++){ //找到哪个地方是最近的
if(CNC_X[i]==1){
length=abs(RGV_X-i);
if(length28800)
break;
else if(min1>=0 && min1<=3){
T=T+M[min1]; //时间增加
CNC_X[min2]=0;
RGV_X=min2; //RGV移动到最近点
///////////////////////////////////////////////////////
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+M[min1];
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
///////////////////////////////////////////////////////
}
if(min2==0){
if(CNC_Flag[0]==0){ //如果CNC1没有在加工,CNC1完成一次上下料 ,置CNC1处于加工状态
if(T+T1>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[0]=1;
printf("1 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[0]==2){ //如果CNC1在加工,CNC1完成一次上下料,再完成一次清洗工作,置CNC1处于加工状态
if(T+T1+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T1+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[0]=1;
count++;
printf("1 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[1]==0){ //如果CNC2没有在加工,CNC2完成一次上下料,置CNC2处于加工状态
if(T+T2>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T2;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[1]=1;
printf("2 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[1]==2){ //如果CNC2在加工,CNC2完成一次上下料,再完成一次清洗工作,置CNC2处于加工状态
if(T+T2+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T2+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[1]=1;
count++;
printf("2 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
else if(min2==1){
if(CNC_Flag[2]==0){ //如果CNC3没有在加工,CNC3完成一次上下料 ,置CNC3处于加工状态
if(T+T1>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[2]=1;
printf("3 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[2]==2){ //如果CNC3在加工,CNC3完成一次上下料,再完成一次清洗工作,置CNC3处于加工状态
if(T+T1+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T1+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[2]=1;
count++;
printf("3 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[3]==0){ //如果CNC4没有在加工,CNC4完成一次上下料,置CNC4处于加工状态
if(T+T2>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T2;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[3]=1;
printf("4 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[3]==2){ //如果CNC4在加工,CNC4完成一次上下料,再完成一次清洗工作,置CNC4处于加工状态
if(T+T2+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T2+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[3]=1;
count++;
printf("4 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
else if(min2==2){
if(CNC_Flag[4]==0){ //如果CNC5没有在加工,CNC5完成一次上下料 ,置CNC5处于加工状态
if(T+T1>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[4]=1;
printf("5 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[4]==2){ //如果CNC5在加工,CNC5完成一次上下料,再完成一次清洗工作,置CNC5处于加工状态
if(T+T1+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T1+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[4]=1;
count++;
printf("5 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[5]==0){ //如果CNC6没有在加工,CNC6完成一次上下料,置CNC6处于加工状态
if(T+T2>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T2;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[5]=1;
printf("6 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[5]==2){ //如果CNC6在加工,CNC6完成一次上下料,再完成一次清洗工作,置CNC6处于加工状态
if(T+T2+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T2+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[5]=1;
count++;
printf("6 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
else if(min2==3){
if(CNC_Flag[6]==0){ //如果CNC7没有在加工,CNC7完成一次上下料 ,置CNC7处于加工状态
if(T+T1>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[6]=1;
printf("7 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[6]==2){ //如果CNC7在加工,CNC7完成一次上下料,再完成一次清洗工作,置CNC7处于加工状态
if(T+T1+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T1+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T1+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[6]=1;
count++;
printf("7 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[7]==0){ //如果CNC8没有在加工,CNC8完成一次上下料,置CNC8处于加工状态
if(T+T2>28800)
break;
else{
printf("(上料时间:%d)",T);
T=T+T2;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[7]=1;
printf("8 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
if(CNC_Flag[7]==2){ //如果CNC8在加工,CNC8完成一次上下料,再完成一次清洗工作,置CNC8处于加工状态
if(T+T2+C>28800)
break;
else{
printf("(上下料时间:%d)",T);
T=T+T2+C;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+T2+C;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
CNC_Flag[7]=1;
count++;
printf("8 ");
count2++;
if(count2==30){
printf("\n");
count2=0;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
else{ //否则等待,等待过程中RGV先移动到要完成加工的CNC那里
int min3=600;
min1=5;
min2=-1;
/* T=T+1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
*/
for(i=0;i<8;i++){
if(CNC_Flag[i]28800)
break;
else if(min2>=0 && min2<=3 && M[abs(min2-RGV_X)]!=0){
T=T+M[abs(min2-RGV_X)]; //时间增加
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+M[abs(min2-RGV_X)];
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
RGV_X=min2; //RGV移动到最近点
// printf("%d ",min2+1);
count2++;
if(count2==30){
// printf("\n");
count2=0;
}
}
else{
T=T+1;
for(i=0;i<8;i++){
if(CNC_Flag[i]==1){ //已加工时间增加
CNC_WT[i]=CNC_WT[i]+1;
}
if(CNC_WT[i]>=W11){ //加工完成
CNC_Flag[i]=2;
CNC_WT[i]=0;
}
}
}
min3=600;
}
min1=5;
min2=-1;
}
printf("%d\n",count);
return 0;
}
里面用的是第三组数据。
瞎几把写的,可能有点垃圾。