0

我意识到这里没有很多关于在 R 中使用 Simmer 包进行离散事件模拟的问题,但是我已经浏览了所有的小插曲,找不到执行这个看似简单的任务的答案。

我想模拟 2 位客户以随机的、三角形分布的签到方式到达,到达时间恒定为 10 分钟。这是我使用 simmer 创建的轨迹:

 library(simmer)
 traj <- trajectory("admin") %>%
    seize("check_in") %>% 
    timeout(function() rtriangle(a=1, b=3, c=2)) %>% 
    release("check_in")

outpat_clinic <- simmer() %>%
 add_generator("customer", traj, function(){c(0,rep(20,5),-1)}) %>%
 add_resource("check_in", 1)

这里的“许多客户”子标题:https ://cran.r-project.org/web/packages/simmer/vignettes/D-bank-1.html#more-customers 是我用来获取上述代码的内容。

运行上面的代码并检查到达时间,上面的代码模拟了一个恒定的 20 分钟的到达间隔时间,但不具有 2 个患者在那个时间到达的特性。我不确定如何创建一个函数来反映这一点。

运行模型会给我以下输出:

run(clinic, 100)
get_mon_arrivals(clinic)

       name start_time  end_time activity_time finished replication
1 customer0          0  1.623746      1.623746     TRUE           1
2 customer1         20 22.336749      2.336749     TRUE           1
3 customer2         40 42.216531      2.216531     TRUE           1
4 customer3         60 62.019354      2.019354     TRUE           1
5 customer4         80 81.995766      1.995766     TRUE           1

对此的任何见解将不胜感激。

4

2 回答 2

2

在这种情况下,鉴于到达间隔时间是确定性的,您可以按照 reukil 的建议设置另一个生成器。但是,最常用的方法是,n-1如果您想批量生成n. 例如,3 个客户随机到达:

library(simmer)

traj <- trajectory() %>%
  timeout(1)

simmer() %>%
  add_generator("dummy", traj, function() c(rexp(1, 1), 0, 0)) %>%
  run(4) %>%
  get_mon_arrivals()

#>     name start_time end_time activity_time finished replication
#> 1 dummy0  0.4226528 1.422653             1     TRUE           1
#> 2 dummy1  0.4226528 1.422653             1     TRUE           1
#> 3 dummy2  0.4226528 1.422653             1     TRUE           1
#> 4 dummy3  2.4100059 3.410006             1     TRUE           1
#> 5 dummy4  2.4100059 3.410006             1     TRUE           1
#> 6 dummy5  2.4100059 3.410006             1     TRUE           1
#> 7 dummy6  2.6899432 3.689943             1     TRUE           1
#> 8 dummy7  2.6899432 3.689943             1     TRUE           1
#> 9 dummy8  2.6899432 3.689943             1     TRUE           1

当然,批量大小也可以是随机的:

simmer() %>%
  add_generator("dummy", traj, function() c(rexp(1, 1), rep(0, rpois(1, 2)))) %>%
  run(4) %>%
  get_mon_arrivals()

#>     name start_time end_time activity_time finished replication
#> 1 dummy0  0.6791102  1.67911             1     TRUE           1
#> 2 dummy1  2.7856000  3.78560             1     TRUE           1
#> 3 dummy2  2.7856000  3.78560             1     TRUE           1
#> 4 dummy3  2.7856000  3.78560             1     TRUE           1
于 2017-04-16T17:47:20.357 回答
2

我自己刚开始玩这个漂亮的包。你能不能只包括另一个add_generator相同的轨迹?

# with inter-arrival time = 10 mins
clinic <- simmer() %>%
 add_generator("customer_1", traj, function(){c(0,rep(10,5),-1)}) %>%
 add_generator("customer_2", traj, function(){c(0,rep(10,5),-1)}) %>%
 add_resource("check_in", 1)

输出:

          name start_time  end_time activity_time finished replication
1  customer_10          0  2.391233      2.391233     TRUE           1
2  customer_20          0  4.699580      2.308347     TRUE           1
3  customer_11         10 11.700081      1.700081     TRUE           1
4  customer_21         10 13.459180      1.759099     TRUE           1
5  customer_12         20 21.723494      1.723494     TRUE           1
6  customer_22         20 23.515589      1.792095     TRUE           1
7  customer_13         30 31.279699      1.279699     TRUE           1
8  customer_23         30 32.797642      1.517943     TRUE           1
9  customer_14         40 41.730055      1.730055     TRUE           1
10 customer_24         40 43.690247      1.960192     TRUE           1
11 customer_15         50 52.748773      2.748773     TRUE           1
12 customer_25         50 53.986411      1.237638     TRUE           1

另外我认为你trajectorytimeout以下随机三角分布,而不是到达。这里还有一些关于组合单独轨迹的信息。

于 2017-04-11T12:15:30.537 回答