
org.cpsolver.instructor.criteria.SameRoom Maven / Gradle / Ivy
package org.cpsolver.instructor.criteria;
import java.util.Collection;
import java.util.Set;
import org.cpsolver.ifs.assignment.Assignment;
import org.cpsolver.ifs.util.DataProperties;
import org.cpsolver.instructor.model.Instructor;
import org.cpsolver.instructor.model.InstructorSchedulingModel;
import org.cpsolver.instructor.model.TeachingAssignment;
import org.cpsolver.instructor.model.TeachingRequest;
/**
* Same Room. This criterion counts how well are the same room preferences that are set on an {@link Instructor} met
* (counting {@link Instructor#countSameRooms(Assignment, TeachingAssignment, double)}).
*
* @author Tomas Muller
* @version IFS 1.3 (Instructor Sectioning)
* Copyright (C) 2016 Tomas Muller
* [email protected]
* http://muller.unitime.org
*
* This library is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 3 of the
* License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not see
* http://www.gnu.org/licenses/.
*/
public class SameRoom extends InstructorSchedulingCriterion {
private double iDiffTypeWeight = 0.5;
public SameRoom() {
setValueUpdateType(ValueUpdateType.NoUpdate);
}
@Override
public void configure(DataProperties properties) {
super.configure(properties);
iDiffTypeWeight = properties.getPropertyDouble("SameRoom.DifferentTypeWeight", 0.5);
}
@Override
public double getWeightDefault(DataProperties config) {
return 1.0;
}
/**
* Different instructional type weight
* @return penalty for teaching two same-room that are of different instructional type
*/
public double getDifferentTypeWeight() { return iDiffTypeWeight; }
@Override
public double getValue(Assignment assignment, TeachingAssignment value, Set conflicts) {
return value.getInstructor().countSameRooms(assignment, value, iDiffTypeWeight);
}
@Override
protected double[] computeBounds(Assignment assignment) {
double[] bounds = new double[] { 0.0, 0.0 };
for (Instructor instructor: ((InstructorSchedulingModel)getModel()).getInstructors()) {
bounds[1] += Math.abs(instructor.getSameRoomPreference());
}
return bounds;
}
@Override
public double[] getBounds(Assignment assignment, Collection variables) {
double[] bounds = new double[] { 0.0, 0.0 };
for (Instructor instructor: getInstructors(assignment, variables)) {
bounds[1] += Math.abs(instructor.getSameRoomPreference());
}
return bounds;
}
@Override
public double getValue(Assignment assignment, Collection variables) {
double value = 0.0;
for (Instructor instructor: getAssignedInstructors(assignment, variables))
value += instructor.getContext(assignment).countSameRoomPreference(iDiffTypeWeight);
return value;
}
@Override
public String getAbbreviation() {
return "SameRoom";
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy