#coding=utf-8
import time
import random as rd
#import math
import pylab as pl
def simulate(nameda,u):
arriveInternal=0
serviceTime=0
serverCondition=0 #0表示服务台空闲,1表示忙碌
waitTime=0
stayTime=[]
tempArriveEventTime=[10000000]
tempLeaveEventTime=[10000000]
#tempArriveEventTime.append(10000000)
simulateTotalTime=1000000 #仿真时长
simulateClock=0
EntityNumber=0
queneLength=0
averageStayTime=0
currentArriveTime=0
currentLeaveTime=0
formerArriveTime=0
formerLeaveTime=0
lossMessage=0
#生成仿真表,包括实体的到达时间和离开时间
while simulateClock<=simulateTotalTime:
#保存上一个实体的到达、离开时间
formerArriveTime=currentArriveTime
formerLeaveTime=currentLeaveTime
#tempFormerLeaveTime=currentLeaveTime
####################随机数生成
arriveInternal=rd.expovariate(nameda)
serviceTime=rd.expovariate(u)
#######到达时间
if EntityNumber==0:
currentArriveTime=arriveInternal
else:
currentArriveTime=formerArriveTime+arriveInternal
#仿真结束与否判断
if currentArriveTime>=simulateTotalTime:
break
#等待时间
if EntityNumber>0 and currentArriveTime<formerLeaveTime:
waitTime=formerLeaveTime-currentArriveTime
else:
waitTime=0
##离开时间
currentLeaveTime=currentArriveTime+waitTime+serviceTime
#仿真结束与否判断
if currentLeaveTime>simulateTotalTime:
break
###仿真时钟
if EntityNumber==0:
simulateClock=currentLeaveTime#表示实体接受服务,并离开。
stayTime.append(currentLeaveTime) elif queneLength>=10:
#print("message missed")
currentLeaveTime=formerLeaveTime
lossMessage+=1
###排队的实体 if currentArriveTime>=simulateClock and EntityNumber!=0:#开始处理队列的实体
if len(tempArriveEventTime)>1:
minValue=min(tempArriveEventTime)
minIndex=tempArriveEventTime.index(minValue)
while minValue<=simulateClock:
simulateClock=tempLeaveEventTime[minIndex]#实体接受了服务的情况下才会重置仿真时钟
tempArriveEventTime.pop(minIndex)
tempLeaveEventTime.pop(minIndex)
if queneLength>0:
queneLength-=1
minValue=min(tempArriveEventTime)
minIndex=tempArriveEventTime.index(minValue)
#print("one processed")
else:
simulateClock=currentLeaveTime
stayTime.append(currentLeaveTime-currentLeaveTime)
#print("one processed")
if currentArriveTime<simulateClock and EntityNumber!=0 :
tempArriveEventTime.append(currentArriveTime)
tempLeaveEventTime.append(currentLeaveTime)
queneLength+=1
stayTime.append(currentLeaveTime-currentArriveTime) ###############
EntityNumber+=1
if EntityNumber%1000000==0:
print("arriveTime:"+str(currentArriveTime)+",leaveTime:"+str(currentLeaveTime))
lossRate=lossMessage/EntityNumber
averageStayTime=sum(stayTime)/len(stayTime)
print("loss rate:"+str(lossMessage/EntityNumber))
print("lossMessage:"+str(lossMessage))
print("entity:"+str(EntityNumber))
return lossRate,averageStayTime
pl.figure(1) #创建图表1,并选择图表1
ax1=pl.subplot(211) #在图表1中创建子图1
ax2=pl.subplot(212) #在图表1中创建子图2
start=time.clock()
for i in range(100):
a,b=simulate(8, 10)
print(str(i+1)+" simulate")
pl.sca(ax1)
#pl.plot(i,a,'o')
pl.ylabel("loss rate")
pl.scatter(i,a)
#pl.ylim(0,1)
pl.sca(ax2)
#pl.plot(i,b,'o')
pl.scatter(i,b)
pl.ylabel("stay time")
minutes=(time.clock()-start)/60
print("cost minutes:"+str(minutes))
pl.show()

理论部分参考:http://mi.gxu.edu.cn/jpkc/yunchouxue/resource_1info.php?id=29

