R慢火包装-如何处理零件拆卸/重新组装?

时间:2019-11-11 09:05:59

标签: r event-simulation

我想编写一个模拟代码,其中首先将所有到达的项目(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,然后在操作2之后减为0。在这里,CountSubparts2继续增加。 其次,我找不到一种方法可以明确地将Simmer告诉: “重新组装subpart1_A_processed和subpart2_A_processed。  对B,C等执行相同的操作。

我想念什么?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为您的仿真模型可以正常工作。您有几个问题:

  1. 第一个问题与计数器有关。您需要使用set_global("CountSubparts2", mod="+", -1)来减少计数器。您将看到它一次下降,基本上是因为您已经在机器中设置了queue_size=0,所以只有一个项目进入了模拟的结尾,其余的都被拒绝了。
  2. do_parallelwait=TRUE确保第一个子部分等待其他子部分加工,然后只有原始到达部分到达最终操作员。因此,只需在轨迹的末尾添加set_global(paste0(item, "_reassembled"), mod="+", 1),您就可以开始了。