Interface ProblemChange<Solution_>
- Type Parameters:
Solution_
- the solution type, the class with thePlanningSolution
annotation
- Functional Interface:
- This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
A ProblemChange represents a change in one or more
planning entities
or problem facts
of a PlanningSolution
.
The Solver
checks the presence of waiting problem changes after every
Move
evaluation. If there are waiting problem changes,
the Solver
:
- clones the last
best solution
and sets the clone as the newworking solution
- applies every problem change keeping the order in which problem changes have been submitted;
after every problem change,
variable listeners
are triggered - calculates the score and makes the
updated working solution
the newbest solution
; note that thissolution
is not published via theBestSolutionChangedEvent
, as it hasn't been initialized yet - restarts solving to fill potential uninitialized
planning entities
Note that the Solver
clones a PlanningSolution
at will.
Any change must be done on the problem facts and planning entities referenced by the PlanningSolution
.
An example implementation, based on the Cloud balancing problem, looks as follows:
public class DeleteComputerProblemChange implements ProblemChange<CloudBalance> {
private final CloudComputer computer;
public DeleteComputerProblemChange(CloudComputer computer) {
this.computer = computer;
}
{@literal @Override}
public void doChange(CloudBalance cloudBalance, ProblemChangeDirector problemChangeDirector) {
CloudComputer workingComputer = problemChangeDirector.lookUpWorkingObjectOrFail(computer);
// First remove the problem fact from all planning entities that use it
for (CloudProcess process : cloudBalance.getProcessList()) {
if (process.getComputer() == workingComputer) {
problemChangeDirector.changeVariable(process, "computer",
workingProcess -> workingProcess.setComputer(null));
}
}
// A SolutionCloner does not clone problem fact lists (such as computerList), only entity lists.
// Shallow clone the computerList so only the working solution is affected.
ArrayList<CloudComputer> computerList = new ArrayList<>(cloudBalance.getComputerList());
cloudBalance.setComputerList(computerList);
// Remove the problem fact itself
problemChangeDirector.removeProblemFact(workingComputer, computerList::remove);
}
}
-
Method Summary
Modifier and TypeMethodDescriptionvoid
doChange
(Solution_ workingSolution, ProblemChangeDirector problemChangeDirector) Do the change on thePlanningSolution
.
-
Method Details
-
doChange
Do the change on thePlanningSolution
. Every modification to thePlanningSolution
must be done via theProblemChangeDirector
, otherwise theScore
calculation will be corrupted.- Parameters:
workingSolution
- never null; theworking solution
which contains the problem facts (andplanning entities
) to changeproblemChangeDirector
- never null;ProblemChangeDirector
to perform the change through
-