001 package net.sf.cpsolver.coursett.model;
002
003 import net.sf.cpsolver.ifs.model.Constraint;
004 import net.sf.cpsolver.ifs.model.ModelListener;
005 import net.sf.cpsolver.ifs.solver.Solver;
006
007 /**
008 * On fly student sectioning. <br>
009 * <br>
010 * In this mode, students are resectioned after each iteration, but only between
011 * classes that are affected by the iteration. This slows down the solver, but
012 * it can dramatically improve results in the case when there is more stress put
013 * on student conflicts (e.g., Woebegon College example).
014 *
015 * <br>
016 * <br>
017 * Parameters:
018 * <table border='1'>
019 * <tr>
020 * <th>Parameter</th>
021 * <th>Type</th>
022 * <th>Comment</th>
023 * </tr>
024 * <tr>
025 * <td>OnFlySectioning.Enabled</td>
026 * <td>{@link Boolean}</td>
027 * <td>Enable on fly sectioning (if enabled, students will be resectioned after
028 * each iteration)</td>
029 * </tr>
030 * <tr>
031 * <td>OnFlySectioning.Recursive</td>
032 * <td>{@link Boolean}</td>
033 * <td>Recursively resection lectures affected by a student swap</td>
034 * </tr>
035 * <tr>
036 * <td>OnFlySectioning.ConfigAsWell</td>
037 * <td>{@link Boolean}</td>
038 * <td>Resection students between configurations as well</td>
039 * </tr>
040 * </table>
041 *
042 * @version CourseTT 1.2 (University Course Timetabling)<br>
043 * Copyright (C) 2006 - 2010 Tomas Muller<br>
044 * <a href="mailto:muller@unitime.org">muller@unitime.org</a><br>
045 * <a href="http://muller.unitime.org">http://muller.unitime.org</a><br>
046 * <br>
047 * This library is free software; you can redistribute it and/or modify
048 * it under the terms of the GNU Lesser General Public License as
049 * published by the Free Software Foundation; either version 3 of the
050 * License, or (at your option) any later version. <br>
051 * <br>
052 * This library is distributed in the hope that it will be useful, but
053 * WITHOUT ANY WARRANTY; without even the implied warranty of
054 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
055 * Lesser General Public License for more details. <br>
056 * <br>
057 * You should have received a copy of the GNU Lesser General Public
058 * License along with this library; if not see
059 * <a href='http://www.gnu.org/licenses/'>http://www.gnu.org/licenses/</a>.
060 */
061
062 public class OnFlySectioning implements ModelListener<Lecture, Placement> {
063 private FinalSectioning iFinalSectioning;
064 private boolean iRecursive = true;
065 private boolean iConfigAsWell = false;
066
067 /**
068 * Constructor
069 *
070 * @param model
071 * timetabling model
072 */
073 public OnFlySectioning(TimetableModel model) {
074 iFinalSectioning = new FinalSectioning(model);
075 }
076
077 @Override
078 public void variableAdded(Lecture variable) {
079 }
080
081 @Override
082 public void variableRemoved(Lecture variable) {
083 }
084
085 @Override
086 public void constraintAdded(Constraint<Lecture, Placement> constraint) {
087 }
088
089 @Override
090 public void constraintRemoved(Constraint<Lecture, Placement> constraint) {
091 }
092
093 @Override
094 public void beforeAssigned(long iteration, Placement value) {
095 }
096
097 @Override
098 public void beforeUnassigned(long iteration, Placement value) {
099 }
100
101 /**
102 * {@link FinalSectioning#resection(Lecture, boolean, boolean)} is called
103 * when given iteration number is greater than zero.
104 */
105 @Override
106 public void afterAssigned(long iteration, Placement value) {
107 if (iteration > 0)
108 iFinalSectioning.resection(value.variable(), iRecursive, iConfigAsWell);
109 }
110
111 @Override
112 public void afterUnassigned(long iteration, Placement value) {
113 }
114
115 /**
116 * Initialization
117 */
118 @Override
119 public boolean init(Solver<Lecture, Placement> solver) {
120 iRecursive = solver.getProperties().getPropertyBoolean("OnFlySectioning.Recursive", true);
121 iConfigAsWell = solver.getProperties().getPropertyBoolean("OnFlySectioning.ConfigAsWell", false);
122 return true;
123 }
124 }