【问题标题】:R Simmer - Using set_attribute and get_attribute and replication (using lapply)R Simmer - 使用 set_attribute 和 get_attribute 和复制(使用 lapply)
【发布时间】:2018-06-02 15:52:07
【问题描述】:

我正在尝试结合 set_attribute 和 get_attribute 复制(使用 lapply) 以下没有“get_attribute”的代码运行良好:

library(simmer)    

SystemTime <- 200
delay= c(20,40,60,80,100,120,140,160,180,200)/60
set.seed(1234)

elevators <- simmer()

worker <-
  trajectory("elevators service") %>% #trajectory name
  log_("new worker arrived") %>% #
  set_attribute("start_time", function() {now(elevators)}) %>%
  seize("elevator",amount = 1) %>% #elevator queue and service 
  timeout(function() sample(delay,1)) %>%
  release("elevator") 


elevators <-lapply(1:100, function(i) {
  simmer("elevators") %>%
  add_generator("worker", worker, function() exp(2)) %>% 
    add_resource("elevator",capacity = 2) %>% 
  run(until = SystemTime)

})

当我像下面这样添加“get_attribute”时:

library(simmer) 

SystemTime <- 200
delay= c(20,40,60,80,100,120,140,160,180,200)/60
set.seed(1234)

elevators <- simmer()

worker <-
  trajectory("elevators service") %>% #trajectory name
  log_("new worker arrived") %>% #
  set_attribute("start_time", function() {now(elevators)}) %>%
  seize("elevator",amount = 1) %>% #elevator queue and service 
  timeout(function() sample(delay,1)) %>%
  log_(function() {paste("Waited: ", now(elevators) - get_attribute(elevators, "start_time"))}) %>%
  release("elevator") 


elevators <-lapply(1:100, function(i) {
  simmer("elevators") %>%
  add_generator("worker", worker, function() exp(2)) %>% 
    add_resource("elevator",capacity = 2) %>% 
  run(until = SystemTime)

})

我收到以下错误:

run_(private$sim_obj, until) 中的错误:评估错误:存在 没有到达运行。

寻求有关如何解决此问题的帮助?

【问题讨论】:

  • Dor,我对您的问题做了一些简单的修改。作为新用户,您显然花费了时间和精力来学习使用这些工具发布 SO 问题。做得好。我希望你能得到你想要的答案。

标签: r


【解决方案1】:

您的第一个示例运行没有错误,但实际上运行不佳。基本上,你有一个范围问题。模拟环境必须在轨迹范围内,这样get_attribute(和now)才能看到。解决方案是将所有内容放在同一个函数中:

library(simmer) 

SystemTime <- 200
delay= c(20,40,60,80,100,120,140,160,180,200)/60
set.seed(1234)

elevators <-lapply(1:100, function(i) {
  elevator <- simmer("elevator")

  worker <-
    trajectory("elevator service") %>% #trajectory name
    log_("new worker arrived") %>% #
    set_attribute("start_time", function() {now(elevator)}) %>%
    seize("elevator",amount = 1) %>% #elevator queue and service 
    timeout(function() sample(delay,1)) %>%
    log_(function() {paste("Waited: ", now(elevator) - get_attribute(elevator, "start_time"))}) %>%
    release("elevator") 

  elevator %>%
    add_generator("worker", worker, function() rexp(1, 2)) %>% 
    add_resource("elevator", capacity = 2) %>% 
    run(until = SystemTime)
})

另请注意,我在您的生成器中将 exp(2) 替换为 rexp(1, 2),我认为这是您真正想要的。

【讨论】:

  • 您好,感谢您的快速回复,非常有用。
  • 你知道如何将属性值插入数据框吗?
  • 例如,我如何为每个复制存储 get_mon_resources(env) ?
  • 关于属性,在add_generator中设置mon=2为你想保存属性的人,用get_mon_attributes检索。关于复制,get_mon_resources,以及get_mon_arrivalsget_mon_attributes,也适用于模拟环境列表。因此,您可以在我之前的回复中使用get_mon_resources(elevators) 获取它们。
  • 谢谢!,它的工作原理,但语句“function() {now(elevator)}”没有给我价值。
猜你喜欢
  • 2018-12-15
  • 2016-09-29
  • 2013-02-14
  • 1970-01-01
  • 2022-07-30
  • 2017-09-01
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多