001 package ifs.perturbations;
002
003 import ifs.solution.Solution;
004 import ifs.solver.Solver;
005 import ifs.model.*;
006 import java.util.*;
007
008 /**
009 * Counter of perturbation penalty (minimal perturbation problem).
010 * <br><br>
011 * Many real-life problems are dynamic, with changes in the problem definition occurring after a solution to the initial
012 * formulation has been reached. A minimal perturbation problem incorporates these changes, along with the initial
013 * solution, as a new problem whose solution must be as close as possible to the initial solution. The iterative forward
014 * search algorithm is also made to solve minimal perturbation problems.
015 * <br><br>
016 * To define the minimal perturbation problem, we will consider an initial (original) problem, its solution, a new
017 * problem, and some distance function which allows us to compare solutions of the initial and the new problem.
018 * Subsequently we look for a solution of the new problem with minimal distance from the initial solution. This
019 * distance is expressed by this PerturbationCounter
020 *
021 * @see Solver
022 * @see Solution
023 * @see Variable
024 *
025 * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
026 * @version 1.0
027 */
028 public interface PerturbationsCounter {
029 /** Initialization */
030 public void init(Solver solver);
031
032 /** Returns perturbation penalty, i.e., the distance between current solution and the solution of the initial
033 * problem (see {@link Variable#getInitialAssignment()}).
034 * @param solution current solution
035 */
036 public double getPerturbationPenalty(Solution solution);
037
038 /** Returns perturbation penalty of the solution which become from the current solution when given conflicting
039 * values are unassigned and the selected value is assigned. Since this penalty is used for comparison of
040 * different candidate values in the value selection criterion, it is fully acceptable to just return a difference
041 * between current and the altered solution (which might be easied for computation that the whole perturbation penalty).
042 * @param solution current solution
043 * @param selectedValue value to be selected in the next iteration
044 * @param conflicts conflicting values to be unassigned in the next iteration
045 */
046 public double getPerturbationPenalty(Solution solution, Value selectedValue, Collection conflicts);
047
048 /** Some (perturbation) information about the solution might be returned here.
049 * @param info resultant info table
050 * @param solution current solution
051 */
052 public void getInfo(Dictionary info, Solution solution);
053 }