【问题标题】:pooled resources in Simmer for R - how to use get_server_count correctlySimmer for R 中的资源池 - 如何正确使用 get_server_count
【发布时间】:2019-05-04 16:34:28
【问题描述】:

我正在尝试创建一个模拟模型来描述医院药房的配药过程。我考虑了 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) 中描述的选择命令。

【问题讨论】:

  • 把上面的轨迹改成

标签: r


【解决方案1】:

关于相关线路:

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 函数。如果你在simmer之后加载dplyrselect指的是dplyr函数,你应该调用simmer的版本为simmer::select

【讨论】:

  • 感谢您查看代码和提供帮助的 cmets,Iñaki。我会尽量确保更频繁地使用匿名函数。也感谢您创建了 Simmer。
  • 我还会留意几个包使用的命令。在上面的示例和我用于模型(未显示)的代码中使用 simmer::select 就可以了!
猜你喜欢
  • 2022-07-30
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 1970-01-01
  • 2018-12-22
  • 2019-08-05
相关资源
最近更新 更多