use of org.cpsolver.exam.model.Exam in project cpsolver by UniTime.
the class InstructorDirectConflicts method getValue.
@Override
public double getValue(Assignment<Exam, ExamPlacement> assignment, Collection<Exam> variables) {
int ret = 0;
ExamModel m = (ExamModel) getModel();
for (ExamPeriod p : m.getPeriods()) {
Map<ExamInstructor, Set<Exam>> instructors = m.getInstructorsOfPeriod(assignment, p);
for (Set<Exam> exams : instructors.values()) {
int nrExams = exams.size();
if (nrExams > 1)
ret += nrExams - 1;
}
}
if (m.isCheckForPeriodOverlaps()) {
for (ExamPeriod p : m.getPeriods()) {
for (ExamPeriod q : m.getPeriods()) {
if (p.getIndex() < q.getIndex() && p.hasIntersection(q)) {
Map<ExamInstructor, Set<Exam>> s1 = m.getInstructorsOfPeriod(assignment, p);
Map<ExamInstructor, Set<Exam>> s2 = m.getInstructorsOfPeriod(assignment, q);
for (Map.Entry<ExamInstructor, Set<Exam>> e : s1.entrySet()) {
ExamInstructor s = e.getKey();
if (!e.getValue().isEmpty()) {
Set<Exam> x = s2.get(s);
if (x != null && x.isEmpty()) {
x1: for (Exam x1 : e.getValue()) {
for (Exam x2 : x) {
if (p.hasIntersection(x1, x2, q)) {
ret += 1;
break x1;
}
}
}
}
}
}
}
}
}
}
return ret;
}
use of org.cpsolver.exam.model.Exam in project cpsolver by UniTime.
the class PeriodPenalty method getBounds.
@Override
public double[] getBounds(Assignment<Exam, ExamPlacement> assignment, Collection<Exam> variables) {
double[] bounds = new double[] { 0.0, 0.0 };
for (Exam exam : variables) {
if (!exam.getPeriodPlacements().isEmpty()) {
int minPenalty = Integer.MAX_VALUE, maxPenalty = Integer.MIN_VALUE;
for (ExamPeriodPlacement periodPlacement : exam.getPeriodPlacements()) {
if (iSoftPeriods != null && (periodPlacement.getExamPenalty() == iSoftPeriods || periodPlacement.getPeriod().getPenalty() == iSoftPeriods))
continue;
minPenalty = Math.min(minPenalty, periodPlacement.getPenalty());
maxPenalty = Math.max(maxPenalty, periodPlacement.getPenalty());
}
bounds[0] += minPenalty;
bounds[1] += maxPenalty;
}
}
return bounds;
}
use of org.cpsolver.exam.model.Exam in project cpsolver by UniTime.
the class RoomPerturbationPenalty method getValue.
@Override
public double getValue(Assignment<Exam, ExamPlacement> assignment, ExamPlacement value, Set<ExamPlacement> conflicts) {
if (!isMPP())
return 0;
Exam exam = value.variable();
ExamPlacement initial = exam.getInitialAssignment();
if (initial == null)
return 0;
int penalty = 0;
if (value.getRoomPlacements() != null)
for (ExamRoomPlacement rp : value.getRoomPlacements()) {
if (initial.getRoomPlacements() == null || !initial.getRoomPlacements().contains(rp))
penalty++;
}
return penalty;
}
use of org.cpsolver.exam.model.Exam in project cpsolver by UniTime.
the class StudentDirectConflicts method getValue.
@Override
public double getValue(Assignment<Exam, ExamPlacement> assignment, Collection<Exam> variables) {
int ret = 0;
ExamModel m = (ExamModel) getModel();
for (ExamPeriod p : m.getPeriods()) {
Map<ExamStudent, Set<Exam>> students = ((ExamModel) getModel()).getStudentsOfPeriod(assignment, p);
for (Set<Exam> exams : students.values()) {
int nrExams = exams.size();
if (nrExams > 1)
ret += nrExams - 1;
}
}
if (m.isCheckForPeriodOverlaps()) {
for (ExamPeriod p : m.getPeriods()) {
for (ExamPeriod q : m.getPeriods()) {
if (p.getIndex() < q.getIndex() && p.hasIntersection(q)) {
Map<ExamStudent, Set<Exam>> s1 = m.getStudentsOfPeriod(assignment, p);
Map<ExamStudent, Set<Exam>> s2 = m.getStudentsOfPeriod(assignment, q);
for (Map.Entry<ExamStudent, Set<Exam>> e : s1.entrySet()) {
ExamStudent s = e.getKey();
if (!e.getValue().isEmpty()) {
Set<Exam> x = s2.get(s);
if (x != null && x.isEmpty()) {
x1: for (Exam x1 : e.getValue()) {
for (Exam x2 : x) {
if (p.hasIntersection(x1, x2, q)) {
ret += 1;
break x1;
}
}
}
}
}
}
}
}
}
}
return ret;
}
use of org.cpsolver.exam.model.Exam in project cpsolver by UniTime.
the class StudentDirectConflicts method getValue.
@Override
public double getValue(Assignment<Exam, ExamPlacement> assignment, ExamPlacement value, Set<ExamPlacement> conflicts) {
Exam exam = value.variable();
int penalty = 0;
ExamPeriod period = value.getPeriod();
ExamModel m = (ExamModel) getModel();
Map<ExamStudent, Set<Exam>> students = m.getStudentsOfPeriod(assignment, period);
for (ExamStudent s : exam.getStudents()) {
Set<Exam> exams = students.get(s);
if (exams == null)
continue;
int nrExams = exams.size() + (exams.contains(exam) ? 0 : 1);
if (nrExams > 1)
penalty++;
}
if (m.isCheckForPeriodOverlaps()) {
for (ExamPeriod p : m.getPeriods()) {
if (period.hasIntersection(p)) {
Map<ExamStudent, Set<Exam>> others = m.getStudentsOfPeriod(assignment, p);
s: for (ExamStudent s : exam.getStudents()) {
Set<Exam> exams = students.get(s);
if (exams == null || exams.size() + (exams.contains(exam) ? 0 : 1) <= 1) {
Set<Exam> other = others.get(s);
if (other != null && !other.isEmpty())
for (Exam x : other) {
if (period.hasIntersection(exam, x, p)) {
penalty++;
continue s;
}
}
}
}
}
}
}
/*
for (ExamStudent s : exam.getStudents()) {
Set<Exam> exams = s.getExams(assignment, period);
if (exams.isEmpty()) continue;
int nrExams = exams.size() + (exams.contains(exam) ? 0 : 1);
if (nrExams > 1)
penalty++;
}
*/
return penalty;
}
Aggregations