All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.cpsolver.exam.criteria.PeriodSizePenalty Maven / Gradle / Ivy

Go to download

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