我正在尝试使用实现SolverEventListener和守护程序模式的自定义SolverThread来使用实时计划。
我对插入或删除实体不感兴趣。我只对“更新”它们感兴趣,例如,更改我的PlanningEntityCollectionProperty集合中特定实体的“优先级”。
目前,我正在使用:
scoreDirector.beforeProblemPropertyChanged(entity);
entity.setPriority(newPriority);
scoreDirector.afterProblemPropertyChanged(entity);
似乎执行了求解器,并设法改进了实际的解,但它只在上面花费了几毫秒:
org.optaplanner.core.impl.solver.DefaultSolver: Real-time problem fact changes done: step total (1), new best score (0hard/-100medium/-15soft).
org.optaplanner.core.impl.solver.DefaultSolver: Solving restarted: time spent (152), best score (0hard/-100medium/-15soft), environment mode (REPRODUCIBLE),
因此,考虑到我的求解器有10秒的UnimprovedSecondsSpentLimit,求解器很快就会停止。因此,第一次执行求解器时,它会在10秒后停止,但在接下来的几次中,它会在几毫秒后停止,并且无法获得良好的解。
我不确定当规划实体改变时是否需要使用"beforeProblemPropertyChanged“,但是我找不到任何替代方法,因为当规划变量改变时会使用"beforeVariableChanged”,对吧?也许optaplanner只是不支持实体中的更新,我需要使用beforeEntityRemoved删除旧的,然后使用beforeEntityAdded重新插入它?
我使用的是BRANCH_AND_BOUND,但是,我已经更改为本地搜索TABU_SEARCH,现在似乎调度程序使用了10秒。然而,它似乎陷入了局部最优,因为即使是非常小的集合(10个实体),它也无法改进解决方案。
谁有实时计划的经验?谢谢
发布于 2018-01-29 18:47:02
“解决重启”总是紧跟在“实时问题事实更改完成”之后不久,因为实时问题事实有效地“停止并重新启动”了求解器。10秒未改进的终止仅在重启后再次开始计数。
调试日志记录(甚至是跟踪)将显示实际发生的情况。
https://stackoverflow.com/questions/48450943
复制相似问题