#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. Linux获取用户主目录

    #!/usr/bin/python# -*- coding:utf-8 -*-import sysimport osclass get_home_path(object): def __init__( ...

  2. Python超简单的HTTP服务器

    Python超简单的HTTP服务器 安装了python就可以 python -m SimpleHTTPServer 执行这一个命令即可实现一个HTTP服务器,将当前目录设为HTTP服务目录,可以通过h ...

  3. 1084. Broken Keyboard (20)

    On a broken keyboard, some of the keys are worn out. So when you type some sentences, the characters ...

  4. linux kernel 0.11 head

    head的作用 注意:bootsect和setup汇编采用intel的汇编风格,而在head中,此时已经进入32位保护模式,汇编的采用的AT&T的汇编语言,编译器当然也就变成对应的编译和连接器 ...

  5. Java生成唯一的ID

    public class UIDGenerator { private static Date date = new Date(); private static StringBuilder buf ...

  6. [原创]PostgreSQL中十进制、二进制、十六进制之间的相互转换

    在PostgreSQL中,二进制.十进制.十六进制之间的转换是非常方便的,如下: 十进制转十六进制和二进制 mydb=# SELECT to_hex(10); to_hex -------- a (1 ...

  7. hdu 4857 逃生

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4857 逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能 ...

  8. JavaScript 中怎样判断文本框只能输出英文字母、汉字和数字,不能输入特殊字符!

    JS-只能输入中文和英文2008-11-08 10:17在js中用正则表达式对象(RegExp)判断中文 ^[\u0391-\uFFE5]+$英文 ^[A-Za-z]+$中文和英文/^[\u0391- ...

  9. Swift Tips - 在 Swift 中自定义下标访问

    Untitled Document.md input[type="date"].form-control,.input-group-sm>input[type="d ...

  10. 条款10:令operator=返回一个*this的引用

    为了编程的简洁性,有时候需要串联赋值,如:x = y = z = 15; 由于赋值采用右结合,因此上述语句被解释为:x = (y = (z = 15)); 为了实现串联赋值,复制操作符函数必须返回一个 ...