拓端tecdat|R语言连续时间马尔可夫链模拟案例 Markov Chains
原文链接:http://tecdat.cn/?p=4182
案例
一个加油站有一个加油桩,没有空间供车辆等待(如果车辆到达,加油桩被占用,它就会离开)。车辆到达加油站的速率服从泊松过程λ=3/20每分钟,其中75%是汽车,25%是摩托车。加油时间可以用一个指数随机变量建模,平均汽车8分钟,摩托车3分钟,服务速率为汽车μC= 1 / 8和摩托车μ= 1 / 3 每分钟。
因此,我们可以通过将这些概率乘以每个状态下的车辆数量来计算系统中的平均车辆数量。
-
# 到达率
-
lambda <- 3/20
-
# 服务速率(汽车,摩托车)
-
mu <- c(1/8, 1/3)
-
# 汽车的概率
-
p <- 0.75
-
-
#理论解析
-
A <- matrix(c(1, mu[1], 0,
-
1, -lambda, (1-p)*lambda,
-
-
N_average_theor
-
#> [1] 0.5031056
现在,我们将模拟系统并验证
-
optio<-
-
-
seize("pump", amount=1) %>%
-
timeout(function() rexp(1, mu[1])) %>%
-
release("pump", amount=1)
-
为了区分汽车和摩托车,我们可以在获取资源后定义一个分支来选择合适的服务时间。
这option.3相当于option.1性能。 例如,
-
opti2 <- function(t) {
-
-
seize("pump", amount=1) %>%
-
branch(function() sample(c(1, 2), 1, prob=c(p, 1-p)), c(T, T),
-
trajectory("car")
-
timeout(function() rexp(1, mu[2]))) %>
但是此选项增加了不必要的运算,因为需要额外调用R函数来选择分支,因此会降低性能。更好的选择是直接在timeout
函数内部选择服务时间。
-
optio3 <- function(t) {
-
vehicle <- trajectory() %>%
-
seize("pump", amount=1) %>%
-
if (runif(1) < p) rexp(1, mu[1]) # 汽车
-
else rexp(1, mu[2]) # 摩托车
-
}) %>%
这option.3
等效option.1
于性能。但是,我们得出了相同的结果。例如,
-
-
# 使用率+理论值
-
plot(get_mon_resources(gas.station), "usage", "pump", items="system") +
-
geom_hline(yintercept=N_average_theor)
这些是一些表现的结果:
-
-
t <- 1000/lambda
-
tm <- microbenchmark(option.1(t),
-
-
-
-
autoplot(tm) +
-
scale_y_log10(breaks=function(limits) pretty(limits, 5)) +
最受欢迎的见解
▍关注我们
【大数据部落】第三方数据服务提供商,提供全面的统计分析与数据挖掘咨询服务,为客户定制个性化的数据解决方案与行业报告等。
▍咨询链接:http://y0.cn/teradat
▍联系邮箱:3025393450@qq.com