Вопросы о типах расчета очков Optaplanner

Разрешите сомнения по поводу использования OptaPlanner. OptaPlanner использует следующие типы подсчета баллов: Расчет баллов слюни или расчет баллов для потоков ограничений. Оба метода поддерживают инкрементный подсчет баллов. Одно сомнение по поводу инкрементального подсчета баллов:

Демо:

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 и прибавляется жесткая оценка, предполагая -100.

  2. На данный момент решение CloudProcess было изменено. CloudComputer сократил часть приема CloudProcess, чтобы он не превышал лимит ЦП этого компьютера CloudComputer. Это условие не выполняется.

Мои вопросы:

  1. Если условие выполняется в первый раз, компьютер A выделяет 2 потока компьютеру с 4 ядерными процессорами, но первый раз компьютер A имеет 2 ядра, поэтому на этот раз решение представляет собой отрицательную оценку -100.
  2. Вторая программа Компьютер выделяет 1 поток, если текущие условия не выполняются, отрицательная оценка не будет увеличиваться. Результат жесткий 0. Вопросы: 1. А как удалили предыдущую отрицательную оценку?
  3. Или это означает, что оценка будет пересчитываться при каждом новом решении?

person Qing Ye    schedule 10.10.2020    source источник


Ответы (1)


  1. Предыдущий отрицательный счет будет удален, потому что addHardConstraintMatch() творит черную магию: он регистрирует прослушиватель отмены соответствия правила, чтобы отменить это отрицательное добавление, когда счет больше не совпадает.

  2. ScoreDRL является инкрементным, поэтому будет пересчитана только дельта изменения оценки.

PS: Взгляните и на ConstraintStreams, они тоже инкрементальные :)

person Geoffrey De Smet    schedule 14.10.2020
comment
Большое спасибо за ответ, я тоже видел эту часть логики в исходном коде. Спасибо - person Qing Ye; 02.11.2020