package io.trygvis.acme.planning.machine; import org.optaplanner.core.api.score.buildin.hardsoft.HardSoftScore; import org.optaplanner.core.api.score.calculator.EasyScoreCalculator; public class CloudBalancingEasyScoreCalculator implements EasyScoreCalculator { @Override public HardSoftScore calculateScore(CloudBalance cloudBalance) { int hardScore = 0; int softScore = 0; for (CloudComputer computer : cloudBalance.getComputerList()) { int cpu = 0; int memory = 0; boolean used = false; // Calculate usage for (CloudProcess process : cloudBalance.getProcessList()) { if (computer.equals(process.computer)) { cpu += process.requiredCpu; memory += process.requiredMemory; used = true; } } var instance = computer.instance; // Hard constraints int cpuPowerAvailable = instance.cpu - cpu; if (cpuPowerAvailable < 0) { hardScore += cpuPowerAvailable; } int memoryAvailable = instance.memory - memory; if (memoryAvailable < 0) { hardScore += memoryAvailable; } // Soft constraints if (used) { softScore -= instance.cost; } } return HardSoftScore.of(hardScore, softScore); } }