【问题标题】:How to get the selected move when the best solution has been updated for OptaPlanner?为 OptaPlanner 更新了最佳解决方案后,如何获得选定的移动?
【发布时间】:2023-03-07 15:09:01
【问题描述】:

我们知道 OptaPlanner 在选择一个生成最高分的步骤以更新最佳解决方案之前会执行多个步骤的计算,如调试日志所示,例如 [main] DEBUG o.o.c.i.c.DefaultConstructionHeuristicSolverPhase - 步数索引 (1147)、时间花费 (4381)、分数 (0hard/80504soft)、构建步数的选定移动计数 (15)...

我正在尝试获取已选择的移动(或至少获取通知),以便我可以捕获一些中间计算结果。显然,打印出每一步的所有计算结果是不可行的,因为其中很多都没有被选中。

我正在查看 BestSolutionChangedEvent 方法,但根据此线程,它似乎可能不符合我的目的: How to know Optaplanner solving has ended?

有什么想法可以实现吗?提前致谢。

【问题讨论】:

    标签: optaplanner


    【解决方案1】:

    在回答实际问题之前,这真的有用吗?假设如下场景:

    • 第 0 步,第 0 步后的新最好成绩
    • 第 1 步,完成第 1 步后的新最好成绩
    • 第 2 步,第 2 步后最好成绩相同
    • 第 3 步,第 3 步后最好成绩相同
    • 第 4 步,完成第 4 步后的新最好成绩

    现在,如果您采取行动,找到新的最佳解决方案,您会得到什么?

    • 步骤 0 后新的最佳解决方案事件 A,给出移动 0
    • 步骤 1 后新的最佳解决方案事件 B,给出移动 1
    • 第 4 步之后的新最佳解决方案事件 C,给出第 4 步 // 但是如果不执行第 2 步和第 3 步,我们一开始就不会出现在这个解决方案中。

    所以这没有用,除非你当然只是想了解哪些动作是好的。但在这种情况下,请查看 Benchmarker 的 Picked move type best score diff over time statistic,这是 6.2 中的新功能。

    现在回答您的问题 :) 没有公共 API 可以做到这一点,但您可以使用内部(非向后兼容)实现类,如 this class 中所做的那样。

    【讨论】:

    • 谢谢杰弗里,我明白你的意思。实际上,每当找到新的最佳解决方案时,我都会尝试跟踪每个计划变量的分数 - 这样我就能够知道我的分数模型在整个计划阶段如何对每个计划变量起作用。在基准测试中可以轻松跟踪总分的变化,但不太确定如何针对每个计划变量进行跟踪。
    • 也许看看文档部分“解释分数”,以及我在 master 上添加的新基准(约束匹配总最佳分数的一些统计信息)
    • 我的 G+ 信息流中有该统计数据的屏幕截图。
    猜你喜欢
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-22
    • 2017-03-13
    • 2014-11-27
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多