Как добиться, чтобы в системе было только определенное количество событий (используя пакет simmer R)? - PullRequest
0 голосов
/ 01 октября 2019

Я просто хочу смоделировать систему ремонта машины. Вход: 5 машин, которые запускают события простоя, 2 ремонтника, имеющие дело с событиями простоя

Примечание: если машина выключена (не работает из-за сбоя), функция add_generator не должна генерировать события простоя"больше, потому что машина уже вышла из строя / сломана (и, следовательно, не может генерировать какие-либо события простоя!).

Вот мой простой подход (он работает, но без ограничения, упомянутого выше):

```
library(simmer)

set.seed(42)

env <- simmer("andi_simu") %>% add_global("cnt",0)
env

cnt<-0
NUM_MACHINES<-6 # equals: max. number of down machines! (obviously)
BREAK_MEAN<-1/20 # 20 = MTTF
NUM_ENGINEERS<-3
REPAIR_TIME<-1.3 # in hours
engineers <- paste0("engineer", 1:NUM_ENGINEERS-1)

downevent <- trajectory("downevents' path") %>%
    ## add an intake activity 
    select(engineers, policy = "random") %>%
    set_attribute("start_time", function() {now(env)}) %>%
    seize_selected(1) %>%
    log_(function() {paste("Waited: ", now(env) - get_attribute(env, "start_time"))}) %>%
    timeout(function() rexp(1,REPAIR_TIME)) %>%
    release_selected(1)

for (i in engineers) env %>%
  add_resource(i, 1, 0) #, preemptive = TRUE) %>%

env %>%
  add_generator("downevent",downevent,function() rexp(1,BREAK_MEAN*NUM_MACHINES))

env %>% 
  run(80) %>%
  now()


result <-
  env %>%
  get_mon_arrivals() %>%
  transform(waiting_time = end_time - start_time - activity_time)

print(paste("Mean waiting time: ", mean(result$waiting_time)))
```

Буду признателен за любую подсказку, как это сделать! Спасибо, Андреас

1 Ответ

0 голосов
/ 04 октября 2019

Я бы настроил дополнительный ресурс с capacity=NUM_MACHINES и queue_size=0, чтобы гарантировать, что существует только один активный сбой на машину (дополнительные события просто будут отброшены). Конечно, вы должны захватить этот ресурс до захвата инженера.

...