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

如何解决AnyLogic中“Exception during discrete event execution root.storeRawMaterial: No available cells in [storage]”错误?

解决AnyLogic中No available cells in [storage]异常问题

核心问题分析

你遇到的异常本质是存储对象的实际可用单元数与视觉/配置值不匹配,可能由物理尺寸冲突、并发逻辑错误、状态初始化异常等原因导致。以下是针对性解决方案:


  • 核对存储单元与实体的尺寸匹配
    打开storage(如Rack/Storage)的属性面板,确保Cell dimensions的宽/高/深参数,和你存放的RawMaterial实体的Size完全一致。如果实体尺寸大于单个单元,会隐性占用多个单元,但视觉上仅显示一个,造成“视觉未满但无可用单元”的矛盾。

  • 修复存储操作的并发竞态问题
    多实体同时执行storeRawMaterial动作时,可能出现竞态条件:两个实体同时检测到有可用单元,但实际存储时已被占用。给存储逻辑加同步锁:

    synchronized(storage) {
        if(storage.freeCells() > 0) {
            storage.store(rawMaterialEntity);
        } else {
            // 可选:将实体暂存到Queue,避免直接报错
            rawMaterialQueue.add(rawMaterialEntity);
        }
    }
    
  • 重置存储对象的初始状态
    模型启动时存储单元可能存在隐性占用(视觉不可见),手动重置状态:

    storage.clear();
    // 针对Rack类型,逐层重置单元状态
    for(int level = 0; level < storage.getNumLevels(); level++) {
        for(int cell = 0; cell < storage.getNumCellsPerLevel(); cell++) {
            storage.setCellOccupied(level, cell, false);
        }
    }
    
  • 检查容量计算的自定义逻辑
    如果你通过代码修改过storage.getCapacity()或相关属性,会导致配置的存储位和实际可用单元数不符。确保存储对象的Capacity属性是直接设置的数值,没有被其他代码覆盖。

  • 验证实体的存储与释放链路
    添加实时统计(比如用Text组件显示storage.occupiedCells()),对比视觉上的实体数量。如果统计数值远大于视觉数量,说明有实体未被正确释放(比如storage.take()动作缺失或执行失败),需要排查释放逻辑的触发条件。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 23:27:39