Drools比EasyScoreCalculator[OptaPlanner]慢得多

Drools比EasyScoreCalculator[OptaPlanner]慢得多,drools,optaplanner,Drools,Optaplanner,Drools分数计算不应该比EasyScoreColator快吗 根据我正在处理的问题的大小,我注意到Drools比EasyScoreCalculator慢2-5倍 e、 g。 流口水 EasyScore计算器 2019-09-04 04:53:10,282 [main] INFO Solving started: time spent (8), best score (-306init/[-306]hard/[0]soft), environment mode (REPRODUCIBLE),

Drools分数计算不应该比EasyScoreColator快吗

根据我正在处理的问题的大小,我注意到Drools比EasyScoreCalculator慢2-5倍

e、 g。 流口水

EasyScore计算器

2019-09-04 04:53:10,282 [main] INFO  Solving started: time spent (8), best score (-306init/[-306]hard/[0]soft), environment mode (REPRODUCIBLE), random (JDK with seed 0).
2019-09-04 04:53:10,972 [main] INFO  Construction Heuristic phase (0) ended: time spent (699), best score ([0]hard/[9272]soft), score calculation speed (90657/sec), step total (306).
2019-09-04 04:53:25,273 [main] INFO  Local Search phase (1) ended: time spent (15000), best score ([0]hard/[9272]soft), score calculation speed (109948/sec), step total (193419).
2019-09-04 04:53:25,273 [main] INFO  Solving ended: time spent (15000), best score ([0]hard/[9272]soft), score calculation speed (108976/sec), phase total (2), environment mode (REPRODUCIBLE).
我在本测试中使用的唯一Drools规则如下:

rule "Maximise number of picked up parcels"
    when
      $job: Job(vehicle != null && vehicle.getVehicleType() != VehicleType.DUMMY)
    then
    scoreHolder.addSoftConstraintMatch(kcontext, 0, $job.getNumberOfParcels());
end
在EasyScoreCalculator中,这看起来像:

public void calculateScore(车辆路线解决方案){
int numberOfPickedUpParcels=0;
List jobsList=solution.getJobs();
for(作业:作业列表){
Vehicle=job.getVehicle();
如果(车辆!=null){
if(VehicleType.DUMMY!=vehicle.getVehicleType()){
numberOfPickedUpParcels+=作业。getNumberOfParcels();
}
}
int[]约束=新的int[1];
int[]目标=新int[1];
约束条件[0]=0;
目标[0]=选取的数量;
返回BendableScore.of(约束、目标);
}
这不是很奇怪吗?是因为我的规则效率不高,还是因为当Drools分数的计算比简单的要慢的时候有警告

编辑: 这是一个相当晚的编辑,但这里有一些数据来支持这一点。在200、600和1000个大小的问题集的不同数据集上对VRP数据集进行了基准测试。虽然EasyScoreCalculator的性能在更大的实例中崩溃,但它仍然比Drools更快

这可能与问题中存在的阴影变量的数量有关吗?我记得当Drools的表现确实优于EasyScoreCalculator时,运行的问题更复杂,约束也更多,但这个问题更复杂

EDIT2: 我已经使用与上面相同的数据集重新运行了这个实验。不知何故,现在Drools的伸缩性更好了。不知道为什么这次在没有配置更改的情况下速度更快


Drools分数计算是递增的,因此它的伸缩性比不是递增的EasyScoreCalculator要好得多


但是,Drools确实会带来性能开销,因此对于较小的数据集,这种开销可能会抵消缩放增益。使用
optaplanner benchmark
尝试3个不同的数据集,每次都将其放大一倍,然后查看基准报告中的性能图。

感谢您当时的回答。我已经编辑了我的答案,并完成了编辑你的建议。有趣的是,对于我尝试过的问题集,EasyScoreCalculator保持更快的速度,尽管性能下降很快。Drools分数性能保持相对稳定,因此我认为Drools速度更快时会有一个转折点。我本希望通过1000个节点达到这一点,但有趣的是EasyScoreCalculatorCalculator仍然快于。也许在更受约束的问题中,Drools的表现会优于EasyScoreColculator。是的,这是我开始Bavet的主要原因。拿着你的蛋糕,也吃吧。poc可以工作,但目前完成它在我们的某个积压工作中,由于工作量的增加,优先级降低。Drools正在改善。像这样的情况确实会提高兴趣令人毛骨悚然的问题。。。
rule "Maximise number of picked up parcels"
    when
      $job: Job(vehicle != null && vehicle.getVehicleType() != VehicleType.DUMMY)
    then
    scoreHolder.addSoftConstraintMatch(kcontext, 0, $job.getNumberOfParcels());
end