Моделирование дискретных событий (DES) с пакетом R simmer - PullRequest
1 голос
/ 19 марта 2020

Я пытаюсь изучить DES с помощью R для решения задачи оптимизации обслуживания. Однако я очень запутался, если это действительно хороший инструмент для этого.

В качестве начального испытания я разместил здесь очень простую проблему, когда компонент работает в состоянии 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)

Может ли кто-нибудь помочь проверить правильность этого представления и как я могу рассчитать время, проведенное в любом из этих состояния?

One component failure and repair system

1 Ответ

0 голосов
/ 21 марта 2020

Я довольно уверен, что мое представление верно для проблемы, которую я отправил.

Что касается расчета недоступности, так как это однокомпонентная система без потери времени при переключении между неисправностью и ремонтом, то недоступность можно легко рассчитать с помощью «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

...