【问题标题】:How to write loop in trajectory of Simmer package如何在 Simmer 包的轨迹中编写循环
【发布时间】:2017-10-19 18:35:56
【问题描述】:

我试图使用 R 的 Simmer 包模拟排队网络。但是,我在主轨迹中加入循环时遇到了麻烦。一个简单的单节点队列代码如下:

to_queue_1 <- trajectory() %>%
for(i in 1:100){
   seize("nurse", 1) %>%
  timeout(1) %>%
   release("nurse", 1)
 }

env <- simmer()
add_resource("nurse",1)
env %>%
add_generator("arrival1_", to_queue_1, function() rexp(1, 1),mon=2) %>%
run(200)

运行轨迹函数后,它显示“错误 in for (.in i) 1:100 : 4 个参数传递给 'for' 需要 3”。

实际的网络更复杂,需要不同节点通信的循环。例如,我希望节点 1 流向节点 2 和节点 3。节点 2 流向节点 1 和 3。节点 3 流向节点 1 和 2。唯一可能的出口是节点 3。

提前致谢。

【问题讨论】:

    标签: r loops queue simulation


    【解决方案1】:

    rollback 活动用于此目的:

    library(simmer)
    
    to_queue_1 <- trajectory() %>%
      seize("nurse", 1) %>%
      timeout(1) %>%
      release("nurse", 1) %>%
      rollback(3, 100)
    
    env <- simmer() %>%
      add_resource("nurse",1) %>%
      add_generator("arrival1_", to_queue_1, function() rexp(1, 1), mon=2) %>%
      run(200)
    

    其中3 是要回滚的活动数,100 是重复次数。

    【讨论】:

    • 感谢您的回复。但是,是否可以在 rollback() 中有函数参数?比如释放“nurse”后,我抓住“doctor”,释放“doctor”。之后,我可能不想使用回滚(3,100),而是以概率 p 回滚(1~3,1),以概率 q 回滚(4~6,1),以概率 1-p-q 退出。本质上,这是一个护士-医生串联队列,而医生可以有一定的概率将病人送回护士。
    • rollback 活动有一个可选参数check,它会覆盖第二个参数times(如果存在),因此每次到达rollback 时,都会检查它是否应该返回或不。如果您需要根据某个概率回滚不同数量的活动,您可以使用branch 并在其中放置多个rollback
    • 非常感谢!我会检查的!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多