原文链接: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)) +
最受欢迎的见解
4.R语言中的马尔科夫机制转换(Markov regime switching)模型
9.用机器学习识别不断变化的股市状况——隐马尔可夫模型的应用