我在多线程下运行Optaplanner试图利用多个CPU内核。这个想法是:让优化器在有限的时间内关闭,在线程中选择最佳解决方案,可能迭代(如建议here)。我知道这与并行运行优化本身并不相同,我也意识到优化的并行化在Optaplanner路线图中。这就是问题所在 - 在相同的时间内,当我并行运行时,我的得分始终较低。我使用的线程越多,它就越糟糕。为了重现问题,我更改了CloudBalancingHelloWorld
类,类似于:
public static void main(String[] args) {
SolverFactory solverFactory = SolverFactory.createFromXmlResource("org/optaplanner/examples/cloudbalancing/solver/cloudBalancingSolverConfig.xml");
CloudBalance unsolvedCloudBalance = new CloudBalancingGenerator().createCloudBalance(400, 1200);
CloudBalance[] cbarray = new CloudBalance[8];
Arrays.fill(cbarray, unsolvedCloudBalance);
Arrays.stream(cbarray)
.parallel()
.map(cb -> {
Solver solver = solverFactory.buildSolver();
solver.solve(cb);
return solver.getBestSolution();
})
.forEach(
solvedCloudBalance -> System.out
.println("\nSolved cloudBalance with 400 computers and 1200 processes:\n"
+ solvedCloudBalance.getScore()));
;
}
在配置中
<termination>
<secondsSpentLimit>30</secondsSpentLimit>
</termination>
我认为这可能是一个性能问题但是我记录了移动量并且它们在每个线程中是相同的 - 我在机器上有12个物理内核可用,并且RAM比我需要的多。知道我做错了什么吗?