#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. masterha_check_repl报错汇总

    [root@DBMysql ~]#masterha_check_repl --conf=/etc/masterha/app1.cnf 导致如下报错的原因主要有两类: 1.mysql的安装时用源码安装, ...

  2. javascript arguments

    此文为转载文章: 什么是arguments arguments 是是JavaScript里的一个内置对象,它很古怪,也经常被人所忽视,但实际上是很重要的.所有主要的js函数库都利用了arguments ...

  3. python os模块使用方法

    os.path模块 basename('文件路径')    去掉目录路径,返回fname文件名  1 import os 2 os.path.basename('/Volumes/1.mp4')   ...

  4. R语言的字符串处理

    R语言字符串的拼接 content<-paste("124235","789","124",sep="@") 运行 ...

  5. java中的接口回调

    [接口回调]接口回调是多态的另一种体现.接口回调是指:可以把使用某一个接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法.当接口变量调用被类实现的接口中 ...

  6. 2.Knockout.Js(监控属性Observables)

    前言 1.创建一个ViewModel <script type="text/javascript"> //1.创建一个ViewModel var myViewModel ...

  7. UIView Programming Guide学习笔记

    |View |Creating and Configuring View Objects |Creating and Managing a View Hierarchy |Adjusting the ...

  8. xml之Schema架构

    1.什么是Schema架构 2.Schema文档结构  3.Schema元素类型 1>element元素 <!--简单数据:类型--> <xs:element name=&qu ...

  9. 电梯调度--c++--软件工程

    一.设计思路 (1)将乘客要去的楼层数存起来. (2)假设yi为乘客要爬楼层数之和,yi=n1*|(n1-ni)|+n2*|(n2-ni)|+..+n18*|(n18-ni)| (3)比较y1到y18 ...

  10. 【Implement strStr() 】cpp

    题目: Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if ne ...