银行排队模拟算法——运行实例
(要完整查看文档,请在计算机端浏览此文档)
此运行范例是懒猫老师所编写的程序依据视频中输入的数字产生的运行结果,同学们可以用这个文档和视频对照观看,能更好的体会银行排队模拟算法的执行流程。
银行排队算法程序运行效果如下:(红字体代表输入的随机数)
初始化事件列表
显示事件表:[0,-1,^]
——————第1次循环——————
删除事件链表中第一个结点存入evItem[0,-1,^]
是新客户到达事件,请输入durTime,interTime:23 4
把下一位客户到达的事件插入事件表
显示事件表:[4,-1,^]
新客户进入人数最少的队列:queue 0:
[0,23,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[4,-1,-] ->[23,0,^]
——————第2次循环——————
删除事件链表中第一个结点存入evItem[4,-1,-]
显示事件表:[23,0,^]
是新客户到达事件,请输入durTime,interTime:3 1
把下一位客户到达的事件插入事件表
显示事件表:[5,-1,-] ->[23,0,^]
新客户进入人数最少的队列:queue 1:
[4,3,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[5,-1,-] ->[7,1,-] ->[23,0,^]
——————第3次循环——————
删除事件链表中第一个结点存入evItem[5,-1,-]
显示事件表:[7,1,-] ->[23,0,^]
是新客户到达事件,请输入durTime,interTime:11 3
把下一位客户到达的事件插入事件表
显示事件表:[7,1,-] ->[8,-1,-] ->[23,0,^]
新客户进入人数最少的队列:queue 2:
[5,11,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[7,1,-] ->[8,-1,-] ->[16,2,-] ->[23,0,^]
——————第4次循环——————
删除事件链表中第一个结点存入evItem[7,1,-]
显示事件表:[8,-1,-] ->[16,2,-] ->[23,0,^]
将当前要离开的客户从队列中删除,(4, 3)
queue 1 :队列空
totleTime=3
——————第5次循环——————
删除事件链表中第一个结点存入evItem[8,-1,-]
显示事件表:[16,2,-] ->[23,0,^]
是新客户到达事件,请输入durTime,interTime:29 2
把下一位客户到达的事件插入事件表
显示事件表:[10,-1,-] ->[16,2,-] ->[23,0,^]
新客户进入人数最少的队列:queue 1:
[8,29,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[10,-1,-] ->[16,2,-] ->[23,0,-] ->[37,1,^]
——————第6次循环——————
删除事件链表中第一个结点存入evItem[10,-1,-]
显示事件表:[16,2,-] ->[23,0,-] ->[37,1,^]
是新客户到达事件,请输入durTime,interTime:18 4
把下一位客户到达的事件插入事件表
显示事件表:[14,-1,-] ->[16,2,-] ->[23,0,-] ->[37,1,^]
新客户进入人数最少的队列:queue 3:
[10,18,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[14,-1,-] ->[16,2,-] ->[23,0,-] ->[28,3,-] ->[37,1,^]
——————第7次循环——————
删除事件链表中第一个结点存入evItem[14,-1,-]
显示事件表:[16,2,-] ->[23,0,-] ->[28,3,-] ->[37,1,^]
是新客户到达事件,请输入durTime,interTime:13 5
把下一位客户到达的事件插入事件表
显示事件表:[16,2,-] ->[19,-1,-] ->[23,0,-] ->[28,3,-] ->[37,1,^]
新客户进入人数最少的队列:queue 0:
[0,23,-]->[14,13,^]
——————第8次循环——————
删除事件链表中第一个结点存入evItem[16,2,-]
显示事件表:[19,-1,-] ->[23,0,-] ->[28,3,-] ->[37,1,^]
将当前要离开的客户从队列中删除,(5, 11)
queue 2 :队列空
totleTime=14
——————第9次循环——————
删除事件链表中第一个结点存入evItem[19,-1,-]
显示事件表:[23,0,-] ->[28,3,-] ->[37,1,^]
是新客户到达事件,请输入durTime,interTime:20 30
新客户进入人数最少的队列:queue 2:
[19,20,^]
设定第一个客户离开银行的事件,插入事件表
显示事件表:[23,0,-] ->[28,3,-] ->[37,1,-] ->[39,2,^]
——————第10次循环——————
删除事件链表中第一个结点存入evItem[23,0,-]
显示事件表:[28,3,-] ->[37,1,-] ->[39,2,^]
将当前要离开的客户从队列中删除,(0, 23)
queue 0 :[14,13,^]
totleTime=37
如果还有人在排队,则把队头客户的离开事件插入事件表
显示事件表:[28,3,-] ->[36,0,-] ->[37,1,-] ->[39,2,^]
——————第11次循环——————
删除事件链表中第一个结点存入evItem[28,3,-]
显示事件表:[36,0,-] ->[37,1,-] ->[39,2,^]
将当前要离开的客户从队列中删除,(10, 18)
queue 3 :队列空
totleTime=55
——————第12次循环——————
删除事件链表中第一个结点存入evItem[36,0,-]
显示事件表:[37,1,-] ->[39,2,^]
将当前要离开的客户从队列中删除,(14, 13)
queue 0 :队列空
totleTime=68
——————第13次循环——————
删除事件链表中第一个结点存入evItem[37,1,-]
显示事件表:[39,2,^]
将当前要离开的客户从队列中删除,(8, 29)
queue 1 :队列空
totleTime=97
——————第14次循环——————
删除事件链表中第一个结点存入evItem[39,2,^]
将当前要离开的客户从队列中删除,(19, 20)
queue 2 :队列空
totleTime=117
totalTime=117 customerNum =7
客户在银行的平均逗留时间是:16.7143
Process returned 0 (0x0) execution time : 4.634 s
Press any key to continue.
上述随机数采用输入的方法进行,是为了对照答案看看是否运行正确。在实际运用中,应采用随机数模拟的方式生成随机数,则效果更好。大家自己查询一下随机数的生成方法。在这个例子中,如下设置常量。
const int CLOSE_TIME = 40; //银行关门时间
const int MAX_DURATION = 30; //每位客户最大服务时间为30分钟
const int MAX_INTERTIME = 10; //下一位客户到来的最大时间间隔为10分钟
因此生成的随机数durTime代表当前客户服务时间,应该在1-30的范围内随机生成;interTime代表下一个客户到来的间隔时间,应该在1-10的范围内随机生成。