1

我想编写一个模拟代码,其中所有到达的项目(A、B、C、...)首先被分解成两部分。Item.subpart1 直接经历 OPERATION1,Item.subpart2 在被 OPERATION2 处理之前被批量收集(大小 = 4)。处理后,我希望重新组装同一项目的所有部分,而不是与其他项目的部分混合(即,来自 A 的 subpart1 仅与来自 A 的 subpart2 一起使用)。

我尝试了并行任务来拆分子部分轨迹,还尝试以 4 的批次收集所有 Items.subparts2。

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,然后在 OPERATION 2 之后减少到 0。这里,CountSubparts2 不断增加。其次,我找不到明确告诉 simmer 的方法:“重新组装 subpart1_A_processed 和 subpart2_A_processed。对 B、C 等做同样的事情。”

我错过了什么?

谢谢您的帮助 !

4

1 回答 1

0

我认为你的模拟模型工作正常。你有几个问题:

  1. 第一个问题是柜台。您需要使用set_global("CountSubparts2", mod="+", -1)递减计数器。你会看到它下降一次,基本上是因为你已经queue_size=0在你的机器中设置了,所以只有一个项目能够完成模拟,其余的都被拒绝。
  2. do_parallelwithwait=TRUE确保第一个子零件等待另一个子零件加工,然后只有原始到达的零件到达最终操作员。所以只需set_global(paste0(item, "_reassembled"), mod="+", 1)在轨迹的末尾添加就可以了。
于 2019-11-15T11:17:37.337 回答