问题描述
我成功实现了适合我需求的求解器。但是,我每天必须在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