在Simmer for R中集中资源-如何正确使用get_server_count

时间:2019-05-04 16:34:29

标签: r

我正在尝试创建一个模拟模型,以描述医院药房的分配过程。我考虑了3个主要活动,即验证,分发和最终检查。如何定义“合并资源”,即如果需要的话,使某些活动不仅可以诉诸一种资源,还可以诉诸两种资源?换句话说,如果没有最终检查者可用(因为他们在过程中被利用了),如果有的话,我如何允许药剂师执行此任务?

请参见下面的代码示例。我没有用任何方式通过轨迹中的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')"

这很奇怪,因为我相信我已经使用了“高级弹道用法”教程(https://cran.r-project.org/web/packages/simmer/vignettes/simmer-03-trajectories.html)中所述的select命令。

1 个答案:

答案 0 :(得分:0)

关于相关行:

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活动。

最后,大约selectsimmerdplyr都导出一个select函数。如果在dplyr之后加载simmer,则select指的是dplyr函数,您应将simmer的版本称为simmer::select。 / p>