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}