Solution_
- the solution type, the class with the PlanningSolution
annotationpublic interface Solver<Solution_>
To create a Solver, use SolverFactory.buildSolver()
.
To solve a planning problem, call solve(Object)
.
To solve a planning problem without blocking the current thread, use SolverManager
instead.
These methods are not thread-safe and should be called from the same thread,
except for the methods that are explicitly marked as thread-safe.
Note that despite that solve(Solution_)
is not thread-safe for clients of this class,
that method is free to do multithreading inside itself.
Modifier and Type | Method and Description |
---|---|
void |
addEventListener(SolverEventListener<Solution_> eventListener) |
boolean |
addProblemFactChange(ProblemFactChange<Solution_> problemFactChange)
Schedules a
ProblemFactChange to be processed. |
boolean |
addProblemFactChanges(List<ProblemFactChange<Solution_>> problemFactChangeList)
Schedules multiple
ProblemFactChange s to be processed. |
String |
explainBestScore()
Deprecated.
in favor of
ScoreManager.explainScore(Object) |
Score |
getBestScore()
Deprecated.
in favor of
ScoreManager.updateScore(Object) |
Solution_ |
getBestSolution()
Deprecated.
|
ScoreDirectorFactory<Solution_> |
getScoreDirectorFactory()
Deprecated.
in favor of
SolverFactory.getScoreDirectorFactory()
Will be removed in 8.0. |
long |
getTimeMillisSpent()
Deprecated.
in favor of
SolverJob.getSolvingDuration() . |
boolean |
isEveryProblemFactChangeProcessed()
Checks if all scheduled
ProblemFactChange s have been processed. |
boolean |
isSolving()
This method is thread-safe.
|
boolean |
isTerminateEarly()
This method is thread-safe.
|
void |
removeEventListener(SolverEventListener<Solution_> eventListener) |
Solution_ |
solve(Solution_ problem)
Solves the planning problem and returns the best solution encountered
(which might or might not be optimal, feasible or even initialized).
|
boolean |
terminateEarly()
Notifies the solver that it should stop at its earliest convenience.
|
Solution_ solve(Solution_ problem)
It can take seconds, minutes, even hours or days before this method returns,
depending on the Termination
configuration.
To terminate a Solver
early, call terminateEarly()
.
problem
- never null, a PlanningSolution
, usually its planning variables are uninitializedPlanningSolution
with a null Score
.terminateEarly()
boolean terminateEarly()
solve(Solution_)
to actually return.
If the solver is running in daemon mode, this is the only way to terminate it normally.
This method is thread-safe.
It can only be called from a different thread
because the original thread is still calling solve(Object)
.
isTerminateEarly()
,
Future.cancel(boolean)
@Deprecated Solution_ getBestSolution()
addEventListener(SolverEventListener)
or
SolverJob.getFinalBestSolution()
.best solution
found during solving:
it might or might not be optimal, feasible or even initialized.
The solve(Solution_)
method also returns the best solution,
but this method is useful in rare asynchronous situations (although
SolverEventListener.bestSolutionChanged(BestSolutionChangedEvent)
is often more appropriate).
This method is thread-safe.
solve(Object)
hasn't been called yet),
but it can return the uninitialized PlanningSolution
with a Score
null.@Deprecated Score getBestScore()
ScoreManager.updateScore(Object)
Score
of the getBestSolution()
.
This is useful for generic code, which doesn't know the type of the PlanningSolution
to retrieve the Score
from the getBestSolution()
easily.
This method is thread-safe.
PlanningSolution
is still uninitialized@Deprecated String explainBestScore()
ScoreManager.explainScore(Object)
getBestSolution()
through the ConstraintMatch
API
to identify which constraints or planning entities cause that getBestScore()
quality.
In case of an infeasible
solution,
this can help diagnose the cause of that.
Do not parse this string.
Instead, to provide this information in a UI or a service, use SolverFactory.getScoreDirectorFactory()
to retrieve ScoreDirector.getConstraintMatchTotalMap()
and ScoreDirector.getIndictmentMap()
and convert those into a domain specific API.
This method is thread-safe.
getBestScore()
returns nullScoreDirector.explainScore()
@Deprecated long getTimeMillisSpent()
SolverJob.getSolvingDuration()
.
A addProblemFactChange(ProblemFactChange)
triggers a restart which resets this time.
This method is thread-safe.
boolean isSolving()
solve(Solution_)
method is still running.boolean isTerminateEarly()
Solver
started.Future.isCancelled()
boolean addProblemFactChange(ProblemFactChange<Solution_> problemFactChange)
ProblemFactChange
to be processed.
As a side-effect, this restarts the Solver
, effectively resetting all Termination
s,
but not terminateEarly()
.
This method is thread-safe.
Follows specifications of BlockingQueue.add(Object)
with by default
a capacity of Integer.MAX_VALUE
.
problemFactChange
- never nullCollection.add(E)
)addProblemFactChanges(List)
boolean addProblemFactChanges(List<ProblemFactChange<Solution_>> problemFactChangeList)
ProblemFactChange
s to be processed.
As a side-effect, this restarts the Solver
, effectively resetting all Termination
s,
but not terminateEarly()
.
This method is thread-safe.
Follows specifications of Collection.addAll(Collection)
with by default
a capacity of Integer.MAX_VALUE
.
problemFactChangeList
- never nullCollection.add(E)
)addProblemFactChange(ProblemFactChange)
boolean isEveryProblemFactChangeProcessed()
ProblemFactChange
s have been processed.
This method is thread-safe.
ProblemFactChange
s left to dovoid addEventListener(SolverEventListener<Solution_> eventListener)
eventListener
- never nullvoid removeEventListener(SolverEventListener<Solution_> eventListener)
eventListener
- never null@Deprecated ScoreDirectorFactory<Solution_> getScoreDirectorFactory()
SolverFactory.getScoreDirectorFactory()
Will be removed in 8.0.Score
calculation (for example in a UI)
and to explain the Score
to the user
with the ConstraintMatchTotal
and Indictment
API.Copyright © 2006–2021 JBoss by Red Hat. All rights reserved.