MM1排队系统的更多相关文章

  1. 利用JS模拟排队系统

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天给大家分享的是js模拟排队系统,刚开始有排队序列,序列里有vip用户和普通用户,vip用户永远位于普通用户的前面,只有当当前vip用户都办理 ...

  2. matlab实现M/M/1排队系统

    Matlab实现. 分为主函数 MyLine 和被调用函数 Func. 主函数 MyLine 实现在 Func 函数的基础上实现序贯法, 将平均等待队长作为每次模拟的 X,求出置信区间.Func 函数 ...

  3. 叫号系统排队系统挂号系统实现(JAVA队列)

    关于队列,使用的地方很的多. 现实中有许多的样例. 比方医院的挂号系统,银行里的叫号系统,食堂里的排队打饭等等.市场上又这种排队取号的设备.他们的功能基本例如以下: 1.系统可联网联机统一发号.2.系 ...

  4. 赴美工作常识(Part 6 - 绿卡排队)

    上一篇<赴美工作常识(Part 5 - 绿卡优先级)>解释完排队的优先级是怎么确定的,以及 PERM 和 I–140 表的意义,接下来就要解释一下队具体是怎么排的以及排到之后的 I–485 ...

  5. 三、Redis基本操作——List

    小喵的唠叨话:前面我们介绍了Redis的string的数据结构的原理和操作.当时我们提到Redis的键值对不仅仅是字符串.而这次我们就要介绍Redis的第二个数据结构了,List(链表).由于List ...

  6. Golang之chan/goroutine(转)

    原文地址:http://tchen.me/posts/2014-01-27-golang-chatroom.html?utm_source=tuicool&utm_medium=referra ...

  7. 【商业源码】生日大放送-Newlife商业源码分享

    今天是农历六月二十三,是@大石头的生日,记得每年生日都会有很劲爆的重量级源码送出,今天Newlife群和论坛又一次疯狂了,吃水不忘挖井人,好的东西肯定要拿到博客园分享.Newlife组件信息: 论坛: ...

  8. 建模算法(七)——排队论模型

    (一)基本概念 一.排队过程的一般表示 凡是要求服务的对象称为顾客,凡是为顾客服务的称为服务员 二.排队系统的组成和特征 主要由输入过程.排队规则.服务过程三部分组成 三.排队模型的符号表示 1.X: ...

  9. get github

    Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理.在推出后,Git在其它项目中也取得了很大成功,尤其是在Ruby社区中.目前,包括Rubinius ...

随机推荐

  1. Scala学习笔记1(安装)

    到 官网下载scala tar包  http://www.scala-lang.org/download/ mac Finder里双击解压. 改名成scala 进命令行, mv ~/Downloads ...

  2. IEnumerable 接口 实现foreach 遍历 实例

    额 为啥写着东西? 有次面试去,因为用到的时候特别少 所以没记住, 这个单词 怎么写! 经典的面试题: 能用foreach遍历访问的对象的要求? 答:  该类实现IEnumetable 接口   声明 ...

  3. python中split与join

    1.split个人最喜欢的就是它能使输入的一连串数字变为list. str=raw_input("some ") str2=str.split(" ") str ...

  4. Flask —— 使用Python和OpenShift进行即时Web开发

    最近Packtpub找到了我,让我给他们新出版的关于Flask的书写书评.Flask是一个很流行的Python框架.那本书是Ron DuPlain写的<Flask 即时Web开发>.我决定 ...

  5. 每日一练--C语言--串

    目标 实现串的经典模式匹配算法与KMP算法. 简述 自定义串结构: 串采用定长顺序存储结构,串从下标1开始存储,0下标存储串的实际长度: 匹配成功返回匹配位置,匹配失败返回0. #include &l ...

  6. 调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法

    我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应 ...

  7. http://www.linuxso.com/linuxpeixun/10332.html

    http://blog.chinaunix.net/uid-134240-id-62371.html http://blog.chinaunix.net/uid-26495963-id-3279216 ...

  8. Modelsim的demo入门教程

    写在前面的话学过MCU设计的朋友都知道,系统调试是多么的重要.而对于FPGA设计来说,仿真确实最重要的.一个完整的项目,必须有完整的仿真平台.有朋友说,按键仿真模型没法搞. 我只能说,你并不了解硬件及 ...

  9. [shell基础]——find命令

    find命令选项 -name 按照文件名查找 -type 查找某一类型的文件(b 代表设备块:d 目录:c 字符设备文件:l 符号(软)链接文件:f 普通文件) -size 查找文件长度或者大小 -p ...

  10. win8中如何禁用屏幕旋转的快捷键

    程序员通常会使用ctrl+alt+方向键 里编辑代码,特别对于使用eclipse的程序员,更是如此,但是win8却把这一快捷键给占用了,很不爽,如何办,很简单.直接上图: 2.但是发现禁用之后并没有解 ...