ресурсы пула в Simmer for R - как правильно использовать get_server_count - PullRequest
1 голос
/ 04 мая 2019

Я пытаюсь создать имитационную модель, которая описывает процесс выдачи в аптеке больницы.Я рассматриваю три основных вида деятельности: проверка, выдача и окончательная проверка.Как я смогу определить «объединенный ресурс», то есть предусмотреть для определенных действий возможность использовать не только один, но и два типа ресурсов, если это необходимо?Другими словами, если нет доступных окончательных контролеров (потому что они используются в процессе), как я мог бы разрешить фармацевтам выполнять эту задачу, если они доступны?

См. Пример кода ниже.Мне никак не удавалось получить доступ к количеству доступных в данный момент ресурсов времени с помощью get_server_count в траектории.Я обычно получаю сообщения об ошибках в виде:

Error in UseMethod("get_server_count") : 
  no applicable method for 'get_server_count' applied to an object of class "character"

Я также пытался использовать оператор if в траектории, чтобы разрешить использование резервного ресурса, если основной ресурс недоступен.Это привело меня к тому же и другому сообщению:

In if (.) get_server_count("dispenser") > 0 else { :
  the condition has length > 1 and only the first element will be used

См. Пример кода:

library(simmer)
library(dplyr)

set.seed(42)

#Defining Simmer environment:
pharmacy <- simmer("Dispensing Process")

#Defining 3 activities, i.e. verifying, dispensing, and final checking, and their
#durations:
dispProcess <- trajectory("dispensing process") %>% 
  seize("pharmacist", 1) %>%
  timeout(5) %>% 
  release("pharmacist", 1) %>%
  log_(get_server_count("dispenser")) %>%
  seize("dispenser", 1) %>%
  timeout(15) %>% 
  release("dispenser", 1) %>%
  seize("final checker", 1) %>%
  timeout(5) %>% 
  release("final checker", 1) 

#Defining number of resources (i.e. staff) available:
pharmacy %>% 
  add_resource("pharmacist", 2) %>% 
  add_resource("dispenser", 4) %>% 
  add_resource("final checker", 2) %>% 
  add_generator("prescription", dispProcess, function() {10}, mon = 2)

#Defining length of simulation run:
pharmacy %>% run(until = 400)

pharmacy %>% get_mon_arrivals() %>% print()

С кодом, приведенным выше, я ожидал бы количество бесплатных ресурсов "распределителя"в этот момент времени моделирования, которое будет показано.Этого не произошло, как описано выше.

Как я могу получить доступ к этой информации в траектории?Могу ли я использовать оператор if для захвата определенных типов ресурсов в зависимости от их доступности?

При обмене кода траектории на

dispProcess <- trajectory("dispensing process") %>% 
  seize("pharmacist", 1) %>%
  timeout(5) %>% 
  release("pharmacist", 1) %>%
  log_(get_server_count("dispenser")) %>%
  seize("dispenser", 1) %>%
  timeout(15) %>% 
  release("dispenser", 1) %>%
  select(resources = c("pharmacist","final checker"), policy = "shortest-queue") %>%
  seize_selected(amount = 1) %>%
  timeout(5) %>% 
  release_selected(amount = 1) 

появилось следующее сообщение об ошибке:

Error in UseMethod("select_") : no applicable method for 'select_' applied to an object of class "c('trajectory', 'R6')"

Это странно, поскольку, как мне кажется, я использовал команду select, как описано в руководстве по расширенному использованию траектории (https://cran.r -project.org / web / packages / simmer / vignettes / simmer-03-trajectories.html ).

1 Ответ

0 голосов
/ 06 мая 2019

О соответствующей строке:

log_(get_server_count("dispenser")) %>%
  1. См. Страницу справки для get_server_count.Требуется два аргумента: 1) среда моделирования и 2) имя ресурса.Вы указали только имя ресурса.
  2. Эта строка выполняет функцию немедленно, но вам необходимо указать имя функции (или анонимной функции), которая будет выполняться во время симуляции.
  3. Вывод get_server_count является числовым, что задокументировано, но для действия log_ требуется строка, поэтому вам необходимо преобразовать ее.

Соединяя 1: 3, строка должна прочитатьследующим образом:

log_(function() paste(get_server_count(pharmacy, "dispenser"))) %>%

В операторе if операторы управления нельзя использовать на уровне активности.Если вам нужны разные пути в зависимости от какого-либо условия, см. Действие branch.

Наконец, о select, оба simmer и dplyr экспортируют функцию select.Если вы загружаете dplyr после simmer, select относится к функции dplyr, и вам следует назвать версию simmer как simmer::select.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...