001    package ifs.solution;
002    
003    import ifs.util.DataProperties;
004    
005    /**
006     * General implementation of solution comparator for minimal perturbation problem.
007     * <br><br>
008     * The solution is better than the best ever found solution when it has more variables assigned. In the case, when both
009     * solutions have the same number of assigned variables, the one with smaller number of perturbations (i.e., variables
010     * assigned to non-initial values) is selected. When all solution have the same number of assigned variables and 
011     * number of perturbations, better solution is the one with smaller total value, i.e., the sum of {@link ifs.model.Value#toInt()} 
012     * over all assigned variables.
013     *
014     * @see Solution
015     * @see ifs.solver.Solver
016     *
017     * @author <a href="mailto:muller@ktiml.mff.cuni.cz">Tomáš Müller</a>
018     * @version 1.0
019     */
020    public class MPPSolutionComparator implements SolutionComparator {
021        
022        public MPPSolutionComparator() {}
023        /** No parameters are used so far. */
024        public MPPSolutionComparator(DataProperties properties) {
025        }
026        
027        public boolean isBetterThanBestSolution(Solution currentSolution) {
028            if (currentSolution.getBestInfo()==null) return true;
029            int unassigned = currentSolution.getModel().unassignedVariables().size();
030            if (currentSolution.getModel().getBestUnassignedVariables()!=unassigned)
031                return currentSolution.getModel().getBestUnassignedVariables()>unassigned;
032            int pert = currentSolution.getModel().perturbVariables().size();
033            if (currentSolution.getModel().getBestPerturbations()!=pert)
034                return currentSolution.getModel().getBestPerturbations()>pert;
035            return currentSolution.getModel().getTotalValue()<currentSolution.getBestValue();
036        }
037        
038    }