离散事件模拟--银行排队时间模拟 微信:318175542

在数据结构中有个讲述如何模拟银行排队,最终算出每个人平均的逗留时间。

这是需要数据结构的知识。将银行的每个窗口看成是一个队列,那么对于每次来一个人,都需要从最短的队列进行排队。(其实更优秀的做法是从最短的等待时间队列来排队)。

这里的做法是这样的,首选在一个队列中插入一个人,整个事件是事件驱动的,每次去检查所有队列,删除那些业务用时已经超出的人,然后选择最短的队列来插入一个人,也就是说,每次插入一个人之前就需要清除队列中的人。然后再选择合适的队列来插入新的人。

#include <iostream>
#include <vector>
#include <deque>
#include <stdlib.h>
#include <time.h>
#include <numeric>
#include <limits>
using namespace std;
/*
模拟一个离散时间情形
比如银行的排队系统,记录每一个客户的平均逗留时间
*/
/*
思路:假设银行有多个窗口,那么每个窗口就是每个队列,我们
记录在规定时刻 或者所有窗口再次为空的情况下结束事件的模拟
*/

#define CloseTime 10000  //最长的模拟事件是10000分钟以后关闭事件的模拟

typedef struct Record Record;
struct Record
{
	int ArrivedTime;// 到达时间
	int CostTime;// 办理业务的时间
};

void Init(vector<deque<Record> >& win)
{
	srand((unsigned)time(NULL));
    int costtime = rand()%100;
	Record customer;
	customer.ArrivedTime =0;
	customer.CostTime = costtime;
	win[0].push_back(customer);
}
void Bank_Simulation(int WinNum)
{
	double CustomerNum=1,TotalTime=0;
	int CurTime=0;
	int flag =1;
	int LenDeque,index,i;
	Record temp;
	vector<deque<Record> > Win(WinNum);
	srand((unsigned)time(NULL));
	Init(Win);

	while(flag)
	{
		flag = 0;
		LenDeque = numeric_limits<int>::max();
		for(i=0;i<Win.size();i++)
		{

			if(Win[i].size() == 0)
			{
				LenDeque = Win[i].size();
				index = i;
				continue;
			}

			else
			{

				flag =1;
				while(Win[i].size())
				{
					temp = Win[i].front();
					if(temp.ArrivedTime + temp.CostTime < CurTime)
					{
						Win[i].pop_front();
						TotalTime += temp.CostTime;

					}
					else
						break;
				}
			    if(Win[i].size() < LenDeque)
				{
					LenDeque = Win[i].size();
					index = i;
				}

			}
		}
		if(flag ==0)
			break;
		if(CurTime >10000)
			break;
		cout<<"===="<<endl;
		int arrivetime = rand()%15;
		temp.ArrivedTime = arrivetime+CurTime;
		temp.CostTime = rand()%30;
		CurTime = temp.ArrivedTime;
		Win[index].push_back(temp);
		CustomerNum++;

	}
	cout<<TotalTime<<endl;
	cout<<CustomerNum<<endl;
	cout<<TotalTime/CustomerNum<<endl;
}

int main()
{
	Bank_Simulation(4);

	return 0;
}
时间: 2025-01-20 01:53:02

离散事件模拟--银行排队时间模拟 微信:318175542的相关文章

离散事件模拟-银行管理(模拟题,队列)

离散事件模拟-银行管理 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数.逗留时间定义为 人员离开的时间减去人员来的时间.银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间. 为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=tim

第三章:6.栈和队列 -- 离散事件模拟

前言: 本节讲述,队列的入队 和 离队行为,由事件决定情况下,是如何实现的. 目录: 离散事件模拟 正文: 问题:假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行.由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若4个窗口均有客户所占,他便会排在人数最少的队伍后面.现在需要编制一个程序以模拟银行这种业务活动并计算一天中客户在银行逗留的平均时间. 解题关键:掌握每个客户

离散事件模拟-银行管理(队列)

离散事件模拟-银行管理 Time Limit: 1000MS Memory limit: 65536K 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数.逗留时间定义为 人员离开的时间减去人员来的时间.银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间. 为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=time<=18,即从中午十二点

SDUTOJ 2087 离散事件模拟-银行管理

离散事件模拟-银行管理 Time Limit: 1000MS Memory limit: 65536K 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数.逗留时间定义为 人员离开的时间减去人员来的时间.银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间. 为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=time<=18,即从中午十二点

【数据结构】3、模拟银行窗口排队叫号系统——C++

这里我们模拟一下银行排队叫号系统的实现: 假设一个银行有4个窗口对外接待客户.由于每个窗口在某一时刻只能接待一个客户,在客户众多的时候需要排队,对于刚进入银行的客户,如果某个窗口正空闲, 则可上前办理业务,如果所有窗口都不空闲则排在人数最少的窗口. 现在要求模拟银行的某一时间段内的4个窗口的客户排队情况.这里客户到达的时刻和办理业务的时间都是随机的. 首先我们银行发生事件,我们得有一个类表示事件对象 /* *功能:这个实现的是我们事件的数据单元节点 *文件:Event.h *时间:2015年7月

模拟银行自动终端系统

本系统模拟银行用户使用ATM机开户.查询.存款.取款功能,要求使用java语言编程实现. 二. 项目功能要求: 项目开始运行显示主菜单为: 银行自助终端系统 **************************** 0.------开户 1.------查询 2.------存款 3.------取款 4.------退出 **************************** 请选择你要执行的功能: 此时,用户可以通过键盘输入选择自己要实现的功能,如果输入不是0,1,2,3,4,则系统提示:

模拟银行输入密码源码+注释+解答!

这篇文章是个大家分享的一点小知识:模拟银行输入密码源码+注释+解答! //模拟密码的输入 //库1 :*** //库2 :到位数 自动提交 //网络api 细节 800页 //学习网络概念 库 //c 数据结构 linux //C++ 数据结构 windows qt mfc //8000 #include #include #include //getch 没有回显 getchar回显 int main() { char passwd[] = "123456"; //原始密码 char

C语言教程 模拟银行输入密码源码

这篇文章是个大家分享的一点小知识:模拟银行输入密码源码+注释+解答! //模拟密码的输入 //库1 :*** //库2 :到位数 自动提交 //网络api 细节 800页 //学习网络概念 库 //c 数据结构 linux //C++ 数据结构 windows qt mfc //8000 #include #include #include //getch 没有回显 getchar回显 int main() { char passwd[] = "123456"; //原始密码 char

adb.【转】按键事件及adb命令模拟

1.Android 按键事件及adb命令模拟 - cjwsimple - CSDN博客.html(https://blog.csdn.net/man_embedded/article/details/80238914) ZC:各种 "电话键"."控制键"."功能键" 等,貌似 蛮全的,留作备用 2. adb shell input keyevent xxx xxx代表keycode keycode对照表 0 --> "KEYCOD