import org.optaplanner.examples.machinereassignment.domain.MrResource;
public class MrMachineProbabilityWeightFactory implements SelectionProbabilityWeightFactory<MrProcessAssignment> {
public double createProbabilityWeight(ScoreDirector scoreDirector, MrProcessAssignment processAssignment) {
MachineReassignment machineReassignment = (MachineReassignment) scoreDirector.getWorkingSolution();
MrMachine machine = processAssignment.getMachine();
// TODO reuse usage calculated by of the ScoreCalculator which is a delta
long[] usage = new long[machineReassignment.getResourceList().size()];
for (MrProcessAssignment someProcessAssignment : machineReassignment.getProcessAssignmentList()) {
if (someProcessAssignment.getMachine() == machine) {
MrProcess process = someProcessAssignment.getProcess();
for (MrResource resource : machineReassignment.getResourceList()) {
usage[resource.getIndex()] += process.getUsage(resource);
}
}
}
double sum = 0.0;
for (MrResource resource : machineReassignment.getResourceList()) {
double available = (double)
(machine.getMachineCapacity(resource).getSafetyCapacity() - usage[resource.getIndex()]);
sum += (available * available);
}
return sum + 1.0;