
org.cpsolver.coursett.criteria.additional.IgnoredCommittedStudentConflict Maven / Gradle / Ivy
package org.cpsolver.coursett.criteria.additional;
import java.util.Collection;
import java.util.Set;
import org.cpsolver.coursett.criteria.StudentConflict;
import org.cpsolver.coursett.model.Lecture;
import org.cpsolver.coursett.model.Placement;
import org.cpsolver.coursett.model.Student;
import org.cpsolver.ifs.assignment.Assignment;
import org.cpsolver.ifs.util.DataProperties;
/**
* Ignored committed student conflicts. This criterion counts committed student conflicts (both overlapping and distance) between classes
* which are connected by a {@link IgnoredStudentConflict} constraint. This criterion was created mostly for debugging
* as these student conflicts are to be ignored.
*
*
* @author Tomas Muller
* @version CourseTT 1.3 (University Course Timetabling)
* Copyright (C) 2013 - 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 IgnoredCommittedStudentConflict extends StudentConflict {
@Override
public double getWeightDefault(DataProperties config) {
return config.getPropertyDouble("Comparator.IgnoredCommitedStudentConflictWeight", 0.0);
}
@Override
public String getPlacementSelectionWeightName() {
return "Placement.NrIgnoredCommitedStudConfsWeight";
}
@Override
public boolean isApplicable(Lecture l1, Lecture l2) {
return l1 != null && l2 != null && ignore(l1, l2) && committed(l1, l2);
}
public int countCommittedConflicts(Student student, Placement placement) {
if (student.getCommitedPlacements() == null) return 0;
int conflicts = 0;
Lecture lecture = placement.variable();
for (Placement commitedPlacement : student.getCommitedPlacements()) {
Lecture commitedLecture = commitedPlacement.variable();
if (lecture.getSchedulingSubpartId() != null && lecture.getSchedulingSubpartId().equals(commitedLecture.getSchedulingSubpartId())) continue;
if (ignore(lecture, commitedLecture) && (overlaps(placement, commitedPlacement) || distance(getMetrics(), placement, commitedPlacement)))
conflicts ++;
}
if (conflicts == 0) return 0;
double w = student.getOfferingWeight((placement.variable()).getConfiguration());
return (int) Math.round(student.avg(w, 1.0) * conflicts);
}
public double countCommittedConflicts(Placement placement) {
double ret = 0;
Lecture lecture = placement.variable();
for (Student student : lecture.students()) {
ret += countCommittedConflicts(student, placement);
}
return ret;
}
@Override
public double[] getBounds(Assignment assignment, Collection variables) {
double[] bounds = super.getBounds(assignment, variables);
for (Lecture lecture: variables) {
Double max = null;
for (Placement placement: lecture.values(assignment)) {
if (max == null) { max = Double.valueOf(countCommittedConflicts(placement)); continue; }
max = Math.max(max, countCommittedConflicts(placement));
}
if (max != null) bounds[0] += max;
}
return bounds;
}
@Override
public double getValue(Assignment assignment, Placement value, Set conflicts) {
double ret = super.getValue(assignment, value, conflicts);
ret += countCommittedConflicts(value);
if (iIncludeConflicts && conflicts != null)
for (Placement conflict: conflicts)
ret -= countCommittedConflicts(conflict);
return ret;
}
@Override
public double getValue(Assignment assignment, Collection variables) {
double ret = super.getValue(assignment, variables);
for (Lecture lect: variables) {
Placement plac = assignment.getValue(lect);
if (plac != null)
ret += countCommittedConflicts(plac);
}
return Math.round(ret);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy