Пакет 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
Другие вопросы по тегам