OptaPlanner启用GIZMO时出现克隆损坏问题求助
OptaPlanner GIZMO域访问下克隆异常排查
环境与问题现象
- 环境:OptaPlanner 9.44.0 + Java 11 + Windows 11
- 核心问题:常规域访问时系统运行正常,启用GIZMO域访问后抛出克隆损坏异常:
Exception in thread "main" java.lang.IllegalStateException: Cloning corruption: the same entity (MyInstance) is present in both the original and the clone. So when a planning variable in the original solution changes, the cloned solution will change too.
- 已尝试无效操作:调整多种断言级别,仅GIZMO启用时触发异常;给相关类/字段添加
@DeepPlanningClone注解无改善
关键场景细节
- 报错类带有
@ShadowVariable注解,变量类型为List - 该类在解决方案类中以
List集合形式存在,标记有@PlanningEntityCollectionProperty - 该类是抽象基类的子类,子类仅新增辅助方法,无额外成员变量
- 已通过
VariableListener正确完成Shadow变量的赋值逻辑
可能原因与排查方向
GIZMO对抽象子类的克隆逻辑遗漏
GIZMO生成克隆代码时,可能未正确处理抽象基类的子类结构:即便子类无新增变量,GIZMO也可能未继承基类的克隆逻辑,导致Shadow变量(尤其是集合类型)未被深度克隆,直接复用原对象的集合引用,引发克隆冲突。集合类型Shadow变量的克隆策略差异
常规域访问会自动对集合类型Shadow变量做深度复制,但GIZMO生成的克隆代码可能仅做浅拷贝,导致原对象与克隆对象共享同一集合实例,触发OptaPlanner的克隆损坏断言。@DeepPlanningClone注解未被GIZMO正确识别
虽然添加了@DeepPlanningClone,但GIZMO可能未正确解析该注解在抽象基类/子类上的配置。建议将注解直接添加到基类的Shadow变量字段上,而非仅标注在类级别。VariableListener与GIZMO克隆的时序冲突
GIZMO克隆解决方案时,可能在VariableListener更新Shadow变量前完成克隆,或克隆过程中未同步Shadow变量状态,导致克隆对象的Shadow变量引用原对象实例。可检查VariableListener的触发时机,确保克隆完成后Shadow变量状态独立于原对象。
内容的提问来源于stack exchange,提问作者marinier
相关产品推荐
相关产品推荐

