首页 > 解决方案 > 使用 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)

任何人都可以帮助验证这种表示是否正确,我如何计算在这些状态中花费的时间?

一个部件故障和修复系统

标签: rsimulationevent-simulation

解决方案


我相当有信心我的陈述对于我发布的问题是正确的。

关于不可用性的计算,由于这是一个在故障和修复之间切换时没有时间损失的 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


推荐阅读