程序员人生 网站导航

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

栏目:php教程时间:2015-07-24 09:51:03

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

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

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

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


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