1. 程式人生 > >2018國賽數學建模B題兩道工序程式碼

2018國賽數學建模B題兩道工序程式碼

                          問題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[4]={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[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(RGV_G==0){  //如果RGV拿的是生料
			if(CNC_Flag[0]==0 || CNC_Flag[2]==0 || CNC_Flag[4]==0 || CNC_Flag[6]==0){
				if(CNC_Flag[0]==0){ //如果CNC1沒有在工作,就發訊號
					CNC_X[0]=1;
				}
				if(CNC_Flag[2]==0){ //如果CNC3沒有在工作,就發訊號
					CNC_X[1]=1;
				}
				if(CNC_Flag[4]==0){ //如果CNC5沒有在工作,就發訊號
					CNC_X[2]=1;
				}
				if(CNC_Flag[6]==0){ //如果CNC7沒有在工作,就發訊號
					CNC_X[3]=1;
				}
				////////////////////////////////////////////////////////
				for(i=0;i<4;i++){   //找到哪個地方是最近的
					if(CNC_X[i]==1){
						length=abs(RGV_X-i);
						if(length<min1){
							min1=length;
							min2=i;
						}
					}
				}
				if(T+M[length]>28800)
					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=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
				}
				////////////////////////////////////////////////////////
				if(T+T1>28800)
					break;
				else{
					printf("(上料時間:%d)",T);
					T=T+T1;
					
					for(i=0;i<8;i=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T1;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T1;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					if(min2==0){
						CNC_X[0]=0;
						CNC_Flag[0]=1;
						printf("1 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==1){
						CNC_X[1]=0;
						CNC_Flag[2]=1;
						printf("3 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==2){
						CNC_X[2]=0;
						CNC_Flag[4]=1;
						printf("5 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==3){
						CNC_X[3]=0;
						CNC_Flag[6]=1;
						printf("7 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			else if(CNC_Flag[0]==1 && CNC_Flag[2]==1 && CNC_Flag[4]==1 && CNC_Flag[6]==1){ //如果CNC1,3,5,7都在工作,RGV就等待
				if(RGV_X!=0){
					T=T+M[RGV_X-0];
					
					for(i=0;i<8;i=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[RGV_X-0];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[RGV_X-0];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					RGV_X=0;
				}
				else{
					T=T+1;
					for(i=0;i<8;i=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+1;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+1;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
				}
			}
			//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			else if(CNC_Flag[0]==2 || CNC_Flag[2]==2 || CNC_Flag[4]==2 || CNC_Flag[6]==2){  //如果CNC1,3,5,7有一個完工
				if(CNC_Flag[0]==2){ //如果CNC1沒有在工作,就發訊號
					CNC_X[0]=1;
				}
				if(CNC_Flag[2]==2){ //如果CNC3沒有在工作,就發訊號
					CNC_X[1]=1;
				}
				if(CNC_Flag[4]==2){ //如果CNC5沒有在工作,就發訊號
					CNC_X[2]=1;
				}
				if(CNC_Flag[6]==2){ //如果CNC7沒有在工作,就發訊號
					CNC_X[3]=1;
				}
				////////////////////////////////////////////////////////
				for(i=0;i<4;i++){   //找到哪個地方是最近的
					if(CNC_X[i]==1){
						length=abs(RGV_X-i);
						if(length<min1){
							min1=length;
							min2=i;
						}
					}
				}
				if(T+M[length]>28800)
					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=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
				}
				////////////////////////////////////////////////////////
				if(T+T1>28800)
					break;
				else{
					printf("(上下料時間:%d)",T);
					T=T+T1;
					
					for(i=0;i<8;i=i+2){
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T1;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T1;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					if(min2==0){
						CNC_X[0]=0;
						CNC_Flag[0]=1;
						printf("1 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==1){
						CNC_X[1]=0;
						CNC_Flag[2]=1;
						printf("3 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==2){
						CNC_X[2]=0;
						CNC_Flag[4]=1;
						printf("5 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==3){
						CNC_X[3]=0;
						CNC_Flag[6]=1;
						printf("7 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
				}
				RGV_G=1;
			}		
		}
		//////////////////////////////////////////////////////////////////////////////////////////////
		if(RGV_G==1){
			if(CNC_Flag[1]==0 || CNC_Flag[3]==0 || CNC_Flag[5]==0 || CNC_Flag[7]==0){
				if(CNC_Flag[1]==0){ //如果CNC2沒有在工作,就發訊號
					CNC_X[0]=1;
				}
				if(CNC_Flag[3]==0){ //如果CNC4沒有在工作,就發訊號
					CNC_X[1]=1;
				}
				if(CNC_Flag[5]==0){ //如果CNC6沒有在工作,就發訊號
					CNC_X[2]=1;
				}
				if(CNC_Flag[7]==0){ //如果CNC8沒有在工作,就發訊號
					CNC_X[3]=1;
				}
				////////////////////////////////////////////////////////
				for(i=0;i<4;i++){   //找到哪個地方是最近的
					if(CNC_X[i]==1){
						length=abs(RGV_X-i);
						if(length<min1){
							min1=length;
							min2=i;
						}
					}
				}
				if(T+M[length]>28800)
					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=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=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[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T2;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T2;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					if(min2==0){
						CNC_X[0]=0;
						CNC_Flag[1]=1;
						printf("2 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==1){
						CNC_X[1]=0;
						CNC_Flag[3]=1;
						printf("4 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==2){
						CNC_X[2]=0;
						CNC_Flag[5]=1;
						printf("6 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==3){
						CNC_X[3]=0;
						CNC_Flag[7]=1;
						printf("8 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
				}
				RGV_G=0;
			}
			////////////////////////////////////////////////////////////////////////////////////////////
			else if(CNC_Flag[1]==1 && CNC_Flag[3]==1 && CNC_Flag[5]==1 || CNC_Flag[7]==1){  //等待
				if(RGV_X!=0){
					T=T+M[RGV_X-0];
					
					for(i=0;i<8;i=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[RGV_X-0];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[RGV_X-0];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					RGV_X=0;
				}
				else{
					T=T+1;
					for(i=0;i<8;i=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+1;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+1;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
				}
			}
			////////////////////////////////////////////////////////////////////////////////////////////
			else if(CNC_Flag[1]==2 || CNC_Flag[3]==2 || CNC_Flag[5]==2 || CNC_Flag[7]==2){   //如果CNC2,4,6,8已加工完
				if(CNC_Flag[1]==2){ //如果CNC2沒有在工作,就發訊號
					CNC_X[0]=1;
				}
				if(CNC_Flag[3]==2){ //如果CNC4沒有在工作,就發訊號
					CNC_X[1]=1;
				}
				if(CNC_Flag[5]==2){ //如果CNC6沒有在工作,就發訊號
					CNC_X[2]=1;
				}
				if(CNC_Flag[7]==2){ //如果CNC8沒有在工作,就發訊號
					CNC_X[3]=1;
				}
				////////////////////////////////////////////////////////
				for(i=0;i<4;i++){   //找到哪個地方是最近的
					if(CNC_X[i]==1){
						length=abs(RGV_X-i);
						if(length<min1){
							min1=length;
							min2=i;
						}
					}
				}
				if(T+M[length]>28800)
					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=i+2){   //針對奇數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){   //針對偶數
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+M[min1];
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=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[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T2+C;
						}
						if(CNC_WT[i]>=W21){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					for(i=1;i<8;i=i+2){
						if(CNC_Flag[i]==1){    //已加工時間增加
							CNC_WT[i]=CNC_WT[i]+T2+C;
						}
						if(CNC_WT[i]>=W22){    //加工完成
							CNC_Flag[i]=2;
							CNC_WT[i]=0;
						}
					}
					if(min2==0){
						CNC_X[0]=0;
						CNC_Flag[1]=1;
						printf("2 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==1){
						CNC_X[1]=0;
						CNC_Flag[3]=1;
						printf("4 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==2){
						CNC_X[2]=0;
						CNC_Flag[5]=1;
						printf("6 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
					if(min2==3){
						CNC_X[3]=0;
						CNC_Flag[7]=1;
						printf("8 ");
						count2++;
						if(count2==30){
							printf("\n");
							count2=0;
						}
					}
				}
				RGV_G=0;
			}
		}
		min1=5;
		min2=-1;
	}
	printf(" %d \n",count);
	return 0;
}

裡面用的是第三組資料。

也是瞎幾把寫的,可能有點垃圾。