如何加速 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
然后我运行一个方法多次其中:
Loads/resets 实体(由 this::findById
使用)
运行这个(我把它包装在一个计时器里),每次需要大约 500 毫秒:
solverManager.solveAndListen(
1,
this::findById,
this::save
)
可能的罪魁祸首:
- solverAndListen() 传输到求解器线程池的求解器线程。但是这里不太可能有500ms。
- 求解器线程调用
SolverFactory.createSolver()
。创建求解器的速度还没有达到预期的速度(尽管在 optaplanner 8.0 中我们进行了 API 更改,允许我们现在内化求解器配置,但我们仍然没有这样做。)
- 实际求解开始:先从头算分,先规划克隆等
我会赌第二项。特别是如果你使用 scoreDRL,那么它每次都会解析 scoreDRL 并每次构建 Drools KieBase,这是昂贵的。
每次我运行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
然后我运行一个方法多次其中:
Loads/resets 实体(由
this::findById
使用)运行这个(我把它包装在一个计时器里),每次需要大约 500 毫秒:
solverManager.solveAndListen(
1,
this::findById,
this::save
)
可能的罪魁祸首:
- solverAndListen() 传输到求解器线程池的求解器线程。但是这里不太可能有500ms。
- 求解器线程调用
SolverFactory.createSolver()
。创建求解器的速度还没有达到预期的速度(尽管在 optaplanner 8.0 中我们进行了 API 更改,允许我们现在内化求解器配置,但我们仍然没有这样做。) - 实际求解开始:先从头算分,先规划克隆等
我会赌第二项。特别是如果你使用 scoreDRL,那么它每次都会解析 scoreDRL 并每次构建 Drools KieBase,这是昂贵的。