001    package ifs.heuristics;
002    
003    import ifs.model.*;
004    import ifs.solution.*;
005    import ifs.solver.*;
006    
007    /**
008     * Variable selection criterion.
009     * <br><br>
010     * The IFS algorithm requires a function that selects a variable to be (re)assigned during 
011     * the current iteration step. This problem is equivalent to a variable selection criterion 
012     * in constraint programming. There are several guidelines for selecting a variable.
013     * In local search, the variable participating in the largest number of violations is 
014     * usually selected first. In backtracking-based algorithms, the first-fail principle is 
015     * often used, i.e., a variable whose instantiation is most complicated is selected first. 
016     * This could be the variable involved in the largest set of constraints or the variable 
017     * with the smallest domain, etc.
018     * <br><br>
019     * We can split the variable selection criterion into two cases. If some variables remain 
020     * unassigned, the “worst” variable among them is selected, i.e., first-fail principle is 
021     * applied. This may, for example, be the variable with the smallest domain or with the 
022     * highest number of hard and/or soft constraints.
023     * <br><br>
024     * The second case occurs when all variables are assigned. Because the algorithm does 
025     * not need to stop when a complete feasible solution is found, the variable selection 
026     * criterion for such case has to be considered as well. Here all variables are assigned 
027     * but the solution is not good enough, e.g., in the sense of violated soft constraints. 
028     * We choose a variable whose change of a value can introduce the best improvement of the 
029     * solution. It may, for example, be a variable whose value violates the highest number of 
030     * soft constraints.
031     * <br><br>
032     * It is possible for the solution to become incomplete again after such an iteration because 
033     * a value which is not consistent with all hard constraints can be selected in the value 
034     * selection criterion. This can also be taken into account in the variable selection 
035     * heuristics.
036     *
037     * @see Solver
038     *
039     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
040     * @version 1.0
041     **/
042    
043    public interface VariableSelection {
044        /** Initialization */
045        public void init(Solver solver);
046        /** Variable selection 
047         * @param solution current solution
048         */
049        public Variable selectVariable(Solution solution);
050    }