/** * Initialization. Enforce arc-consistency over the current (initial) solution. AC3 algorithm is * used. */ @Override public boolean init(Solver<V, T> solver) { boolean isOk = true; iProgress = Progress.getInstance(getModel()); iProgress.save(); iProgress.setPhase("Initializing propagation:", getModel().variables().size()); for (Iterator<V> i = getModel().variables().iterator(); i.hasNext(); ) { V aVariable = i.next(); supportValues(aVariable).clear(); goodValues(aVariable).clear(); } List<T> queue = new ArrayList<T>(); for (Iterator<V> i = getModel().variables().iterator(); i.hasNext(); ) { V aVariable = i.next(); for (Iterator<T> j = aVariable.values().iterator(); j.hasNext(); ) { T aValue = j.next(); initNoGood(aValue, null); goodValues(aVariable).add(aValue); if (revise(aValue)) { queue.add(aValue); } else if (aVariable.getAssignment() != null && !aValue.equals(aVariable.getAssignment())) { Set<T> noGood = new HashSet<T>(); noGood.add(aVariable.getAssignment()); setNoGood(aValue, noGood); queue.add(aValue); } } iProgress.incProgress(); } propagate(queue); iProgress.restore(); return isOk; }
/** * With the given probabilty, a problematic student is randomly selected to be unassigned. Null is * returned otherwise. */ @Override public Neighbour<Request, Enrollment> selectNeighbour(Solution<Request, Enrollment> solution) { if (!iProblemStudents.isEmpty() && Math.random() < iRandom) { Student student = ToolBox.random(iProblemStudents); iProblemStudents.remove(student); return new UnassignStudentNeighbour(student); } Progress.getInstance(solution.getModel()).incProgress(); return null; }
/** Initialization -- {@link ProblemStudentsProvider#getProblemStudents()} is called */ @Override public void init(Solver<Request, Enrollment> solver) { iProblemStudents = iProblemStudentsProvider.getProblemStudents(); Progress.getInstance(solver.currentSolution().getModel()) .setPhase("Random unassignment of problematic students...", 1); }