M/M/1随机服务系统的模拟

M/M/1模型是一种出生-死亡过程,此随机过程中的每一个状态代表模型中人数的数目。因为模型的队列长度无限且参与人数亦无限,故此状态数目亦为无限。例如状态0表示模型闲置、状态1表示模型有一人在接受服务、状态2表示模型有二人(一人正接受服务、一人在等候),如此类推。 此模型中,出生率(即加入队列的速率)λ在各状态中均相同,死亡率(即完成服务离开队列的速率)μ亦在各状态中相同(除了状态0,因其不可能有人离开队列)。故此,在任何状态下,只有两种事情可能发生:有人加入队列。如果模型在状态k,它会以速率λ进入状态k + 1有人离开队列。如果模型在状态k(k不等于0),它会以速率μ进入状态k − 1,由此可见,模型的隐定条件为λ < μ。如果死亡率小于出生率,则队列中的平均人数为无限大,此这种系统没有平衡点。

一、M/M/1随机服务系统的模拟

M/M/1服务系统:(1)队列长度没有限制;(2)顾客到达的时间间隔和服务时间均服从指数分布;(3)服务台数量为1。

1. 系统的理论绩效指标

模型参数符号说明

参数 平均到达率 平均服务率 系统服务强度 系统空闲概率 系统平均顾客数 队列平均人数 平均逗留时间 平均等待时间
符号 \(\lambda\) \(\mu\) \(\rho\) \(P_0\) \(L_s\) \(L_q\) \(W_s\) \(W_q\)
R计算程序
Lambda <- 1
Mue <-2
Rho <-Lambda/Mue
p0=1-Rho
Lq= Rho ^ 2/(1-Rho)
Wq = Lq / Lambda
Ls <- Lq + Rho
Ws <- Ls / Lambda
R计算结果
参数 平均到达率 平均服务率 系统服务强度 系统空闲概率 系统平均顾客数 队列平均人数 平均逗留时间 平均等待时间
符号 \(\lambda\) \(\mu\) \(\rho\) \(P_0\) \(L_s\) \(L_q\) \(W_s\) \(W_q\)
理论值 1 2 0.5 0.5 1 0.5 1 0.5

2. 系统的R模拟仿真

R模型构建
library(dplyr)
library(simmer)
T0=10
T1=10000
lambda=1.0
mu=2.0
set.seed(1234) ## 建立模拟环境
bank <- simmer("bank")
## 用trajectory()建立顾客,并指定顾客的一系列活动
## seize()获取柜台服务资源,如果正在忙,就进入排队
## 服务时间用timeout指定,为了生成多个随机服务时间,
## timeout的参数是返回随机服务时间的而函数而不是时间值本身
customer <-
trajectory("顾客") %>%
seize("柜台") %>%
timeout( function() rexp(1, mu)) %>%
release("柜台") ## 用add_resource生成柜台资源
## 用add_generator()生成顾客到来列
bank %>%
add_resource("柜台") %>%
add_generator("顾客", customer, function() {rexp(1, lambda)} ) ## 用run()执行模拟到指定结束时刻
bank %>%
run(until=T1)
R计算程序
## 用get_mon_arrivals()获取各个顾客到来的时间、离开时间、活动时间等,结果是数据框
## 用dplyr::mutate()对数据框增加新变量
resd <- bank %>%
get_mon_arrivals() %>%
dplyr::mutate(waiting_time = end_time - start_time - activity_time,
stay_time = end_time - start_time) stay_times <- resd %>%
dplyr::filter(start_time >= T0, end_time < T1) %>%
dplyr::select(stay_time) ER <- mean(stay_times[[1]])
ER.true <- 1/(mu-lambda) cat('模拟的平均逗留时间Ws=', ER,
' 期望值=', ER.true, '\n')
R计算结果
  cat('估计的平均逗留时间Ws=', ER,' 期望值=', ER.true, '\n')
模拟的平均逗留时间Ws=0.9900721 期望值= 1

3. R模拟可视化

mon1=get_mon_arrivals(bank)
head(mon1,6)
name start_time end_time activity_time finished replication
1 顾客0 2.501759 2.505050 0.003290978 TRUE 1
2 顾客1 2.748517 2.942109 0.193591292 TRUE 1
3 顾客2 4.491264 4.903304 0.412040757 TRUE 1
4 顾客3 4.581213 5.283519 0.380215150 TRUE 1
5 顾客4 4.783831 6.223558 0.940038339 TRUE 1
6 顾客5 5.621871 7.052889 0.829331192 TRUE 1
 mon = get_mon_resources(bank)
aggregate(cbind(server, queue) ~ resource, mon, mean)
library(ggplot2)
ggplot(mon, aes(x=server, fill=resource)) +
geom_histogram(binwidth = 0.5) +
facet_grid(.~resource, scales = 'free')

