📄 simulate.h
字号:
#ifndef SIMULATE_H
#define SIMULATE_H
#include <cstdlib>
#include <ctime>
#include <iostream>
#include "typedef.h"
void Simulate(ostream& out, int off)//off为下班时间
{
srand(time(NULL));
Counter *counter[5];//窗口(只用数组的后四个)
EventList eList;//事件队列(插入按发生时间排序)
Customer *c;//顾客
Event *e;//事件
int Now;//标志当前发生事件时刻
int TotalTimeSpent = 0;//用户逗留时间累加器
int ID = 0;//用户个数
int MinQ = 1, MinLength;//最短队列及其长度
int ArriveTime = rand() % 5 + 1, ServiceTime;
int i;//循环变量
for (i = 1; i <= 4; i++)
counter[i] = new Counter(i);//初始化窗口
//插入第一个事件
e = new Event(ArriveTime, ARRIVAL);
eList.Insert(*e);
//表头
out << "Customer ID" << "\t" << "Arrival" << "\t\t"
<< "At Counter" << "\t" << "Start" << "\t\t" << "Departure\n";
//开始模拟
while (!eList.IsEmpty())
{
eList.Delete(*e);
Now = e->Time();
if (e->Type())
{//elist.Type() != 0,用户离开事件
counter[e->Type()]->Delete();
}
else
{//用户到达事件
//生成到达客户的处理事务所需时间
ServiceTime = rand() % 18 + 3;
//该用户该不该办理业务?
if (ArriveTime + ServiceTime >= off)
{
//生成下一个用户的到达事件并依时间顺序插入事件队列
ArriveTime = Now + (rand() % 5 + 1);
e = new Event(ArriveTime, ARRIVAL);
eList.Insert(*e);
break;
}
//寻找最短队列(从随机位置开始,避免业务分配不平衡)
int j = MinQ = rand() % 4 + 1;
MinLength = counter[MinQ]->Length();
for (i = (j + 1) % 4 + 1; i != j; i = (i + 1) % 4 + 1)
{
if (MinLength > counter[i]->Length())
{
MinQ = i;
MinLength = counter[i]->Length();
}
}
out << ++ID << "\t\t";//输出该客户序号。其它部分输出在EnQueue函数中完成
c = new Customer(ArriveTime, ServiceTime);
counter[MinQ]->EnQueue(*c, out);//排队
//累加各用户在银行逗留时间
TotalTimeSpent += counter[MinQ]->FinishTime() - ArriveTime;
//生成下一个用户的到达事件并依时间顺序插入事件队列
ArriveTime = Now + (rand() % 5 + 1);
e = new Event(ArriveTime, ARRIVAL);
eList.Insert(*e);
//将刚到达客户的离开事件插入事件队列
e = new Event(counter[MinQ]->FinishTime(), EVENT_TYPE(MinQ));
eList.Insert(*e);
}
}
out << endl;
out << "Summary:\n";
out << "Counter" << '\t' << "Customers Accepted" << '\t'
<< "Total Service Time" << '\t'
<< "Max Service Time\n";
for (i = 1; i <= 4; i++)
{
counter[i]->Output(out);
out << endl;
}
out << "Average time spent by customers staying in the bank is "
<< TotalTimeSpent / ID << " minutes.\n";
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -