如何解决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
相关产品推荐
相关产品推荐

