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.
@FunctionalInterface public interface ProblemChange<Solution_>
A ProblemChange represents a change in one or moreplanning entities
or problem facts of aPlanningSolution
.The
Solver
checks the presence of waiting problem changes after everyMove
evaluation. If there are waiting problem changes, theSolver
:- 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 aPlanningSolution
at will. Any change must be done on the problem facts and planning entities referenced by thePlanningSolution
.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
All Methods Instance Methods Abstract Methods Modifier and Type Method Description void
doChange(Solution_ workingSolution, ProblemChangeDirector problemChangeDirector)
Do the change on thePlanningSolution
.
-
-
-
Method Detail
-
doChange
void doChange(Solution_ workingSolution, ProblemChangeDirector problemChangeDirector)
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
-
-