Simmer R包:模拟2名患者到达时间不变的到达时间

时间:2017-03-27 23:26:52

标签: r event-simulation

我意识到在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

对此的任何见解都将非常感激。

2 个答案:

答案 0 :(得分: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

此外,我认为您的trajectory跟随随机的triangualar dist timeout,而不是到达。关于组合不同的轨迹,还有一些信息here

答案 1 :(得分:2)

在这种情况下,假设到达间隔时间是确定性的,您可以设置另一个生成器as reukil suggests。但是,最常见的方法是,如果要生成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