## Uses of Class
org.cpsolver.ifs.solution.Solution

- Packages that use Solution
  Package | Description
  --- | ---
  org.cpsolver.coursett | University Course Timetabling.
  org.cpsolver.coursett.criteria.placement | University Course Timetabling: Placement Selection Criteria.
  org.cpsolver.coursett.custom | University Course Timetabling: Various customizations.
  org.cpsolver.coursett.heuristics | University Course Timetabling: Heuristics.
  org.cpsolver.coursett.model | University Course Timetabling: Model.
  org.cpsolver.coursett.neighbourhoods | University Course Timetabling: Various Neighbourhoods.
  org.cpsolver.coursett.sectioning | Additional Student Sectioning Algorithms.
  org.cpsolver.exam.heuristics | Examination Timetabling: Solution Heuristics.
  org.cpsolver.exam.neighbours | Examination Timetabling: Various Neighbourhoods.
  org.cpsolver.exam.split | This package contains an an experimental criterion that allows an exam to be split into two if it decreases the number of student conflicts.
  org.cpsolver.ifs.algorithms | IFS Neighbourhood Search Algorithms
  org.cpsolver.ifs.algorithms.neighbourhoods | IFS: Various Problem-Independent Neighbourhoods.
  org.cpsolver.ifs.assignment | An assignment holds current values of all the variables of a model.
  org.cpsolver.ifs.dbt | Dynamic backtracking extension of IFS solver
  org.cpsolver.ifs.example.tt | Simple Timetabling Problem.
  org.cpsolver.ifs.extension | IFS Extensions (conflict-based statistics, maintenance of arc consistency)
  org.cpsolver.ifs.heuristics | IFS Heuristics (value and variable selection criteria)
  org.cpsolver.ifs.model | IFS Model (description of a problem)
  org.cpsolver.ifs.solution | IFS Solution (also contains solution comparator)
  org.cpsolver.ifs.solver | IFS Solver
  org.cpsolver.ifs.termination | IFS Termination (termination condition)
  org.cpsolver.ifs.util | Utilities
  org.cpsolver.studentsct | Student Sectioning Solver.
  org.cpsolver.studentsct.heuristics | Student Sectioning: Heuristics.
  org.cpsolver.studentsct.heuristics.selection | Student Sectioning: Various Neighbour Selection Criteria.
  org.cpsolver.studentsct.online.selection | Online Student Sectioning Solver: Selection Weights and Heuristics.
  org.cpsolver.studentsct.weights | Student Sectioning Weightings: various students weight models

