001    package net.sf.cpsolver.studentsct.heuristics.selection;
002    
003    import java.util.Enumeration;
004    import java.util.Vector;
005    
006    import net.sf.cpsolver.ifs.heuristics.NeighbourSelection;
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.StudentSectioningModel;
014    import net.sf.cpsolver.studentsct.model.Request;
015    import net.sf.cpsolver.studentsct.model.Student;
016    
017    /**
018     * Random unassignment of some (randomly selected) students. 
019     * 
020     * <br><br>
021     * In each step a student is randomly selected with the given probabilty.
022     * Null is returned otherwise (controll is passed to the following {@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.RandomUnassignmentProb</td><td>{@link Double}</td><td>Probability of a random selection of a student.</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 RandomUnassignmentSelection implements NeighbourSelection {
053        private Vector iStudents = null;
054        protected double iRandom = 0.5;
055        
056        /** 
057         * Constructor
058         * @param properties configuration
059         */
060        public RandomUnassignmentSelection(DataProperties properties) {
061            iRandom = properties.getPropertyDouble("Neighbour.RandomUnassignmentProb", iRandom);
062        }
063        
064        /**
065         * Initialization
066         */
067        public void init(Solver solver) {
068            iStudents = ((StudentSectioningModel)solver.currentSolution().getModel()).getStudents();
069            Progress.getInstance(solver.currentSolution().getModel()).setPhase("Random unassignment...", 1);
070        }
071        
072        /**
073         * With the given probabilty, a student is randomly selected to be unassigned.
074         * Null is returned otherwise.
075         */
076        public Neighbour selectNeighbour(Solution solution) {
077            if (Math.random()<iRandom) {
078                Student student = (Student)ToolBox.random(iStudents);
079                return new UnassignStudentNeighbour(student);
080            }
081            Progress.getInstance(solution.getModel()).incProgress();
082            return null;
083        }
084        
085        /** Unassignment of all requests of a student */
086        public static class UnassignStudentNeighbour extends Neighbour {
087            private Student iStudent = null;
088            
089            /**
090             * Constructor
091             * @param student a student to be unassigned 
092             */
093            public UnassignStudentNeighbour(Student student) {
094                iStudent = student;
095            }
096            
097            public double value() {
098                double val = 0;
099                for (Enumeration e=iStudent.getRequests().elements();e.hasMoreElements();) {
100                    Request request = (Request)e.nextElement();
101                    if (request.getAssignment()!=null)
102                        val -= request.getAssignment().toDouble();
103                }
104                return val;
105            }
106            
107            /** All requests of the given student are unassigned */
108            public void assign(long iteration) {
109                for (Enumeration e=iStudent.getRequests().elements();e.hasMoreElements();) {
110                    Request request = (Request)e.nextElement();
111                    if (request.getAssignment()!=null)
112                        request.unassign(iteration);
113                }
114            }
115            
116            public String toString() {
117                StringBuffer sb = new StringBuffer("Un{");
118                sb.append(" "+iStudent);
119                sb.append(" }");
120                return sb.toString();
121            }
122            
123        }
124        
125    }