package io.trygvis.acme.planning.machine; import org.apache.commons.lang3.builder.CompareToBuilder; import org.optaplanner.core.api.domain.entity.PlanningEntity; import org.optaplanner.core.api.domain.variable.PlanningVariable; import java.util.Comparator; @PlanningEntity(difficultyComparatorClass = CloudProcessDifficultyComparator.class) public class CloudProcess { public String id; public int requiredCpu; public int requiredMemory; public int requiredMultiplicand; @PlanningVariable( valueRangeProviderRefs = "computerRange", strengthComparatorClass = CloudComputerStrengthComparator.class) public CloudComputer computer; public CloudProcess(String id, int requiredCpu, int requiredMemory) { this.id = id; this.requiredCpu = requiredCpu; this.requiredMemory = requiredMemory; this.requiredMultiplicand = requiredCpu * requiredMemory; } @SuppressWarnings("unused") public CloudProcess() { } public String toString() { return id; } public static class CloudComputerStrengthComparator implements Comparator { public int compare(CloudComputer a, CloudComputer b) { var x = a.instance; var y = b.instance; return new CompareToBuilder() .append(x.multiplicand, y.multiplicand) .append(y.cost, x.cost) // Descending (but this is debatable) .append(x.kind, y.kind) .toComparison(); } } }