杨利霞 发表于 2019-6-26 15:18

2018国赛数学建模B题两道工序代码


2018国赛数学建模B题两道工序代码

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

图1是一个智能加工系统的示意图,由8台计算机数控机床(Computer Number Controller,CNC)、1辆轨道式自动引导车(Rail Guide Vehicle,RGV)、1条RGV直线轨道、1条上料传送带、1条下料传送带等附属设备组成。RGV是一种无人驾驶、能在固定轨道上自由运行的智能车。它根据指令能自动控制移动方向和距离,并自带一个机械手臂、两只机械手爪和物料清洗槽,能够完成上下料及清洗物料等作业任务(参见附件1)。
https://img-blog.csdn.net/20180917164623748?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2FiYzE0OTg4ODA0MDI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70


                                                                   图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 W21=455; //加工完成一道工序的物料所需时间
        int W22=182; //加工完成二道工序的物料所需时间
        int C=25; //完成一个物料的清洗作业所需时间
        int T=0;
        int RGV_X=0;  //RGV在第一个位置
        int RGV_G=0;  //0表示RGV拿的是生料,1是完成第一道工序的
        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(RGV_G==0){  //如果RGV拿的是生料
                        if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==0){
                                if(CNC_Flag==0){ //如果CNC1没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC3没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC5没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC7没有在工作,就发信号
                                        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=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                                ////////////////////////////////////////////////////////
                                if(T+T1>28800)
                                        break;
                                else{
                                        printf("(上料时间:%d)",T);
                                        T=T+T1;
                                       
                                        for(i=0;i<8;i=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        if(min2==0){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("1 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==1){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("3 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==2){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("5 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==3){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("7 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                }
                        }
                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        else if(CNC_Flag==1 && CNC_Flag==1 && CNC_Flag==1 && CNC_Flag==1){ //如果CNC1,3,5,7都在工作,RGV就等待
                                if(RGV_X!=0){
                                        T=T+M;
                                       
                                        for(i=0;i<8;i=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        RGV_X=0;
                                }
                                else{
                                        T=T+1;
                                        for(i=0;i<8;i=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+1;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+1;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                        }
                        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                        else if(CNC_Flag==2 || CNC_Flag==2 || CNC_Flag==2 || CNC_Flag==2){  //如果CNC1,3,5,7有一个完工
                                if(CNC_Flag==2){ //如果CNC1没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC3没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC5没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC7没有在工作,就发信号
                                        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=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                                ////////////////////////////////////////////////////////
                                if(T+T1>28800)
                                        break;
                                else{
                                        printf("(上下料时间:%d)",T);
                                        T=T+T1;
                                       
                                        for(i=0;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T1;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        if(min2==0){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("1 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==1){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("3 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==2){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("5 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==3){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("7 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                }
                                RGV_G=1;
                        }               
                }
                //////////////////////////////////////////////////////////////////////////////////////////////
                if(RGV_G==1){
                        if(CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==0 || CNC_Flag==0){
                                if(CNC_Flag==0){ //如果CNC2没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC4没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC6没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==0){ //如果CNC8没有在工作,就发信号
                                        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=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                                ////////////////////////////////////////////////////////
                                if(T+T1>28800)
                                        break;
                                else{
                                        printf("(第2道上料时间:%d)",T);
                                        T=T+T2;
                                        for(i=0;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        if(min2==0){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("2 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==1){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("4 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==2){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("6 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==3){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("8 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                }
                                RGV_G=0;
                        }
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        else if(CNC_Flag==1 && CNC_Flag==1 && CNC_Flag==1 || CNC_Flag==1){  //等待
                                if(RGV_X!=0){
                                        T=T+M;
                                       
                                        for(i=0;i<8;i=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        RGV_X=0;
                                }
                                else{
                                        T=T+1;
                                        for(i=0;i<8;i=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+1;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+1;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                        }
                        ////////////////////////////////////////////////////////////////////////////////////////////
                        else if(CNC_Flag==2 || CNC_Flag==2 || CNC_Flag==2 || CNC_Flag==2){   //如果CNC2,4,6,8已加工完
                                if(CNC_Flag==2){ //如果CNC2没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC4没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC6没有在工作,就发信号
                                        CNC_X=1;
                                }
                                if(CNC_Flag==2){ //如果CNC8没有在工作,就发信号
                                        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=i+2){   //针对奇数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){   //针对偶数
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+M;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                }
                                ////////////////////////////////////////////////////////
                                if(T+T1>28800)
                                        break;
                                else{
                                        printf("(第2道xia料时间:%d)",T);
                                        count++;         //成件加1
                                        T=T+T1+C;
                                       
                                        for(i=0;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W21){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        for(i=1;i<8;i=i+2){
                                                if(CNC_Flag==1){    //已加工时间增加
                                                        CNC_WT=CNC_WT+T2+C;
                                                }
                                                if(CNC_WT>=W22){    //加工完成
                                                        CNC_Flag=2;
                                                        CNC_WT=0;
                                                }
                                        }
                                        if(min2==0){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("2 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==1){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("4 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==2){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("6 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                        if(min2==3){
                                                CNC_X=0;
                                                CNC_Flag=1;
                                                printf("8 ");
                                                count2++;
                                                if(count2==30){
                                                        printf("\n");
                                                        count2=0;
                                                }
                                        }
                                }
                                RGV_G=0;
                        }
                }
                min1=5;
                min2=-1;
        }
        printf(" %d \n",count);
        return 0;
}
里面用的是第三组数据。
---------------------
作者:佛系喵
来源:CSDN



页: [1]
查看完整版本: 2018国赛数学建模B题两道工序代码