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 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(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++){
				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]<min3){
					min3=CNC_Flag[i];
					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[abs(min2-RGV_X)]>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;
}



				





里面用的是第三组数据。

瞎几把写的,可能有点垃圾。

热防护服是高温环境工作人群的重要保障,本文通过建立数学模型对多层热防护织物内部传热规律进行研究,建立防护服装内部的热传递模型,从而解决外界环境温度一定时,防护服各层随时间变化的温度分布问和各层织物材料的最优厚度问。 假人处于恒高温环境中,不考虑防护服织物的边缘热量损失,且人体和防护服的空气间隔很小,忽略空气的自然对流,只考虑热传导;故可以把织物视为导热多层平面,且属于非稳态导热过程。建立“高温环境-防护服-假人体表”系统;由傅里叶定律描述导热速率,将温度的变化转是能量传递的结果,将其看作电磁波的辐射和介质中对电磁波的传输问。 防护服中的温度分布由时间和防护服与外界热源相对位置二者共同决定的二元函数,因为二元偏微分方程的解析解无法精确求出,所以对时间进行离散化分析,分析以一秒为单位时间的温度变化与位置的关系,从而对问进行简化。 针对问一,将各层的导热过程抽象简化处理转换为平板中非稳态导热过程,在平板厚度的四周绝热良好时,从传热的角度上将问简化为一个一维传热问;从假人皮肤外侧的温度变化入手,根据热量的流向和生热情况从第Ⅳ层、第III层、第Ⅱ层、第Ⅰ层反向递推出和外界环境温度的关系,引入能温转换系数,建立假人皮肤外侧温度变化和外界温度的等式关系,最后利用最小二乘法设计程序,求出每一阶段的温度分布平差之后的结果,从而得到温度分布。 针对问二,考虑在一小时内该系统温度变化,用时间限制与温度阈值限制作为约束条件的规划问,沿用离散化分析手段,由假人体表温度逆推防护服第Ⅱ层厚度的表达式,建立其与外界温度的关系,并寻求满足条件下的最优解。 针对问三,考虑在给定半小时时间内该系统温度变化,添加更多的约束条件,对问二中的求解模型进行进一步优化,利用lingo寻找第Ⅱ、Ⅳ层厚度的最优解,并沿用前问中离散化分析手段,由假人体表温度逆推防护服相关设计参数。
评论 34
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值