2018高教社杯B题 RGV动态调度 c++模拟

##2018高教社杯B题 RGV动态调度 c++模拟

本人软件工程专业,怀着提高数学能力的初衷参加数学建模竞赛,万万没想到居然在这道题里提高了编程能力。。甚至之前没学懂的指针都搞懂了,连调试程序也得心应手了:)
虽然答辩时被怼这不是程序设计大赛而是数学建模竞赛,但感觉收获颇多,代码也颇有价值,可用在论文最后动态模拟RGV工作流程。
注:程序中只用了数组、指针、动态生成随机数等最基本C++技术,可放心食用
代码如下:

  • 一道工序
#include "stdafx.h"
#include <math.h>
#include <iostream>
#include <ctime>
#include <random>
#define random(a,b) (rand()%(b-a)+a)

int m = 545;//CNC上单个产品加工时间
int erro = 0;
int Time = 0, H = 0, W = 0, U = 0, Q = 0; //Time为系统从开始到某时刻的时间;H为系统运动消耗时间;W为系统等待时间;U为系统上下料时间;Q为系统清洗熟料时间
int h = 0, w = 0, u = 0, u1 = 27, u2 = 32, q = 25, h1 = 18, h2 = 32, h3 = 46;//u1为奇数CNC上下料时间,u2为偶数CNC上下料时间
int place1 = 1, place2 = 2, place3 = 3, place4 = 4;//设定RGV轨道上四个位置节点
int n = 0;//产出熟料数量




class CNC {
public:
	int T = 0;
	int status1 = 1;
	int status2 = 0;
	int Cp = place1;
	int products = 0;
};

class RGV {
public:
	int RpNow = place1;//RGV当前所处位置
	int RpNext = place4;//RGV下一个遍历的位置
};



void TimeCost(CNC *k);
void Pick1(CNC *k, int u);
void Pick2(CNC *k, int u);
void Wait(CNC k[8]);
void route(CNC k[8], RGV *s);




int main()
{
	srand(unsigned(time(0)));
	RGV rgv;//一台RGV

	CNC cnc[8];//一共8台CNC机器且都可被RGV使用
	cnc[1].Cp = place1, cnc[2].Cp = place2;
	cnc[3].Cp = place2, cnc[4].Cp = place3;
	cnc[5].Cp = place3, cnc[6].Cp = place4;
	cnc[7].Cp = place4, cnc[0].Cp = place1;


	//RGV工作流程:

	while (Time <= 8 * 3600)
	{

		//更新CNC的请求状态
		TimeCost(cnc);

		//系统进入等待时间
		if ((cnc[0].status1 == 0 && cnc[0].status2 == 0) && (cnc[1].status1 == 0 && cnc[1].status2 == 0) && (cnc[2].status1 == 0 && cnc[2].status2 == 0) && (cnc[3].status1 == 0 && cnc[3].status2 == 0) && (cnc[4].status1 == 0 && cnc[4].status2 == 0) && (cnc[5].status1 == 0 && cnc[5].status2 == 0) && (cnc[6].status1 == 0 && cnc[6].status2 == 0) && (cnc[7].status1 == 0 && cnc[7].status2 == 0))
		{

			Wait(cnc);

		}
		//选择下一个去的位置
		else
		{

			route(cnc, &rgv);

		}






	}


	//计算产出的总产品量
	printf("总共生产了%d个熟料\n", n);
	printf("出了%d次错", erro);

	getchar();

	return 0;
}

//判断某台CNC是否在加工产
void TimeCost(CNC k[8])
{
	for (int r = 0;r < 8;r++)
	{
		if (abs((Time - k[r].T)) >= m)
		{

			k[r].status1 = 0;
			k[r].status2 = 1;
		}
	}


}

void Pick1(CNC *k, int u)
{
	k->status1 = 0;
	k->status2 = 0;
	U += u;//增加单位上下料时间
	Time += u;
	if (random(0, 100) == 10)
	{
		k->T = Time + random(10 * 60, 20 * 60) + random(0, m);
		erro++;
	}
	else {
		k->T = Time;//记录CNC开始工作时刻
	}
	
				//printf("%d\n", (k->T)-50);
}

void Pick2(CNC *k, int u)
{
	
	k->status1 = 0;
	k->status2 = 0;
	k->products++;
	U += u;//增加单位上下料时间
	Time += u;
	if (random(0,100)==10)
	{
		k->T = Time + random(10 * 60, 20 * 60) + random(0, m);
		erro++;
	}
	else {
		k->T = Time;//记录CNC开始工作时刻
		Q += q;//增加单位清洗时间
		Time += q;
		n++;
	}

	printf("%d\n", Time - 50);
}

void Wait(CNC k[8]) {
	int temp = 10000000;
	for (int n = 0;n<8;n++)
	{
		if (temp >= k[n].T)
		{
			temp = k[n].T;
		}
	}
	Time += (m - (Time - temp));//增加最小等待时间	
}

void route(CNC k[8], RGV *s) {
	int c = 5;
	int d = 0;
	for (int i = 0;i < 8;i++)
	{
		if (k[i].status1 == 1 || k[i].status2 == 1)
		{
			if (abs(k[i].Cp - s->RpNow)< c)
			{

				s->RpNext = k[i].Cp;
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值