如何加速 SolverManager.solveAndListen

How to speed up SolverManager.solveAndListen

每次我运行solverManager.solveAndListen(...)启动OptaPlanner,都需要500ms以上的时间来初始化它,然后才是真正的求解。

有什么方法可以大大加快速度吗?我 运行 对其进行了基准测试,但我不确定它所有的时间都花在了哪里。

我正在做 CVRPTWPD,目前正在用 167 Visits 测试 3 Vehicles,但是降低 Visits 似乎没有影响,所以它必须是其他东西.

如果对 solveAndListen 的第一次调用很慢,这对我的场景来说没问题,但我需要后续调用非常快(在 30ms 下是理想的)。

谢谢

***编辑:

我运行下面的代码一次:

solverConfig = SolverConfig.createFromXmlResource("solverConfig.xml") // takes 315ms
solverManager = SolverManager.create(solverConfig, SolverManagerConfig()) // takes 1409ms
scoreManager = ScoreManager.create(solverManager) // takes 556ms

然后我运行一个方法多次其中:

  1. Loads/resets 实体(由 this::findById 使用)

  2. 运行这个(我把它包装在一个计时器里),每次需要大约 500 毫秒:

solverManager.solveAndListen(
            1,
            this::findById,
            this::save
        )

可能的罪魁祸首:

  • solverAndListen() 传输到求解器线程池的求解器线程。但是这里不太可能有500ms。
  • 求解器线程调用 SolverFactory.createSolver()。创建求解器的速度还没有达到预期的速度(尽管在 optaplanner 8.0 中我们进行了 API 更改,允许我们现在内化求解器配置,但我们仍然没有这样做。)
  • 实际求解开始:先从头算分,先规划克隆等

我会赌第二项。特别是如果你使用 scoreDRL,那么它每次都会解析 scoreDRL 并每次构建 Drools KieBase,这是昂贵的。