Skip to content

Commit aac95e6

Browse files
committed
Student Scheduling Solver: Reload Input Data
- order the requests during assignments (restoring best and current solution from the previous solver) to avoid conflicts caused by an incorrect assignment order
1 parent 7cfebfb commit aac95e6

1 file changed

Lines changed: 73 additions & 44 deletions

File tree

JavaSource/org/unitime/timetable/solver/studentsct/StudentSolver.java

Lines changed: 73 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,17 @@ private Enrollment getEnrollment(Request request, Enrollment enrollment) {
359359
}
360360
sections.add(section);
361361
}
362-
return cr.createEnrollment(currentSolution().getAssignment(), sections);
362+
Enrollment ret = cr.createEnrollment(currentSolution().getAssignment(), sections);
363+
if (enrollment.getReservation() != null) {
364+
for (Reservation reservation: cr.getReservations(ret.getCourse())) {
365+
if (reservation.getId() == enrollment.getReservation().getId() && reservation.isIncluded(ret)) {
366+
ret.setReservation(reservation); break;
367+
}
368+
}
369+
} else {
370+
ret.setReservation(null);
371+
}
372+
return ret;
363373
}
364374
}
365375

@@ -399,59 +409,78 @@ private void unassignAll() {
399409
public void execute() {
400410
iProgress = Progress.getInstance(currentSolution().getModel());
401411

402-
Map<Long, Map<Long, Request>> requests = new Hashtable<Long, Map<Long,Request>>();
403-
for (Request request: currentSolution().getModel().variables()) {
404-
Map<Long, Request> r = requests.get(request.getStudent().getId());
405-
if (r == null) {
406-
r = new Hashtable<Long, Request>();
407-
requests.put(request.getStudent().getId(), r);
408-
}
409-
r.put(request.getId(), request);
410-
}
411-
412412
if (!iBestAssignmentTable.isEmpty()) {
413-
iProgress.setPhase("Creating best assignment ...", iBestAssignmentTable.size());
413+
iProgress.setPhase("Creating best assignment ...", currentSolution().getModel().variables().size());
414414
unassignAll();
415-
for (Map.Entry<Long, Map<Long, Enrollment>> e1: iBestAssignmentTable.entrySet()) {
416-
Map<Long, Request> r = requests.get(e1.getKey());
417-
iProgress.incProgress();
418-
if (r == null) continue;
419-
for (Map.Entry<Long, Enrollment> e2: e1.getValue().entrySet()) {
420-
Request request = r.get(e2.getKey());
421-
if (request == null) continue;
422-
Enrollment enrollment = getEnrollment(request, e2.getValue());
423-
if (enrollment!=null) assign(enrollment, false);
424-
}
415+
416+
List<Request> sortedRequests = new ArrayList<Request>(currentSolution().getModel().variables());
417+
Collections.sort(sortedRequests, new Comparator<Request>() {
418+
@Override
419+
public int compare(Request r1, Request r2) {
420+
// Get best assignments
421+
Map<Long, Enrollment> a1 = iBestAssignmentTable.get(r1.getStudent().getId());
422+
Enrollment e1 = (a1 == null ? null : a1.get(r1.getId()));
423+
Map<Long, Enrollment> a2 = iBestAssignmentTable.get(r2.getStudent().getId());
424+
Enrollment e2 = (a2 == null ? null : a2.get(r2.getId()));
425+
// Enrollments with a reservation must go first, enrollments with an override go last
426+
// Not-assigned requests go last
427+
Integer o1 = (e1 == null ? 4 : e1.getReservation() == null ? 2 : e1.getReservation().isExpired() ? 3 : 1);
428+
Integer o2 = (e2 == null ? 4 : e2.getReservation() == null ? 2 : e2.getReservation().isExpired() ? 3 : 1);
429+
if (!o1.equals(o2)) return o1.compareTo(o2);
430+
// Then student and priority
431+
return r1.compareTo(r2);
432+
}
433+
});
434+
for (Request request: sortedRequests) {
435+
iProgress.incProgress();
436+
Map<Long, Enrollment> a = iBestAssignmentTable.get(request.getStudent().getId());
437+
Enrollment e = (a == null ? null : a.get(request.getId()));
438+
if (e == null) continue;
439+
Enrollment enrollment = getEnrollment(request, e);
440+
if (enrollment!=null) assign(enrollment, false);
425441
}
426442
currentSolution().saveBest();
427443
}
428444
if (!iInitialAssignmentTable.isEmpty()) {
429-
iProgress.setPhase("Creating initial assignment ...", iInitialAssignmentTable.size());
430-
for (Map.Entry<Long, Map<Long, Enrollment>> e1: iInitialAssignmentTable.entrySet()) {
431-
Map<Long, Request> r = requests.get(e1.getKey());
432-
iProgress.incProgress();
433-
if (r == null) continue;
434-
for (Map.Entry<Long, Enrollment> e2: e1.getValue().entrySet()) {
435-
Request request = r.get(e2.getKey());
436-
if (request == null) continue;
437-
Enrollment enrollment = getEnrollment(request, e2.getValue());
438-
if (enrollment!=null) request.setInitialAssignment(enrollment);
439-
}
445+
iProgress.setPhase("Creating initial assignment ...", currentSolution().getModel().variables().size());
446+
for (Request request: currentSolution().getModel().variables()) {
447+
iProgress.incProgress();
448+
Map<Long, Enrollment> a = iInitialAssignmentTable.get(request.getStudent().getId());
449+
Enrollment e = (a == null ? null : a.get(request.getId()));
450+
if (e == null) continue;
451+
Enrollment enrollment = getEnrollment(request, e);
452+
if (enrollment!=null) request.setInitialAssignment(enrollment);
440453
}
441454
}
442455
if (!iCurrentAssignmentTable.isEmpty()) {
443-
iProgress.setPhase("Creating current assignment ...", iCurrentAssignmentTable.size());
456+
iProgress.setPhase("Creating current assignment ...", currentSolution().getModel().variables().size());
444457
unassignAll();
445-
for (Map.Entry<Long, Map<Long, Enrollment>> e1: iCurrentAssignmentTable.entrySet()) {
446-
Map<Long, Request> r = requests.get(e1.getKey());
447-
iProgress.incProgress();
448-
if (r == null) continue;
449-
for (Map.Entry<Long, Enrollment> e2: e1.getValue().entrySet()) {
450-
Request request = r.get(e2.getKey());
451-
if (request == null) continue;
452-
Enrollment enrollment = getEnrollment(request, e2.getValue());
453-
if (enrollment!=null) assign(enrollment, true);
454-
}
458+
459+
List<Request> sortedRequests = new ArrayList<Request>(currentSolution().getModel().variables());
460+
Collections.sort(sortedRequests, new Comparator<Request>() {
461+
@Override
462+
public int compare(Request r1, Request r2) {
463+
// Get current assignments
464+
Map<Long, Enrollment> a1 = iCurrentAssignmentTable.get(r1.getStudent().getId());
465+
Enrollment e1 = (a1 == null ? null : a1.get(r1.getId()));
466+
Map<Long, Enrollment> a2 = iCurrentAssignmentTable.get(r2.getStudent().getId());
467+
Enrollment e2 = (a2 == null ? null : a2.get(r2.getId()));
468+
// Enrollments with a reservation must go first, enrollments with an override go last
469+
// Not-assigned requests go last
470+
Integer o1 = (e1 == null ? 4 : e1.getReservation() == null ? 2 : e1.getReservation().isExpired() ? 3 : 1);
471+
Integer o2 = (e2 == null ? 4 : e2.getReservation() == null ? 2 : e2.getReservation().isExpired() ? 3 : 1);
472+
if (!o1.equals(o2)) return o1.compareTo(o2);
473+
// Then student and priority
474+
return r1.compareTo(r2);
475+
}
476+
});
477+
for (Request request: sortedRequests) {
478+
iProgress.incProgress();
479+
Map<Long, Enrollment> a = iCurrentAssignmentTable.get(request.getStudent().getId());
480+
Enrollment e = (a == null ? null : a.get(request.getId()));
481+
if (e == null) continue;
482+
Enrollment enrollment = getEnrollment(request, e);
483+
if (enrollment!=null) assign(enrollment, true);
455484
}
456485
}
457486
iCurrentAssignmentTable.clear();

0 commit comments

Comments
 (0)