Optaplanner Score 计算类型题

Optaplanner Score calculation types questions

解决OptaPlanner的使用疑惑。 OptaPlanner 使用以下分数计算类型:Drools 分数计算或约束流分数计算。两种方式都支持增量计算分数。 积分增量计算疑点之一:

演示:

import org.optaplanner.examples.cloudbalancing.domain.CloudBalance;
import org.optaplanner.examples.cloudbalancing.domain.CloudComputer;
import org.optaplanner.examples.cloudbalancing.domain.CloudProcess;

global HardSoftScoreHolder scoreHolder;

// ############################################################################
// Hard constraints
// ############################################################################

rule "requiredCpuPowerTotal"
    when
        $computer : CloudComputer($cpuPower : cpuPower)
        accumulate(
            CloudProcess(
                computer == $computer,
                $requiredCpuPower : requiredCpuPower);
            $requiredCpuPowerTotal : sum($requiredCpuPower);
            $requiredCpuPowerTotal > $cpuPower
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, $cpuPower - $requiredCpuPowerTotal);
end
  1. 假设requiredCpuPowerTotal条件成立,执行then逻辑,加入hard score,假设-100。

  2. 这时候CloudProcess的方案就改好了。 CloudComputer 减少了一些 CloudProcess 接收,因此它不会超过此计算机 CloudComputer 的 cpu 限制。这个条件不成立。

我的问题是:

  1. 如果第一次满足条件,电脑A分配2个线程给一台总共4核CPU的电脑,但是第一次电脑A是2核的,所以这次的解是负分硬 -100 .
  2. 第二个程序一台电脑分配1个线程,如果不满足当前条件,负分不会增加。结果是hard 0。问题:1.但是之前的负分是怎么删掉的?
  3. 或者这是否意味着每个新的解决方案都会重新计算分数?
  1. 之前的负分将被删除,因为addHardConstraintMatch()在做一些黑魔法:它注册了一个规则不匹配的监听器,当分数不再匹配时撤销负数添加。

  2. scoreDRL 是递增的,因此只会重新计算分数变化的增量。

PS:也看看 ConstraintStreams,它们也是增量的:)