Пакет Simmer R: моделирование 2 пациентов, прибывающих с постоянным временем прибытия
Я понимаю, что здесь не так много вопросов об использовании пакета Simmer для моделирования дискретных событий в R, но я прошел через все виньетки и не могу найти ответ для выполнения этой, казалось бы, простой задачи.
Я хотел бы смоделировать 2 клиентов, прибывающих на случайную, треугольно распределенную регистрацию, с постоянным временем прибытия 10 минут. Вот траектория, которую я создал, используя симмер:
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 Это то, что я использовал, чтобы получить код выше.
Выполнение вышеуказанного кода и проверка времени прибытия показывает, что приведенный выше код имитирует постоянное время между прибытиями 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 ответа
Я только начал играть с этим отличным пакетом. Не могли бы вы просто включить другой 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
после случайного триангулярного расст., а не заезда. Здесь также есть некоторая информация о комбинировании отдельных траекторий.
В этом случае, учитывая, что времена взаимодействия являются детерминированными, вы можете установить другой генератор, как предлагает 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