- - ### Uses of Solution in org.cpsolver.coursett

    Methods in org.cpsolver.coursett with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | Test.`bestCleared(Solution<Lecture,Placement> solution)`
    `void` | Test.`bestRestored(Solution<Lecture,Placement> solution)`
    `void` | Test.`bestSaved(Solution<Lecture,Placement> solution)`
    `protected void` | TimetableXMLLoader.`doLoad(Solution<Lecture,Placement> currentSolution, Element root)`
    `protected void` | TimetableSolver.`fixCompleteSolution(Solution<Lecture,Placement> solution, double startTime)` Deprecated. Try to improve existing solution by backtracking search of very limited depth.
    `void` | Test.`getInfo(Solution<Lecture,Placement> solution, Map<String,String> info)`
    `void` | Test.`getInfo(Solution<Lecture,Placement> solution, Map<String,String> info, Collection<Lecture> variables)`
    `void` | TimetableXMLLoader.`load(Solution<Lecture,Placement> currentSolution)`
    `void` | TimetableXMLLoader.`load(Solution<Lecture,Placement> currentSolution, Document document)`
    `void` | Test.`notify(Solution<Lecture,Placement> solution)` Add a line into the output CSV file when a enw best solution is found.
    `protected void` | TimetableSolver.`onAssigned(double startTime, Solution<Lecture,Placement> solution)` Deprecated.
    `static void` | Test.`printSomeStuff(Solution<Lecture,Placement> solution)` Create info.txt with some more information about the problem
    `static void` | Test.`saveOutputCSV(Solution<Lecture,Placement> s, File file)`
    `void` | Test.`solutionUpdated(Solution<Lecture,Placement> solution)`

  - ### Uses of Solution in org.cpsolver.coursett.criteria.placement

    Methods in org.cpsolver.coursett.criteria.placement with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | WeightedHardConflicts.`bestCleared(Solution<Lecture,Placement> solution)`
    `void` | WeightedHardConflicts.`bestRestored(Solution<Lecture,Placement> solution)`
    `void` | WeightedHardConflicts.`bestSaved(Solution<Lecture,Placement> solution)`
    `void` | WeightedHardConflicts.`getInfo(Solution<Lecture,Placement> solution, Map<String,String> info)`
    `void` | WeightedHardConflicts.`getInfo(Solution<Lecture,Placement> solution, Map<String,String> info, Collection<Lecture> variables)`
    `void` | WeightedHardConflicts.`solutionUpdated(Solution<Lecture,Placement> solution)`

  - ### Uses of Solution in org.cpsolver.coursett.custom

    Methods in org.cpsolver.coursett.custom with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | DeterministicStudentSectioning.`switchStudents(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)` No re-sectioning (final sectioning) during deterministic student sectioning.

  - ### Uses of Solution in org.cpsolver.coursett.heuristics

    Methods in org.cpsolver.coursett.heuristics that return Solution
    Modifier and Type | Method and Description
    --- | ---
    `Solution<Lecture,Placement>` | NeighbourSelectionWithSuggestions.NeighbourSelectionWithSuggestionsContext.`getSolution()`

    Methods in org.cpsolver.coursett.heuristics with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `int` | NeighbourSelectionWithSuggestions.SuggestionNeighbour.`compareTo(Solution<Lecture,Placement> solution)`
    `double` | TimetableComparator.`currentValue(Solution<Lecture,Placement> currentSolution)` Deprecated.
    `double` | TimetableComparator.`getBest(Solution<Lecture,Placement> currentSolution)` Deprecated.
    `void` | FixCompleteSolutionNeighbourSelection.FixCompleteSolutionNeighbourContext.`incPhase(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | FixCompleteSolutionNeighbourSelection.`selectNeighbour(Solution<Lecture,Placement> solution)` Try to improve existing solution by backtracking search of very limited depth.
    `Neighbour<Lecture,Placement>` | NeighbourSelectionWithSuggestions.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | NeighbourSelectionWithSuggestions.`selectNeighbourWithSuggestions(Solution<Lecture,Placement> solution, Lecture lecture, int depth)`
    `Placement` | PlacementSelection.`selectValue(Solution<Lecture,Placement> solution, Lecture var)`
    `Lecture` | LectureSelection.`selectVariable(Solution<Lecture,Placement> solution)`

    Constructors in org.cpsolver.coursett.heuristics with parameters of type Solution
    Constructor and Description
    `NeighbourSelectionWithSuggestionsContext(Solution<Lecture,Placement> solution)`

  - ### Uses of Solution in org.cpsolver.coursett.model

    Methods in org.cpsolver.coursett.model with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | FinalSectioning.`execute(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)`
    `void` | DefaultStudentSectioning.`switchStudents(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)` Run student final sectioning (switching students between sections of the same class in order to minimize overall number of student conflicts).
    `void` | StudentSectioning.`switchStudents(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)` Run student final sectioning (switching students between sections of the same class in order to minimize overall number of student conflicts).

  - ### Uses of Solution in org.cpsolver.coursett.neighbourhoods

    Methods in org.cpsolver.coursett.neighbourhoods with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `Double` | RoomSwap.`resolve(Solution<Lecture,Placement> solution, double total, long startTime, Map<Lecture,Placement> assignments, List<Placement> conflicts, int index)`
    `Double` | TimeSwap.`resolve(Solution<Lecture,Placement> solution, double total, long startTime, Map<Lecture,Placement> assignments, List<Placement> conflicts, int index)`
    `Neighbour<Lecture,Placement>` | RoomChange.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | RoomSwap.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | Suggestion.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | TimeChange.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | TimeSwap.`selectNeighbour(Solution<Lecture,Placement> solution)`

  - ### Uses of Solution in org.cpsolver.coursett.sectioning

    Methods in org.cpsolver.coursett.sectioning with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `static double` | StudentSwapSectioning.`gp(Solution<Lecture,Placement> solution)` Student group percentage of a solution
    `protected double` | StudentSwapSectioning.`objective(Solution<Lecture,Placement> solution)` Student conflict weight of a solution
    `Neighbour<Lecture,Placement>` | RandomStudentSwap.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `Neighbour<Lecture,Placement>` | StudentSwapGenerator.`selectNeighbour(Solution<Lecture,Placement> solution)`
    `void` | SctSectioning.`switchStudents(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)`
    `void` | StudentSwapSectioning.`switchStudents(Solution<Lecture,Placement> solution, TerminationCondition<Lecture,Placement> termination)`
    `protected double` | SctSectioning.`value(Solution<Lecture,Placement> solution)` Student conflict weight for the given solution
    `protected double` | StudentSwapSectioning.`value(Solution<Lecture,Placement> solution)` Combined weight of a solution

  - ### Uses of Solution in org.cpsolver.exam.heuristics

    Methods in org.cpsolver.exam.heuristics with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected boolean` | ExamGreatDeluge.`accept(Solution<Exam,ExamPlacement> solution, Neighbour<Exam,ExamPlacement> neighbour)` Deprecated. Accept neighbour
    `protected boolean` | ExamSimulatedAnnealing.`accept(Solution<Exam,ExamPlacement> solution, Neighbour<Exam,ExamPlacement> neighbour)` Deprecated. True if the given neighboir is to be be accepted
    `void` | ExamGreatDeluge.`bestCleared(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamHillClimbing.`bestCleared(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamSimulatedAnnealing.`bestCleared(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamGreatDeluge.`bestRestored(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamHillClimbing.`bestRestored(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamSimulatedAnnealing.`bestRestored(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamGreatDeluge.`bestSaved(Solution<Exam,ExamPlacement> solution)` Deprecated. Update last improving iteration count
    `void` | ExamHillClimbing.`bestSaved(Solution<Exam,ExamPlacement> solution)` Deprecated. Memorize the iteration when the last best solution was found.
    `void` | ExamSimulatedAnnealing.`bestSaved(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `protected void` | ExamSimulatedAnnealing.Context.`bestSaved(Solution<Exam,ExamPlacement> solution)` Memorize the iteration when the last best solution was found.
    `boolean` | ExamNeighbourSelection.`canContinue(Solution<Exam,ExamPlacement> currentSolution)` Termination condition (i.e., has final phase finished)
    `protected void` | ExamSimulatedAnnealing.Context.`cool(Solution<Exam,ExamPlacement> solution)` Cool temperature
    `Neighbour<Exam,ExamPlacement>` | ExamGreatDeluge.`genMove(Solution<Exam,ExamPlacement> solution)` Deprecated. Generate neighbour -- select neighbourhood randomly, select neighbour
    `Neighbour<Exam,ExamPlacement>` | ExamSimulatedAnnealing.`genMove(Solution<Exam,ExamPlacement> solution)` Deprecated. Generate neighbour -- select neighbourhood randomly, select neighbour
    `void` | ExamGreatDeluge.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info)` Deprecated.
    `void` | ExamHillClimbing.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info)` Deprecated.
    `void` | ExamSimulatedAnnealing.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info)` Deprecated.
    `void` | ExamGreatDeluge.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info, Collection<Exam> variables)` Deprecated.
    `void` | ExamHillClimbing.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info, Collection<Exam> variables)` Deprecated.
    `void` | ExamSimulatedAnnealing.`getInfo(Solution<Exam,ExamPlacement> solution, Map<String,String> info, Collection<Exam> variables)` Deprecated.
    `protected void` | ExamGreatDeluge.`incIter(Solution<Exam,ExamPlacement> solution)` Deprecated. Increment iteration count, update bound
    `protected void` | ExamGreatDeluge.Context.`incIter(Solution<Exam,ExamPlacement> solution)`
    `protected boolean` | ExamHillClimbing.Context.`incIter(Solution<Exam,ExamPlacement> solution)`
    `protected void` | ExamSimulatedAnnealing.Context.`incIter(Solution<Exam,ExamPlacement> solution)` Increment iteration counter, cool/reheat/restoreBest if necessary
    `protected void` | ExamGreatDeluge.`info(Solution<Exam,ExamPlacement> solution)` Deprecated. Print some information
    `protected void` | ExamGreatDeluge.Context.`info(Solution<Exam,ExamPlacement> solution)`
    `protected void` | ExamSimulatedAnnealing.Context.`reheat(Solution<Exam,ExamPlacement> solution)` Reheat temperature
    `Neighbour<Exam,ExamPlacement>` | ExamColoringConstruction.`selectNeighbour(Solution<Exam,ExamPlacement> solution)`
    `Neighbour<Exam,ExamPlacement>` | ExamConstruction.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select a neighbour.
    `Neighbour<Exam,ExamPlacement>` | ExamGreatDeluge.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Deprecated. A neighbour is generated randomly untill an acceptable one is found.
    `Neighbour<Exam,ExamPlacement>` | ExamHillClimbing.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Deprecated. Select one of the given neighbourhoods randomly, select neighbour, return it if its value is below or equal to zero (continue with the next selection otherwise).
    `Neighbour<Exam,ExamPlacement>` | ExamNeighbourSelection.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Neighbour selection.
    `Neighbour<Exam,ExamPlacement>` | ExamSimulatedAnnealing.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Deprecated. Select neighbour -- generate a move `ExamSimulatedAnnealing.genMove(Solution)` until an acceptable neighbour is found `ExamSimulatedAnnealing.accept(Solution, Neighbour)`, keep increasing iteration `ExamSimulatedAnnealing.Context.incIter(Solution)`.
    `Neighbour<Exam,ExamPlacement>` | ExamTabuSearch.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Neighbor selection
    `ExamPlacement` | ExamTabuSearch.`selectValue(Solution<Exam,ExamPlacement> solution, Exam exam)` Value selection
    `Exam` | ExamUnassignedVariableSelection.`selectVariable(Solution<Exam,ExamPlacement> solution)` Variable selection
    `void` | ExamGreatDeluge.`solutionUpdated(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamHillClimbing.`solutionUpdated(Solution<Exam,ExamPlacement> solution)` Deprecated.
    `void` | ExamSimulatedAnnealing.`solutionUpdated(Solution<Exam,ExamPlacement> solution)` Deprecated.

  - ### Uses of Solution in org.cpsolver.exam.neighbours

    Methods in org.cpsolver.exam.neighbours with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `Neighbour<Exam,ExamPlacement>` | ExamPeriodSwapMove.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select an exam randomly, select an available period randomly (if it is not assigned), use rooms if possible, select rooms using `Exam.findBestAvailableRooms(Assignment, ExamPeriodPlacement)` if not (exam is unassigned, a room is not available or used).
    `Neighbour<Exam,ExamPlacement>` | ExamRandomMove.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select an exam randomly, select an available period randomly (from `Exam.getPeriodPlacements()`), select rooms using `Exam.findBestAvailableRooms(Assignment, ExamPeriodPlacement)`.
    `Neighbour<Exam,ExamPlacement>` | ExamRoomMove.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select an exam randomly, select an available period randomly (if it is not assigned, from `Exam.getPeriodPlacements()`), select rooms using `Exam.findRoomsRandom(Assignment, ExamPeriodPlacement)`
    `Neighbour<Exam,ExamPlacement>` | ExamTimeMove.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select an exam randomly, select an available period randomly (if it is not assigned), use rooms if possible, select rooms using `Exam.findBestAvailableRooms(Assignment, ExamPeriodPlacement)` if not (exam is unassigned, a room is not available or used).

  - ### Uses of Solution in org.cpsolver.exam.split

    Methods in org.cpsolver.exam.split with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `Neighbour<Exam,ExamPlacement>` | ExamSplitMoves.`selectNeighbour(Solution<Exam,ExamPlacement> solution)` Select a split (split an exam into two), a merge (merge two split exams back together) or shuffle operation (move students between two exams that has been split before).

  - ### Uses of Solution in org.cpsolver.ifs.algorithms

    Methods in org.cpsolver.ifs.algorithms with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected boolean` | NeighbourSearch.`accept(NeighbourSearch.NeighbourSearchContext context, Solution<V,T> solution, Neighbour<V,T> neighbour)` True if the generated move is to be accepted.
    `protected void` | GreatDeluge.GreatDelugeContext.`activate(Solution<V,T> solution)` Setup the bound
    `protected void` | HillClimber.HillClimberContext.`activate(Solution<V,T> solution)` Reset the idle iterations counter
    `protected void` | NeighbourSearch.NeighbourSearchContext.`activate(Solution<V,T> solution)` Called just before the neighbourhood search is called for the first time.
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`activate(Solution<V,T> solution)` Setup the temperature
    `void` | StepCountingHillClimber.StepCountingHillClimberContext.`activate(Solution<V,T> solution)` Reset the bound and the steps counter.
    `void` | NeighbourSearch.`bestCleared(Solution<V,T> solution)`
    `void` | NeighbourSearch.NeighbourSearchContext.`bestCleared(Solution<V,T> solution)`
    `void` | ParallelConstruction.`bestCleared(Solution<V,T> solution)`
    `void` | NeighbourSearch.`bestRestored(Solution<V,T> solution)`
    `void` | NeighbourSearch.NeighbourSearchContext.`bestRestored(Solution<V,T> solution)`
    `void` | ParallelConstruction.`bestRestored(Solution<V,T> solution)`
    `void` | GreatDeluge.GreatDelugeContext.`bestSaved(Solution<V,T> solution)` Update last improving iteration count
    `void` | NeighbourSearch.`bestSaved(Solution<V,T> solution)`
    `void` | NeighbourSearch.NeighbourSearchContext.`bestSaved(Solution<V,T> solution)`
    `void` | ParallelConstruction.`bestSaved(Solution<V,T> solution)`
    `void` | SimulatedAnnealing.SimulatedAnnealingContext.`bestSaved(Solution<V,T> solution)` Memorize the iteration when the last best solution was found.
    `protected boolean` | HillClimber.HillClimberContext.`canContinue(Solution<V,T> solution)` Stop the search after a given number of idle (not improving) iterations
    `protected boolean` | NeighbourSearch.NeighbourSearchContext.`canContinue(Solution<V,T> solution)` Return false if the search is to be stopped.
    `protected boolean` | StepCountingHillClimber.StepCountingHillClimberContext.`canContinue(Solution<V,T> solution)` Stop the search when the number of idle iterations is reached and the bound is no longer decreasing
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`cool(Solution<V,T> solution)` Cool temperature
    `protected void` | NeighbourSearch.NeighbourSearchContext.`deactivate(Solution<V,T> solution)` Called when the search cannot continue, just before a null neighbour is returned
    `Neighbour<V,T>` | NeighbourSearch.`generateMove(Solution<V,T> solution)` Generate a random move
    `void` | NeighbourSearch.`getInfo(Solution<V,T> solution, Map<String,String> info)`
    `void` | NeighbourSearch.NeighbourSearchContext.`getInfo(Solution<V,T> solution, Map<String,String> info)`
    `void` | ParallelConstruction.`getInfo(Solution<V,T> solution, Map<String,String> info)`
    `void` | NeighbourSearch.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)`
    `void` | NeighbourSearch.NeighbourSearchContext.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)`
    `void` | ParallelConstruction.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)`
    `protected void` | GreatDeluge.GreatDelugeContext.`incIteration(Solution<V,T> solution)` Increment iteration count, update bound
    `protected void` | HillClimber.HillClimberContext.`incIteration(Solution<V,T> solution)` Increase iteration counter
    `protected void` | NeighbourSearch.NeighbourSearchContext.`incIteration(Solution<V,T> solution)` Increment iteration counters etc.
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`incIteration(Solution<V,T> solution)` Increment iteration counter, cool/reheat/restoreBest if necessary
    `void` | StepCountingHillClimber.StepCountingHillClimberContext.`incIteration(Solution<V,T> solution)` Increase iteration number, also update bound when the given number of steps is reached.
    `boolean` | NeighbourSearch.`isMaster(Solution<V,T> solution)` In single solution multiple threads environments return true if the given solution is of the first thread
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`reheat(Solution<V,T> solution)` Reheat temperature
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`restoreBest(Solution<V,T> solution)` restore best ever found solution
    `Neighbour<V,T>` | MetaHeuristicSearch.`selectNeighbour(Solution<V,T> solution)` Neighbour selection.
    `Neighbour<V,T>` | NeighbourSearch.`selectNeighbour(Solution<V,T> solution)`
    `Neighbour<V,T>` | NeighbourSelector.`selectNeighbour(Solution<V,T> solution)` Neighbour selection -- use `NeighbourSelection.selectNeighbour(Solution)` update stats if desired.
    `Neighbour<V,T>` | ParallelConstruction.`selectNeighbour(Solution<V,T> solution)`
    `Neighbour<V,T>` | SimpleSearch.`selectNeighbour(Solution<V,T> solution)` Neighbour selection.
    `void` | NeighbourSearch.`solutionUpdated(Solution<V,T> solution)`
    `void` | NeighbourSearch.NeighbourSearchContext.`solutionUpdated(Solution<V,T> solution)`
    `void` | ParallelConstruction.`solutionUpdated(Solution<V,T> solution)`
    `protected void` | SimulatedAnnealing.SimulatedAnnealingContext.`train(Solution<V,T> solution)` Set initial temperature based on the training period
    `protected void` | SimpleSearch.`updateProgress(int phase, Solution<V,T> solution)`

  - ### Uses of Solution in org.cpsolver.ifs.algorithms.neighbourhoods

    Methods in org.cpsolver.ifs.algorithms.neighbourhoods with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected Double` | RandomSwapMove.`resolve(Solution<V,T> solution, double total, long startTime, Map<V,T> assignments, List<T> conflicts, int index)` Try to resolve given conflicts.
    `Neighbour<V,T>` | RandomMove.`selectNeighbour(Solution<V,T> solution)`
    `Neighbour<V,T>` | RandomSwapMove.`selectNeighbour(Solution<V,T> solution)`
    `Neighbour<V,T>` | SuggestionMove.`selectNeighbour(Solution<V,T> solution)`

  - ### Uses of Solution in org.cpsolver.ifs.assignment

    Constructors in org.cpsolver.ifs.assignment with parameters of type Solution
    Constructor and Description
    `DefaultInheritedAssignment(Solution<V,T> parent, int index)`
    `DefaultParallelAssignment(AssignmentContextHolder<V,T> contexts, int threadIndex, Solution<V,T> solution)`
    `InheritedAssignmentArray(Solution<V,T> parent, int index)`
    `OptimisticInheritedAssignment(Solution<V,T> parent, int index)`

  - ### Uses of Solution in org.cpsolver.ifs.dbt

    Methods in org.cpsolver.ifs.dbt with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `T` | DbtValueSelection.`selectValue(Solution<V,T> solution, V selectedVariable)` Value selection
    `V` | DbtVariableSelection.`selectVariable(Solution<V,T> solution)` Variable selection

  - ### Uses of Solution in org.cpsolver.ifs.example.tt

    Methods in org.cpsolver.ifs.example.tt with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | TimetableModel.`saveAsXML(DataProperties cfg, boolean gen, Solution<Activity,Location> solution, Assignment<Activity,Location> assignment, File outFile)`

  - ### Uses of Solution in org.cpsolver.ifs.extension

    Methods in org.cpsolver.ifs.extension with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | SearchIntensification.`bestCleared(Solution<V,T> solution)`
    `void` | SearchIntensification.`bestRestored(Solution<V,T> solution)`
    `void` | SearchIntensification.`bestSaved(Solution<V,T> solution)`
    `void` | SearchIntensification.Context.`bestSaved(Solution<V,T> solution)`
    `void` | SearchIntensification.`getInfo(Solution<V,T> solution, Map<String,String> info)`
    `void` | SearchIntensification.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)`
    `void` | SearchIntensification.`solutionUpdated(Solution<V,T> solution)`

  - ### Uses of Solution in org.cpsolver.ifs.heuristics

    Fields in org.cpsolver.ifs.heuristics declared as Solution
    Modifier and Type | Field and Description
    --- | ---
    `protected Solution<V,T>` | BacktrackNeighbourSelection.BacktrackNeighbourSelectionContext.`iSolution`

    Methods in org.cpsolver.ifs.heuristics with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | MaxIdleNeighbourSelection.`bestCleared(Solution<V,T> solution)`
    `void` | MaxIdleNeighbourSelection.`bestRestored(Solution<V,T> solution)`
    `void` | MaxIdleNeighbourSelection.`bestSaved(Solution<V,T> solution)`
    `int` | BacktrackNeighbourSelection.BackTrackNeighbour.`compareTo(Solution<V,T> solution)` Compare two neighbours
    `void` | MaxIdleNeighbourSelection.`getInfo(Solution<V,T> solution, Map<String,String> info)`
    `void` | MaxIdleNeighbourSelection.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)`
    `void` | MaxIdleNeighbourSelection.MaxIdleContext.`reset(Solution<V,T> solution)`
    `Neighbour<V,T>` | BacktrackNeighbourSelection.`selectNeighbour(Solution<V,T> solution)` Select neighbour.
    `Neighbour<V,T>` | MaxIdleNeighbourSelection.`selectNeighbour(Solution<V,T> solution)`
    `Neighbour<V,T>` | NeighbourSelection.`selectNeighbour(Solution<V,T> solution)` select a neighbour of a given solution
    `Neighbour<V,T>` | RoundRobinNeighbourSelection.`selectNeighbour(Solution<V,T> solution)` Select neighbour.
    `Neighbour<V,T>` | StandardNeighbourSelection.`selectNeighbour(Solution<V,T> solution)` Select neighbour.
    `Neighbour<V,T>` | BacktrackNeighbourSelection.`selectNeighbour(Solution<V,T> solution, V variable)` Select neighbour -- starts from the provided variable.
    `protected void` | BacktrackNeighbourSelection.`selectNeighbour(Solution<V,T> solution, V variable, BacktrackNeighbourSelection.BacktrackNeighbourSelectionContext context)`
    `T` | GeneralValueSelection.`selectValue(Solution<V,T> solution, V selectedVariable)` Value selection
    `T` | StandardNeighbourSelection.`selectValue(Solution<V,T> solution, V variable)` Use the provided value selection criterion to select a value to the selected variable
    `T` | ValueSelection.`selectValue(Solution<V,T> solution, V selectedVariable)` Value selection
    `V` | GeneralVariableSelection.`selectVariable(Solution<V,T> solution)` Variable selection
    `V` | StandardNeighbourSelection.`selectVariable(Solution<V,T> solution)` Use the provided variable selection criterion to select a variable
    `V` | VariableSelection.`selectVariable(Solution<V,T> solution)` Variable selection
    `void` | MaxIdleNeighbourSelection.`solutionUpdated(Solution<V,T> solution)`

    Constructors in org.cpsolver.ifs.heuristics with parameters of type Solution
    Constructor and Description
    `BacktrackNeighbourSelectionContext(Solution<V,T> solution)`

  - ### Uses of Solution in org.cpsolver.ifs.model

    Methods in org.cpsolver.ifs.model with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `InheritedAssignment<V,T>` | Model.`createInheritedAssignment(Solution<V,T> solution, int index)` Create a new inherited assignment from the given solution

  - ### Uses of Solution in org.cpsolver.ifs.solution

    Methods in org.cpsolver.ifs.solution with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | SolutionListener.`bestCleared(Solution<V,T> solution)` Called by the solution when method `clearBest()` is called.
    `void` | SolutionListener.`bestRestored(Solution<V,T> solution)` Called by the solution when method `restoreBest()` is called.
    `void` | SolutionListener.`bestSaved(Solution<V,T> solution)` Called by the solution when method `saveBest()` is called.
    `void` | SolutionListener.`getInfo(Solution<V,T> solution, Map<String,String> info)` Called by the solution when it is asked to produce info table, see `getInfo()`.
    `void` | SolutionListener.`getInfo(Solution<V,T> solution, Map<String,String> info, Collection<V> variables)` Called by the solution when it is asked to produce info table, see `getInfo()`.
    `boolean` | GeneralSolutionComparator.`isBetterThanBestSolution(Solution<V,T> currentSolution)`
    `boolean` | MPPSolutionComparator.`isBetterThanBestSolution(Solution<V,T> currentSolution)`
    `boolean` | SolutionComparator.`isBetterThanBestSolution(Solution<V,T> currentSolution)` Compares two solutions.
    `void` | Solution.`saveBest(Solution<V,T> master)` Save the current solution as the best ever found solution (it also calls `Model.saveBest(Assignment)`)
    `boolean` | Solution.`saveBestIfImproving(Solution<V,T> master, SolutionComparator<V,T> comparator)`
    `void` | SolutionListener.`solutionUpdated(Solution<V,T> solution)` Called by the solution when it is updated, see `update(double)`.
    `void` | Solution.`update(double time, boolean success, Solution<V,T> master)` Update time, increment current iteration
    `void` | Solution.`update(double time, Solution<V,T> master)` Update time, increment current iteration

  - ### Uses of Solution in org.cpsolver.ifs.solver

    Fields in org.cpsolver.ifs.solver declared as Solution
    Modifier and Type | Field and Description
    --- | ---
    `protected Solution<V,T>` | Solver.`iCurrentSolution` current solution
    `protected Solution<V,T>` | Solver.`iLastSolution` last solution (after IFS Solver finishes)

    Methods in org.cpsolver.ifs.solver that return Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected Solution<V,T>` | ParallelSolver.`createParallelSolution(int index)` Create a solution that is to be used by a solver thread of the given index
    `Solution<V,T>` | Solver.`currentSolution()` Current solution (during the search)
    `protected Solution<V,T>` | ParallelSolver.`getWorkingSolution()` Return a working (parallel) solution that contributed to the best solution last.
    `Solution<V,T>` | Solver.`lastSolution()` Last solution (when solver finishes)

    Methods in org.cpsolver.ifs.solver with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected void` | Solver.`onAssigned(double startTime, Solution<V,T> solution)` Called in each iteration, after a neighbour is assigned
    `void` | Solver.`setInitalSolution(Solution<V,T> solution)` Sets initial solution

  - ### Uses of Solution in org.cpsolver.ifs.termination

    Methods in org.cpsolver.ifs.termination with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | GeneralTerminationCondition.`canContinue(Solution<V,T> currentSolution)`
    `boolean` | MPPTerminationCondition.`canContinue(Solution<V,T> currentSolution)`
    `boolean` | TerminationCondition.`canContinue(Solution<V,T> currentSolution)` Returns true when the solver can continue with the next iteration

  - ### Uses of Solution in org.cpsolver.ifs.util

    Methods in org.cpsolver.ifs.util that return Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected Solution<V,T>` | ProblemSaver.`getSolution()` Solution to be saved

  - ### Uses of Solution in org.cpsolver.studentsct

    Methods in org.cpsolver.studentsct that return Solution
    Modifier and Type | Method and Description
    --- | ---
    `static Solution<Request,Enrollment>` | Test.`batchSectioning(DataProperties cfg)` Batch sectioning test
    `static Solution<Request,Enrollment>` | Test.`combineStudents(DataProperties cfg, File lastLikeStudentData, File realStudentData)` Combine students from the provided two files
    `Solution<Request,Enrollment>` | StudentSctBBTest.`getSolution()` Compute and return the sectioning solution.
    `static Solution<Request,Enrollment>` | Test.`load(DataProperties cfg)` Load student sectioning model
    `static Solution<Request,Enrollment>` | Test.`onlineSectioning(DataProperties cfg)` Online sectioning test
    `static Solution<Request,Enrollment>` | Test.`solve(Solution<Request,Enrollment> solution, DataProperties cfg)` Solve the student sectioning problem using IFS solver

    Methods in org.cpsolver.studentsct with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `void` | Test.TestSolutionListener.`bestCleared(Solution<Request,Enrollment> solution)`
    `void` | Test.TestSolutionListener.`bestRestored(Solution<Request,Enrollment> solution)`
    `void` | Test.TestSolutionListener.`bestSaved(Solution<Request,Enrollment> solution)`
    `InheritedAssignment<Request,Enrollment>` | StudentSectioningModel.`createInheritedAssignment(Solution<Request,Enrollment> solution, int index)`
    `void` | Test.TestSolutionListener.`getInfo(Solution<Request,Enrollment> solution, Map<String,String> info)`
    `void` | Test.TestSolutionListener.`getInfo(Solution<Request,Enrollment> solution, Map<String,String> info, Collection<Request> variables)`
    `static void` | Test.`printInfo(Solution<Request,Enrollment> solution, boolean computeTables, boolean computeSectInfos, boolean runChecks)` Print some information about the solution
    `static void` | Test.`saveInfoToXML(Solution<Request,Enrollment> solution, Map<String,String> extra, File file)` Save solution info as XML
    `void` | Test.TestSolutionListener.`solutionUpdated(Solution<Request,Enrollment> solution)`
    `static Solution<Request,Enrollment>` | Test.`solve(Solution<Request,Enrollment> solution, DataProperties cfg)` Solve the student sectioning problem using IFS solver

  - ### Uses of Solution in org.cpsolver.studentsct.heuristics

    Methods in org.cpsolver.studentsct.heuristics with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `protected RouletteWheelSelection<Request>` | RouletteWheelRequestSelection.`getRoulette(Solution<Request,Enrollment> solution)` Populate roulette wheel selection, if null or empty.
    `Neighbour<Request,Enrollment>` | RestoreBestSolution.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | TwoPhaseStudentSctNeighbourSelection.RestoreDummyStudents.`selectNeighbour(Solution<Request,Enrollment> solution)` Return all (removed) dummy students into the problem
    `Enrollment` | EnrollmentSelection.`selectValue(Solution<Request,Enrollment> solution, Request selectedVariable)` Value selection
    `Enrollment` | EnrollmentSelection.`selectValue(Solution<Request,Enrollment> solution, Request selectedVariable, AssignmentCheck<Request,Enrollment> test)`
    `Request` | RouletteWheelRequestSelection.`selectVariable(Solution<Request,Enrollment> solution)` Variable selection.

  - ### Uses of Solution in org.cpsolver.studentsct.heuristics.selection

    Methods in org.cpsolver.studentsct.heuristics.selection with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | StandardSelection.`accept(SimpleNeighbour<Request,Enrollment> n, Solution<Request,Enrollment> solution)` Check whether the given neighbors can be returned
    `Neighbour<Request,Enrollment>` | PriorityConstructionSelection.`branchAndBound(Solution<Request,Enrollment> solution)` Find best solution for the next student using `BranchBoundSelection`.
    `protected void` | PriorityConstructionSelection.`nextCycle(Solution<Request,Enrollment> solution)` Increment cycle
    `protected Request` | UnassignedCriticalCourseRequestSelection.`nextRequest(Solution<Request,Enrollment> solution)`
    `protected Request` | UnassignedRequestSelection.`nextRequest(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | AssignInitialSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | BacktrackSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | BranchBoundSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` Select neighbour.
    `Neighbour<Request,Enrollment>` | CriticalCoursesBranchAndBoundSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | MinCreditBranchAndBoundSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | PriorityConstructionSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` Select neighbor.
    `Neighbour<Request,Enrollment>` | RandomUnassignmentSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` With the given probabilty, a student is randomly selected to be unassigned.
    `Neighbour<Request,Enrollment>` | ResectionIncompleteStudentsSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` Select neighbour.
    `Neighbour<Request,Enrollment>` | ResectionUnassignedStudentsSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` Select neighbour.
    `Neighbour<Request,Enrollment>` | RndUnProblStudSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` With the given probabilty, a problematic student is randomly selected to be unassigned.
    `Neighbour<Request,Enrollment>` | ShuffleStudentsSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | StandardSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` Employ the provided `VariableSelection` and `ValueSelection` and return the selected value as `SimpleNeighbour`.
    `Neighbour<Request,Enrollment>` | StudentEnrollmentSwapSelection.`selectNeighbour(Solution<Request,Enrollment> solution)`
    `Neighbour<Request,Enrollment>` | SwapStudentSelection.`selectNeighbour(Solution<Request,Enrollment> solution)` For each student that does not have a complete schedule, try to find a request and a student that can be moved out of an enrollment so that the selected student can be assigned to the selected request.
    `protected Neighbour<Request,Enrollment>` | ShuffleStudentsSelection.ShuffleBacktrackNeighbourSelection.`selectNeighbour(Solution<Request,Enrollment> solution, org.cpsolver.studentsct.heuristics.selection.ShuffleStudentsSelection.Shuffle shuffle)`
    `Request` | UnassignedCriticalCourseRequestSelection.`selectVariable(Solution<Request,Enrollment> solution)`
    `Request` | UnassignedRequestSelection.`selectVariable(Solution<Request,Enrollment> solution)`

  - ### Uses of Solution in org.cpsolver.studentsct.online.selection

    Methods in org.cpsolver.studentsct.online.selection with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | StudentSchedulingAssistantWeights.`isBetterThanBestSolution(Solution<Request,Enrollment> currentSolution)`

  - ### Uses of Solution in org.cpsolver.studentsct.weights

    Methods in org.cpsolver.studentsct.weights with parameters of type Solution
    Modifier and Type | Method and Description
    --- | ---
    `boolean` | EqualStudentWeights.`isBetterThanBestSolution(Solution<Request,Enrollment> currentSolution)`
    `boolean` | OriginalStudentWeights.`isBetterThanBestSolution(Solution<Request,Enrollment> currentSolution)`
    `boolean` | PriorityStudentWeights.`isBetterThanBestSolution(Solution<Request,Enrollment> currentSolution)`