Simmer R 程序包:建模 2 名到达时间恒定 Inter-Arrival 的患者
Simmer R package: Modeling 2 Patients Arriving with Constant Inter-Arrival Time
我意识到这里没有很多关于在 R 中使用 Simmer 包进行离散事件模拟的问题,但我已经浏览了所有的小插曲,找不到执行这个看似简单的任务的答案。
我想模拟 2 位顾客以随机、三角分布的方式签到,inter-arrival 时间恒定为 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)
此处的 'Many customers' 副标题:https://cran.r-project.org/web/packages/simmer/vignettes/D-bank-1.html#more-customers
是我用来获取上面代码的。
运行 上面的代码和检查到达时间显示上面的代码模拟了一个恒定的 inter-arrival 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
如有任何见解,我们将不胜感激。
我自己刚开始玩这个漂亮的包。你能不能只为相同的轨迹添加另一个 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
有 timeout
跟随一个随机的三角距离,而不是到达。还有一些关于组合单独轨迹的信息here。
在这种情况下,鉴于到达间隔时间是确定的,您可以设置另一个生成器 。但是,最通用的方法是插入最多 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
我意识到这里没有很多关于在 R 中使用 Simmer 包进行离散事件模拟的问题,但我已经浏览了所有的小插曲,找不到执行这个看似简单的任务的答案。
我想模拟 2 位顾客以随机、三角分布的方式签到,inter-arrival 时间恒定为 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)
此处的 'Many customers' 副标题:https://cran.r-project.org/web/packages/simmer/vignettes/D-bank-1.html#more-customers 是我用来获取上面代码的。
运行 上面的代码和检查到达时间显示上面的代码模拟了一个恒定的 inter-arrival 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
如有任何见解,我们将不胜感激。
我自己刚开始玩这个漂亮的包。你能不能只为相同的轨迹添加另一个 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
有 timeout
跟随一个随机的三角距离,而不是到达。还有一些关于组合单独轨迹的信息here。
在这种情况下,鉴于到达间隔时间是确定的,您可以设置另一个生成器 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