当解决方案足够好时停止?

Stopping when the solution is good enough?

我成功实现了满足我需求的求解器。但是,我需要 运行 解决 1500 多个不同的“问题” 0:00 ,每天都精确。因为我的网络应用程序在 ruby 中,所以我构建了一个 quarkus“微服务”来获取数据、计算解决方案并将其 return 发送到我的主应用程序。

在我的 application.properties 中,我设置:

quarkus.optaplanner.solver.termination.spent-limit=5s

这意味着每个请求需要 ~5s 来解决。但是一次发送 1500 个请求会使我机器上的 CPU 饱和。

有没有办法告诉 OptaPlanner 在解足够好时停止? (例如,如果分数稳定......)。这样我就可以根据问题将时间从 5 秒减少到 1-2 秒?

你对我的具体情况有什么建议?

SolverManager 将根据其 parallelSolverCount 配置自动对求解器作业进行排队:

quarkus.optaplanner.solver-manager.parallel-solver-count=3

在这种情况下,它将 运行 3 个并行解算器。因此,如果有 7 个数据集进来,它将解决其中的 3 个,另外 4 个稍后,因为较早的求解器终止。但是,如果您使用 moveThreadCount=2,那么每个求解器至少使用 2 cpu 个核心,因此您至少使用 6 CPU 个核心。

默认情况下 parallelSolverCount 当前设置为 CPU 个核心的一半(它当前忽略 moveThreadCount)。在容器中,使用 JDK 11+ 很重要:容器的 CPU 计数通常与裸机不同。


您确实可以告诉 OptaPlanner 求解器在解决方案足够好时停止,例如,当达到某个分数或分数在一段时间内没有提高时,或它们的组合。 See these OptaPlanner docs. Quarkus 已经公开了其中一些(其余部分目前仍需要 solverConfig.xml 文件),一些 Quarkus 示例:

quarkus.optaplanner.solver.termination.spent-limit=5s
quarkus.optaplanner.solver.termination.unimproved-spent-limit=2s
quarkus.optaplanner.solver.termination.best-score-limit=0hard/-1000soft