You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()

关键逻辑说明

  1. 并行流程整合:用parallel()替代clone(),让凝胶和色浆的制备成为同一个轨迹实例的并行分支,资源的seize/release操作归属同一实例,避免记录丢失。
  2. 约束满足:
    • parallel(wait=TRUE)确保最终制备(finalization)仅在凝胶和色浆均就绪后启动。
    • 凝胶/色浆容器在制备完成后不立即释放,直到对应泵送步骤完成后才执行release,满足“容器保持seized直至泵送完成”的要求。
  3. 资源时间验证:
    • 凝胶容器总占用时间:1.5h(制备)+1h(泵送)=2.5h
    • 色浆容器总占用时间:10h(制备)+1h(泵送)=11h
    • 最终制备容器总占用时间:1h(泵送色浆)+1h(泵送凝胶)+5h(添加液体)=7h

内容的提问来源于stack exchange,提问作者GaetanoDM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:20:57