##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;