二、模拟仿真总结

随机服务系统在我们日常生活、工业生产、科学技术、军事领域中是经常遇到的随机模型,例如研究银行、理发店、商店、海关通道、高速路收费口等服务人员个数的设置和排队规则,研究计算机网络网关、移动网络的调度规则,等等。某些随机服务系统可以进行严格理论分析得到各种问题的理论解, 但是随机服务系统中存在大量随机因素,使得理论分析变得很困难以至于不可能。例如,即使是上面的银行服务问题可能的变化因素就包括:顾客到来用齐次泊松过程还是非齐次泊松过程,柜员有多少个,是否不同时间段柜员个数有变化,柜员服务时间服从什么样的分布,顾客排队按照什么规则,是否VIP顾客提前服务,顾客等候过长时会不会放弃排队,等等。 包含了这么多复杂因素的随机服务系统的理论分析会变得异常复杂,完全靠理论分析无法解决问题,可用随机模拟方法给出答案。

参考文献

1.(Simmer 2019带你飞 )[https://www.sohu.com/a/344940911_100040805]

2.(Simmer仿真平台高级使用技巧)[https://segmentfault.com/a/1190000019820794]

随机服务系统模拟—R实现(二)的更多相关文章

  1. SpringCloud-Eureka服务注册与发现(二)

    SpringCloud-Eureka服务注册与发现(二) https://www.cnblogs.com/qdhxhz/p/9357502.html https://blog.csdn.net/wei ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

  4. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  5. Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)

    一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...

  6. go语言游戏服务端开发(二)——网络通信

    一.网络层 网络游戏客户端除了全局登录使用http请求外,一般通过socket长连接与服务端保持连接.go语言的net包提供网络socket长连接相关操作. 对于服务端,一般经历 Listen.Acc ...

  7. WCF学习之旅—实现支持REST服务端应用(二十三)

    在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...

  8. 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)

    着手改造之前,有兴趣可以阅读下官方文档:http://help.adobe.com/zh_CN/air/extensions/index.html 新建工程 NavService 并创建包 nav.w ...

  9. Stochastic Gradient Descent 随机梯度下降法-R实现

    随机梯度下降法  [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 批量梯度下降法在权值更新前对所有样本汇总 ...

  10. 从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解

    缘起 哈喽大家好,又是周二了,时间很快,我的第二个系列DDD领域驱动设计讲解已经接近尾声了,除了今天的时间驱动EDA(也有可能是两篇),然后就是下一篇的事件回溯,就剩下最后的权限验证了,然后就完结了, ...

随机推荐

  1. Vue实现组件化的基本思路

    Vue.js(以下简称Vue)是时下流行的前端开发库,一般搭配其插件Vue-Router,Vuex一起使用,行业中称为Vue全家桶. Vue使用了MVVM的理念,将表现层(DOM)和数据层进行了分离, ...

  2. python 如何以逗号为分隔符输出数组

    l = [1,2,3,4] print(" ".join(str(i) for i in l)) #输出结果为:1 2 3 4(注意,此时4后面没有空格啦) #以逗号为分隔符 l ...

  3. 第14章 身份验证:使用Identity将用户添加到应用程序(ASP.NET Core in Action, 2nd Edition)

    本章包括 ASP.NET Core中web应用程序的身份验证工作原理 使用ASP.NET Core标识系统创建项目 向现有web应用添加用户功能 自定义默认ASP.NET Core标识UI 像ASPN ...

  4. 消息队列 RocketMQ4.x介绍和新概念讲解

    消息队列 RocketMQ4.x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件 RocketMQ4.x特点 支持Broker和Consumer端消 ...

  5. jsp第十周

    数据库test 中建个表 stu(stuid 主键 自动增长 ,用户名,密码,年龄) 1.设计一个注册页面,实现用户注册功能2.设计一个登陆页面,实现用户名密码登陆3.两个页面可以互相超链接 Base ...

  6. spring为什么默认单例模式

    单例bean的优势 由于不会每次都新创建新对象所以有一下几个性能上的优势. 1.减少了新生成实例的消耗 新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性 ...

  7. PHP做API开发该如何设计签名验证

    前言 开发过程中,我们经常会与接口打交道,有的时候是调取别人网站的接口,有的时候是为他人提供自己网站的接口,但是在这调取的过程中都离不开签名验证. 我们在设计签名验证的时候,请注意要满足以下几点: 可 ...

  8. python C# DES 加密转换

    import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...

  9. maven 生命周期的指令

    编译:mvn compile --src/main/java目录java源码编译生成class (target目录下) 测试:mvn test --src/test/java 目录编译 清理:mvn ...

  10. thread互斥测试

    thread互斥测试 实践代码 #include <stdio.h> #include <stdlib.h> #include <pthread.h> //linu ...