001package org.cpsolver.studentsct.heuristics.selection;
002
003import java.util.ArrayList;
004import java.util.Collections;
005import java.util.LinkedList;
006import java.util.List;
007import java.util.Queue;
008
009import org.cpsolver.ifs.heuristics.VariableSelection;
010import org.cpsolver.ifs.solution.Solution;
011import org.cpsolver.ifs.solver.Solver;
012import org.cpsolver.studentsct.model.Enrollment;
013import org.cpsolver.studentsct.model.Request;
014
015public class UnassignedCriticalCourseRequestSelection implements VariableSelection<Request, Enrollment>{
016    protected Queue<Request> iRequests = null;
017    
018    @Override
019    public void init(Solver<Request, Enrollment> solver) {
020        iRequests = new LinkedList<Request>();
021    }
022
023    @Override
024    public Request selectVariable(Solution<Request, Enrollment> solution) {
025        return nextRequest(solution);
026    }
027    
028    protected synchronized Request nextRequest(Solution<Request, Enrollment> solution) {
029        Request ret = iRequests.poll();
030        if (ret == null) {
031            List<Request> variables = new ArrayList<Request>();
032            for (Request r: solution.getModel().unassignedVariables(solution.getAssignment()))
033                if (r.isCritical()) variables.add(r);
034            Collections.shuffle(variables);
035            iRequests.addAll(variables);
036            ret = iRequests.poll();
037        }
038        return ret;
039    }
040}