R语言Simmer仿真:轨迹外释放资源报错问题求助
解决方案:Simmer制造流程仿真的资源释放问题
问题根源
你之前使用clone()生成凝胶(gel)和色浆(millbase)轨迹的独立实例,再通过synchronize(wait=TRUE)同步时,这些clone实例会被销毁,导致后续释放资源时找不到对应的seize记录,触发“未被seized”错误。
修正后的仿真代码
核心思路是将凝胶、色浆的制备流程整合到同一个主轨迹的并行分支中,确保所有资源操作属于同一个实例,避免实例销毁导致的资源记录丢失:
library(simmer) # 初始化仿真环境,定义三类容器资源(各1个) env <- simmer("Manufacturing Process") %>% add_resource("gel_vessel", 1) %>% add_resource("millbase_vessel", 1) %>% add_resource("finalization_vessel", 1) # 定义主轨迹:整合所有制造步骤 main_trajectory <- trajectory() %>% # 并行执行凝胶制备和色浆制备,等待两者均完成 parallel( branches = list( # 凝胶分支:占用容器 → 制备1.5小时 → 等待同步 trajectory() %>% seize("gel_vessel") %>% timeout(1.5), # 色浆分支:占用容器 → 制备10小时 → 等待同步 trajectory() %>% seize("millbase_vessel") %>% timeout(10) ), wait = TRUE ) %>% # 进入最终制备步骤:占用finalization容器 seize("finalization_vessel") %>% # 泵送色浆(耗时1小时,此时millbase容器仍被占用) timeout(1) %>% # 释放色浆容器 release("millbase_vessel") %>% # 泵送凝胶(耗时1小时,此时gel容器仍被占用) timeout(1) %>% # 释放凝胶容器 release("gel_vessel") %>% # 添加液体(耗时5小时) timeout(5) %>% # 释放finalization容器 release("finalization_vessel") # 添加批次生成器(0时刻启动第一个批次) env <- env %>% add_generator("batch_", main_trajectory, at(0)) # 运行仿真并查看资源监控数据 env %>% run() %>% get_mon_resources()
关键逻辑说明
- 并行流程整合:用
parallel()替代clone(),让凝胶和色浆的制备成为同一个轨迹实例的并行分支,资源的seize/release操作归属同一实例,避免记录丢失。 - 约束满足:
parallel(wait=TRUE)确保最终制备(finalization)仅在凝胶和色浆均就绪后启动。- 凝胶/色浆容器在制备完成后不立即释放,直到对应泵送步骤完成后才执行
release,满足“容器保持seized直至泵送完成”的要求。
- 资源时间验证:
- 凝胶容器总占用时间:1.5h(制备)+1h(泵送)=2.5h
- 色浆容器总占用时间:10h(制备)+1h(泵送)=11h
- 最终制备容器总占用时间:1h(泵送色浆)+1h(泵送凝胶)+5h(添加液体)=7h
内容的提问来源于stack exchange,提问作者GaetanoDM
相关产品推荐
相关产品推荐

