我想编写一个模拟代码,其中首先将所有到达的项目(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等执行相同的操作。
我想念什么?
谢谢您的帮助!
答案 0 :(得分:0)
我认为您的仿真模型可以正常工作。您有几个问题:
set_global("CountSubparts2", mod="+", -1)
来减少计数器。您将看到它一次下降,基本上是因为您已经在机器中设置了queue_size=0
,所以只有一个项目进入了模拟的结尾,其余的都被拒绝了。do_parallel
与wait=TRUE
确保第一个子部分等待其他子部分加工,然后只有原始到达部分到达最终操作员。因此,只需在轨迹的末尾添加set_global(paste0(item, "_reassembled"), mod="+", 1)
,您就可以开始了。