Я ознакомился с демонстрацией Cloud Balancing OptaPlanner с реализацией Drools.
Есть 2 правила для этой демонстрации (на самом деле их 4, но 3 из них имеют одинаковые логики c) -
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
и
rule "computerCost" // "Minimize the total maintenance cost."
when
$computer : CloudComputer($cost : cost)
exists CloudProcess(computer == $computer)
then
scoreHolder.addSoftConstraintMatch(kcontext, - $cost);
end
Опираясь на эти правила, оптимальным решением НЕ будет назначать ЛЮБОЙ из процессов кому-либо из компьютеров. Это будет полностью удовлетворять первому правилу - емкость cpuPower
никогда не исчерпывается, не говоря уже о том, чтобы ее преодолеть. И никакие компьютеры не будут использоваться, и, следовательно, не будет затрат на техническое обслуживание.
Но система находит решение только с этими двумя правилами - субоптимизирует назначение процессов, которые есть на компьютерах.
что мне не хватает, где?
Где OptaPlanner / Drools сказали выделить как можно больше процессов?
новинка для Drools. извините за наивный вопрос, если это так.
// --- ОБНОВЛЕНИЕ
@PlanningEntity()
экземпляров, которые должны быть инициализированы и помещены в @PlanningSolution()
- это ключ, который я думаю. либо явно в коде, либо с помощью конфигурации Construction Heuristi c, как предложено @ yurlo c, или .. {не знаю, что еще здесь, если есть}