
org.cpsolver.exam.criteria.PeriodSizePenalty Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cpsolver Show documentation
Show all versions of cpsolver Show documentation
The constraint solver library contains a local search based framework that allows
modeling of a problem using constraint programming primitives (variables, values, constraints).
The newest version!
package org.cpsolver.exam.criteria;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import org.cpsolver.exam.model.Exam;
import org.cpsolver.exam.model.ExamPeriodPlacement;
import org.cpsolver.exam.model.ExamPlacement;
import org.cpsolver.ifs.assignment.Assignment;
import org.cpsolver.ifs.util.DataProperties;
/**
* A weight for period penalty (used in
* {@link ExamPeriodPlacement#getPenalty()} multiplied by examination size
* {@link Exam#getSize()}. Can be set by problem property
* Exams.PeriodSizeWeight, or in the input xml file, property periodSizeWeight).
*
*
*
* @author Tomas Muller
* @version ExamTT 1.3 (Examination Timetabling)
* Copyright (C) 2008 - 2014 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 PeriodSizePenalty extends ExamCriterion {
@Override
public String getWeightName() {
return "Exams.PeriodSizeWeight";
}
@Override
public String getXmlWeightName() {
return "periodSizeWeight";
}
@Override
public double getWeightDefault(DataProperties config) {
return 1.0;
}
@Override
public double getValue(Assignment assignment, ExamPlacement value, Set conflicts) {
return value.getPeriodPlacement().getPenalty() * (value.variable().getSize() + 1);
}
@Override
public String getName() {
return "Period×Size Penalty";
}
@Override
public double[] getBounds(Assignment assignment, Collection variables) {
double[] bounds = new double[] { 0.0, 0.0 };
for (Exam exam : variables) {
if (!exam.getPeriodPlacements().isEmpty()) {
int minSizePenalty = Integer.MAX_VALUE, maxSizePenalty = Integer.MIN_VALUE;
for (ExamPeriodPlacement periodPlacement : exam.getPeriodPlacements()) {
minSizePenalty = Math.min(minSizePenalty, periodPlacement.getPenalty() * (exam.getSize() + 1));
maxSizePenalty = Math.max(maxSizePenalty, periodPlacement.getPenalty() * (exam.getSize() + 1));
}
bounds[0] += minSizePenalty;
bounds[1] += maxSizePenalty;
}
}
return bounds;
}
@Override
public void getInfo(Assignment assignment, Map info) {
if (getValue(assignment) != 0.0) {
info.put(getName(), sDoubleFormat.format(getValue(assignment) / assignment.nrAssignedVariables()));
}
}
@Override
public String toString(Assignment assignment) {
return "PS:" + sDoubleFormat.format(getValue(assignment) / assignment.nrAssignedVariables());
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy