Пакет R simmer - как бороться с разборкой / сборкой деталей? - PullRequest
1 голос
/ 11 ноября 2019

Я хотел бы закодировать симуляцию, при которой все поступающие Предметы (A, B, C, ...) сначала разбираются на 2 части. Item1 подвергается OPERATION1 напрямую, а Item2 собирается в партии (размер = 4) перед обработкой с OPERATION2. После обработки я хочу, чтобы все части одного и того же элемента были повторно собраны, а не смешаны с частями из других элементов (т. Е. Подчасть 1 из А идет только с подчастью 2 из А).

Я пробовал параллельные задачи для разделениятраектории подчастей, а также попытались собрать все Items.subparts2 в пакете размером 4.

library(simmer)
library(simmer.plot)
library(simmer.bricks)

items <- LETTERS[1:10]

traj <- function(item) {
  trajectory() %>%
    visit("operator", 10, 1) %>%    # disassemble the incoming item 
    set_global(paste0("subpart1_", item), 1) %>%
    set_global(paste0("subpart2_", item), 1) %>%
    set_global("CountSubparts2", mod ="+", 1) %>%

    do_parallel(
      # OPERATION 1
      trajectory() %>%
        visit("Machine1", 150, 1) %>%
        set_global(paste0("subpart1_", item), 0) %>%
        set_global(paste0("subpart1_", item, "_processed"), 1)
      ,
      # OPERATION 2
      trajectory() %>%
        batch(n = 4, timeout = 0, name = "POOL_PARTS") %>%
        separate() %>%
        visit("Machine2", 200, 1) %>%
        set_global(paste0("subpart2_", item, "_processed"), 1)  %>%
        set_global("CountSubparts2", 0) 
      , .env = env, wait = TRUE
    ) %>%
    visit("operator", 10, 1)    # reassemble the items
}    

env <- simmer()
env %>%
  add_resource("operator", 1) %>%
  add_resource("Machine1", capacity = 1, queue_size = 0, 2) %>%
  add_resource("Machine2", capacity = 1, queue_size = 0, 1)

for (i in items) env %>%
  add_generator(i, traj(i), at(0), mon = 2)

env %>% run(1000)

ressources <- get_mon_resources(env)
ressources %>% plot(metric = "utilization")
ressources %>% plot(metric = "usage")

attributs <- env %>% get_mon_attributes()  
attributs  %>% plot(key = "CountSubparts2")

Проблема заключается в следующем: сначала я ожидал, что CountSubparts2 увеличится до 4, а затем уменьшится до 0 после ОПЕРАЦИИ 2Здесь CountSubparts2 продолжает расти. Во-вторых, я не могу найти способ явно сказать Симмеру: «Соберите subpart1_A_processed и subpart2_A_processed. Сделайте то же самое для B, C и т. Д.»

Что мне не хватает?

СпасибоВам за помощь!

1 Ответ

0 голосов
/ 15 ноября 2019

Я думаю, что ваша имитационная модель работает нормально. У вас есть пара проблем:

  1. Первая проблема связана со счетчиком. Вам нужно использовать set_global("CountSubparts2", mod="+", -1), чтобы уменьшить счетчик. Вы увидите, что он отключится один раз, в основном потому, что вы установили queue_size=0 на своих машинах, так что только один элемент доходит до конца симуляции, а остальные из них отклоняются.
  2. do_parallel с wait=TRUE гарантирует, что первая часть ожидает обработки другой, а затем только конечный оператор достигает только первоначального поступления. Так что просто добавьте set_global(paste0(item, "_reassembled"), mod="+", 1) в конце траектории, и все готово.
...