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

Optaplanner开启多线程报The externalObject has no known workingObject异常如何解决

异常原因

OptaPlanner开启多线程求解时,会为每个工作线程克隆独立的求解副本以避免线程干扰。你当前的问题事实类ReforgeProblemFact仅作为规划实体ItemPlanningEntity的内部属性存在,没有直接在顶层的规划解决方案类ReforgePlanningSolution中通过@ProblemFactCollectionProperty注解注册。多线程克隆阶段,OptaPlanner仅会索引解决方案顶层注册的问题事实,实体内部的问题事实没有被纳入全局工作副本索引,因此抛出找不到对应workingObject的异常。单线程模式下无需克隆求解副本,所以不会触发该问题。

修复步骤

步骤1:修改规划解决方案类,新增顶层问题事实注册属性

更新ReforgePlanningSolution.kt代码,添加全局的重铸问题事实集合,并用@ProblemFactCollectionProperty注解标注:

@PlanningSolution
class ReforgePlanningSolution @JvmOverloads constructor(
    @PlanningEntityCollectionProperty
    val availableItems: List<ItemPlanningEntity>? = null,
    // 新增:顶层注册所有重铸问题事实
    @ProblemFactCollectionProperty
    val allReforges: List<ReforgeProblemFact>? = null,
    @PlanningScore
    val score: HardSoftScore? = null,
)

步骤2:构造解决方案实例时传入全局问题事实

修改Main.kt中初始化ReforgePlanningSolution的代码,将全局的allReforges传入构造函数:

val solverJob = solverManager.solve(UUID.randomUUID(), ReforgePlanningSolution(availableItems, allReforges))

修改完成后重新运行即可正常开启多线程求解,原有业务逻辑无需调整。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:06:08