001 package net.sf.cpsolver.studentsct.heuristics.selection; 002 003 import java.util.HashSet; 004 005 import net.sf.cpsolver.ifs.heuristics.NeighbourSelection; 006 import net.sf.cpsolver.ifs.heuristics.RoundRobinNeighbourSelection; 007 import net.sf.cpsolver.ifs.model.Neighbour; 008 import net.sf.cpsolver.ifs.solution.Solution; 009 import net.sf.cpsolver.ifs.solver.Solver; 010 import net.sf.cpsolver.ifs.util.DataProperties; 011 import net.sf.cpsolver.ifs.util.Progress; 012 import net.sf.cpsolver.ifs.util.ToolBox; 013 import net.sf.cpsolver.studentsct.model.Student; 014 015 /** 016 * Random unassignment of some problematic students. Problematic students 017 * are to be provided by a neighbour selection that was used before this one by 018 * {@link RoundRobinNeighbourSelection}. 019 * 020 * <br><br> 021 * In each step a problematic student is randomly selected with the given probabilty. 022 * Null is returned otherwise (the controll is passed to the next {@link NeighbourSelection}). 023 * 024 * <br><br> 025 * Parameters: 026 * <br> 027 * <table border='1'><tr><th>Parameter</th><th>Type</th><th>Comment</th></tr> 028 * <tr><td>Neighbour.RandomUnassignmentOfProblemStudentProb</td><td>{@link Double}</td><td>Probability of a random selection of a student from the given set of problematic students.</td></tr> 029 * </table> 030 * <br><br> 031 * 032 * @version 033 * StudentSct 1.1 (Student Sectioning)<br> 034 * Copyright (C) 2007 Tomáš Müller<br> 035 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br> 036 * Lazenska 391, 76314 Zlin, Czech Republic<br> 037 * <br> 038 * This library is free software; you can redistribute it and/or 039 * modify it under the terms of the GNU Lesser General Public 040 * License as published by the Free Software Foundation; either 041 * version 2.1 of the License, or (at your option) any later version. 042 * <br><br> 043 * This library is distributed in the hope that it will be useful, 044 * but WITHOUT ANY WARRANTY; without even the implied warranty of 045 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 046 * Lesser General Public License for more details. 047 * <br><br> 048 * You should have received a copy of the GNU Lesser General Public 049 * License along with this library; if not, write to the Free Software 050 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 051 */ 052 public class RndUnProblStudSelection extends RandomUnassignmentSelection { 053 private ProblemStudentsProvider iProblemStudentsProvider = null; 054 private HashSet iProblemStudents = null; 055 056 /** 057 * Constructor 058 * @param properties configuration 059 * @param psp a class that provides the set of problematic students 060 */ 061 public RndUnProblStudSelection(DataProperties properties, ProblemStudentsProvider psp) { 062 super(properties); 063 iProblemStudentsProvider = psp; 064 iRandom = properties.getPropertyDouble("Neighbour.RandomUnassignmentOfProblemStudentProb", 0.9); 065 } 066 067 /** Initialization -- {@link ProblemStudentsProvider#getProblemStudents()} is called */ 068 public void init(Solver solver) { 069 iProblemStudents = iProblemStudentsProvider.getProblemStudents(); 070 Progress.getInstance(solver.currentSolution().getModel()).setPhase("Random unassignment of problematic students...", 1); 071 } 072 073 /** 074 * With the given probabilty, a problematic student is randomly selected to be unassigned. 075 * Null is returned otherwise. 076 */ 077 public Neighbour selectNeighbour(Solution solution) { 078 if (!iProblemStudents.isEmpty() && Math.random()<iRandom) { 079 Student student = (Student)ToolBox.random(iProblemStudents); 080 iProblemStudents.remove(student); 081 return new UnassignStudentNeighbour(student); 082 } 083 Progress.getInstance(solution.getModel()).incProgress(); 084 return null; 085 } 086 }