随机服务系统模拟—R实现(二)
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实现(二)的更多相关文章
- SpringCloud-Eureka服务注册与发现(二)
SpringCloud-Eureka服务注册与发现(二) https://www.cnblogs.com/qdhxhz/p/9357502.html https://blog.csdn.net/wei ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...
- .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...
- Linux下多进程服务端客户端模型二(粘包问题与一种解决方法)
一.Linux发送网络消息的过程 (1) 应用程序调用write()将消息发送到内核中 ( 2)内核中的缓存达到了固定长度数据后,一般是SO_SNDBUF,将发送到TCP协议层 (3)IP层从TCP层 ...
- go语言游戏服务端开发(二)——网络通信
一.网络层 网络游戏客户端除了全局登录使用http请求外,一般通过socket长连接与服务端保持连接.go语言的net包提供网络socket长连接相关操作. 对于服务端,一般经历 Listen.Acc ...
- WCF学习之旅—实现支持REST服务端应用(二十三)
在上一篇(WCF学习之旅—实现REST服务(二十二))文章中简单介绍了一下RestFul与WCF支持RestFul所提供的方法,本文讲解一下如何创建一个支持REST的WCF服务端程序. 四.在WCF中 ...
- 通过 ANE(Adobe Native Extension) 启动Andriod服务 推送消息(二)
着手改造之前,有兴趣可以阅读下官方文档:http://help.adobe.com/zh_CN/air/extensions/index.html 新建工程 NavService 并创建包 nav.w ...
- Stochastic Gradient Descent 随机梯度下降法-R实现
随机梯度下降法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. 批量梯度下降法在权值更新前对所有样本汇总 ...
- 从壹开始微服务 [ DDD ] 之十二 ║ 核心篇【下】:事件驱动EDA 详解
缘起 哈喽大家好,又是周二了,时间很快,我的第二个系列DDD领域驱动设计讲解已经接近尾声了,除了今天的时间驱动EDA(也有可能是两篇),然后就是下一篇的事件回溯,就剩下最后的权限验证了,然后就完结了, ...
随机推荐
- 【APT】海莲花组织DLL样本分析
前言 样本来源Twitter,之前的文章已经完整分析过一个类似的DLL样本,这次做个简单记录. 样本分析 样本信息如下: DLL文件共有40个导出函数: 导出函数内容基本一致,恶意代码都在DllMai ...
- python-sqlite数据库锁定
sqlite3.OperationalError: database is locked 因为sqlite只支持单线程操作,如果此时打开数据库就会出现这个问题
- webpack配置跨域proxy
首先新建一个项目: 安装vue-cli: npm i -g @vue/cli npm i -g @vue/cli-init 安装webpack: npm install webpack -g vue新 ...
- linux下python程序部署
1.安装python 2.安装virtualenv https://blog.csdn.net/mulangren1988/article/details/59106682 3.指定virtualen ...
- APK 跳转其他APK
+import android.content.ComponentName;^M /* @@ -343,6 +346,15 @@ public class MainActivity extends A ...
- remove blank line
[$ cat all.experiments.csv.clean|sed -r '/^\s*$/d' > all.experiments.csv.clean2
- Asp.net MVC5中没有BundleConfig.cs-MVC学习笔记(一)
创建ASP.NET MVC5项目时,选择了空项目,在App_Start文件夹中没有默认创建了BudleConfig.cs文件. 下面就来手动添加 在NuGet中搜索Microsoft.AspNet.W ...
- 将spring boot项目打包成jar包
在spring boot项目的pom文件中加入 <packaging>jar</packaging> 生成jar包 文件右键Open In Explorer找到文件所在位置 可 ...
- GO语言http请求方法,可以携带请求头Header与cookie
1.目录 2.main.go package main import "fmt" import "demo/common/http" func main() { ...
- I - Cloud Retainer's Game
I - Cloud Retainer's Game 传送门: I. Cloud Retainer's Game (codeforces.com) 题意: 在坐标轴上有2个边界:y=0和y=H.有n个质 ...