r - 使用 R simmer 包的离散事件模拟 (DES)
问题描述
我正在尝试用 R 学习 DES 来解决维护优化问题。但是,如果它实际上是一个很好的工具,我会感到非常困惑。
作为初步试验,我在这里发布了一个非常简单的问题,其中组件在状态 0 下运行,在状态 1 下失败,如图所示。故障和修复时间都呈指数分布,分别与相关比率 $\lambda$ 和 $\mu$。
我的目标是找出系统的不可用性,即系统在故障状态 (1) 上花费的时间,如图所示。
我用 simmer 设置模型如下(可重现):
library(simmer)
library(simmer.plot)
library(magrittr)
set.seed(1234)
env.fr <- simmer("FailureRepair")
lambda <- 1/1000
mu <- 1/10
traj <- trajectory() %>%
seize("Repairman") %>%
timeout(function() rexp(1, mu)) %>%
release("Repairman")
env.fr %>%
add_resource("Repairman", queue_size = Inf) %>%
add_generator("failure", traj, function() rexp(1, lambda)) %>%
run(until = 10000000)
任何人都可以帮助验证这种表示是否正确,我如何计算在这些状态中花费的时间?
解决方案
我相当有信心我的陈述对于我发布的问题是正确的。
关于不可用性的计算,由于这是一个在故障和修复之间切换时没有时间损失的 1 组件系统,因此可以使用“activity_time”轻松计算不可用性。这是资源被占用的时间。
env.fr <- simmer("FailureRepair")
MTTF <- 1000
MTTR <- 10
lambda <- 1/MTTF # Failure rate
mu <- 1/MTTR # Repair rate
traj <- trajectory() %>%
seize("Repairman") %>%
timeout(function() rexp(1, mu)) %>%
release("Repairman")
env.fr %>%
add_resource("Repairman", queue_size = Inf) %>%
add_generator("failure", traj, function() rexp(1, lambda)) %>%
run(until = 1000000)
# Calculations of unavailability
aggregate(cbind(server, queue) ~ resource, get_mon_resources(env.fr), mean)
a <- env.fr %>% get_mon_arrivals()
uSim <- sum(a$activity_time)/1000000 # Calculating unavailability from the simulation
uAnaly <- MTTR/(MTTF + MTTR) # Analytical solution
推荐阅读
- php - 在 WordPress 中使用 MediaElement.JS
- angular - 在 ngrx 选择器中使用管道
- java - 将 JSON 转换为 POJO 时应该出现 POJO 类吗?
- regex - 正则表达式忽略捕获句子的开头和结尾,但忽略中间
- image - 在 Colab 中,为什么图像在相同的代码单元中时不显示在执行的文件中?
- javascript - 如何改进我在 JavaScript 中的验证?
- laravel - 使用 laravel 护照令牌保护网络路由
- c++ - 一次性使用类成员变量的内存使用
- node.js - ReactJS 不使用 socket.io 与 NodeJS API 连接
- php - 在远程 API 回复后关闭和重新打开 mysql 连接