一个加油站有一个加油桩,没有空间供车辆等待(如果车辆到达,加油桩被占用,它就会离开)。
车辆到达加油站的速率服从泊松过程λ=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)) +
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!