杨利霞 发表于 2019-4-7 11:42

智能RGV的动态调度策略

  问题B    智能RGV的动态调度策略

图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<stdio.h>
#include<math.h>
#include<stdlib.h>
int main(){
        int M={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;  //0表示没有在加工,1表示正在加工,2表示加工完成
        int CNC_WT; //记录CNC已工作时间
        int CNC_X; //CNC_X=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=0;  //一开始CNC都处于没有加工状态
                CNC_WT=0;       //一开始CNC已工作时间都是0
        }
        for(i=0;i<4;i++){
                CNC_Flag=0;  //一开始RGV那里都不用去
        }
        while(T<28800){  //时间未到时
                if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==2 || CNC_Flag==2){ //CNC1或2发信号
                        CNC_X=1;
                }
                if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==2 || CNC_Flag==2){ //CNC3或4发信号
                        CNC_X=1;
                }
                if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==2 || CNC_Flag==2){ //CNC5或6发信号
                        CNC_X=1;
                }
                if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==2 || CNC_Flag==2){ //CNC7或8发信号
                        CNC_X=1;
                }
                for(i=0;i<4;i++){   //找到哪个地方是最近的
                        if(CNC_X==1){
                                length=abs(RGV_X-i);
                                if(length<min1){
                                        min1=length;
                                        min2=i;
                                }
                        }
                }
                if(T+M>28800)
                        break;
                else if(min1>=0 && min1<=3){
                        T=T+M;   //时间增加
                        CNC_X=0;   
                        RGV_X=min2;      //RGV移动到最近点
///////////////////////////////////////////////////////
                        for(i=0;i<8;i++){
                                if(CNC_Flag==1){    //已加工时间增加
                                        CNC_WT=CNC_WT+M;
                                }
                                if(CNC_WT>=W11){    //加工完成
                                        CNC_Flag=2;
                                        CNC_WT=0;
                                }
                        }
///////////////////////////////////////////////////////
                }
                if(min2==0){
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("1 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("1 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("2 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("2 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                }
//////////////////////////////////////////////////////////////////////////////////////////////
                else if(min2==1){
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("3 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("3 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("4 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("4 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                }
/////////////////////////////////////////////////////////////////////////////////////////////////
                else if(min2==2){
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("5 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("5 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("6 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("6 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                }
/////////////////////////////////////////////////////////////////////////////////////////////////
                else if(min2==3){
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("7 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        count++;
                                        printf("7 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=1;
                                        printf("8 ");
                                        count2++;
                                        if(count2==30){
                                                printf("\n");
                                                count2=0;
                                        }
                                }
                        }
                        if(CNC_Flag==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==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W11){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        CNC_Flag=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==1){    //已加工时间增加
                                        CNC_WT=CNC_WT+1;
                                }
                                if(CNC_WT>=W11){    //加工完成
                                        CNC_Flag=2;
                                        CNC_WT=0;
                                }
                        }
*/
                        for(i=0;i<8;i++){
                                if(CNC_Flag<min3){
                                        min3=CNC_Flag;
                                        if(i==0 || i==1){
                                                min2=0;
                                        }
                                        else if(i==2 || i==3){
                                                min2=1;
                                        }
                                        else if(i==4 || i==5){
                                                min2=2;
                                        }
                                        else if(i==6 || i==7){
                                                min2=3;
                                        }
                                }
                        }
                        if(T+M>28800)
                                break;
                        else if(min2>=0 && min2<=3 && M!=0){
                                T=T+M;   //时间增加  
                                for(i=0;i<8;i++){
                                        if(CNC_Flag==1){    //已加工时间增加
                                                CNC_WT=CNC_WT+M;
                                        }
                                        if(CNC_WT>=W11){    //加工完成
                                                CNC_Flag=2;
                                                CNC_WT=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==1){    //已加工时间增加
                                                CNC_WT=CNC_WT+1;
                                        }
                                        if(CNC_WT>=W11){    //加工完成
                                                CNC_Flag=2;
                                                CNC_WT=0;
                                        }
                                }
                        }
                        min3=600;
                }
                min1=5;
                min2=-1;
        }
        printf("%d\n",count);
        return 0;
}



                                









页: [1]
查看完整版本: 智能RGV的动态调度策略