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

问题描述

我成功实现了适合我需求的求解器。但是,我每天必须在0:00精确地针对1500多个不同的“问题”运行求解器。因为我的Web应用程序是红宝石,所以我构建了一个quarkus“微服务”来获取数据,计算解决方案并将其返回到我的主应用程序。

在我的application.properties中,设置:

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

表示每个请求需要5秒钟才能解决。但是一次发送1500个请求会使我的计算机上的CPU饱和。

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

您对我的特定情况有何建议?

解决方法

如果输入过多,则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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...