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; 014import org.cpsolver.studentsct.model.Request.RequestPriority; 015 016public class UnassignedCriticalCourseRequestSelection implements VariableSelection<Request, Enrollment>{ 017 protected Queue<Request> iRequests = null; 018 private RequestPriority iPriority = null; 019 020 UnassignedCriticalCourseRequestSelection(RequestPriority priority) { 021 iPriority = priority; 022 } 023 024 025 @Override 026 public void init(Solver<Request, Enrollment> solver) { 027 iRequests = new LinkedList<Request>(); 028 } 029 030 @Override 031 public Request selectVariable(Solution<Request, Enrollment> solution) { 032 return nextRequest(solution); 033 } 034 035 protected synchronized Request nextRequest(Solution<Request, Enrollment> solution) { 036 Request ret = iRequests.poll(); 037 if (ret == null) { 038 List<Request> variables = new ArrayList<Request>(); 039 for (Request r: solution.getModel().unassignedVariables(solution.getAssignment())) 040 if (iPriority.isCritical(r)) variables.add(r); 041 Collections.shuffle(variables); 042 iRequests.addAll(variables); 043 ret = iRequests.poll(); 044 } 045 return ret; 046 } 047}