我意识到在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
对此的任何见解都将非常感激。
答案 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