⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simulate.h

📁 银行业务模拟系统
💻 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 + -