1 Introduction
2 Related work
3 Problem definition
Symbol | Description |
---|---|
\({\mathcal {S}}\) | set of students |
\({\mathcal {D}}\) | set of disciplines |
\({\mathcal {D}}^0\) | set of disciplines without the dummy discipline (\({\mathcal {D}}^0 = {\mathcal {D}} \setminus \{0\}\)) |
\({\mathcal {G}}\) | set of groups |
\({\mathcal {T}}\) | set of time periods |
\({\mathcal {W}}\) | set of wards |
\({\mathcal {H}}\) | set of hospitals |
\(k_\text {sg}\) | total number of disciplines student s must attend from group g |
\(\varphi _\text {sdg}\) | 1 if student s has discipline d in group g; 0 otherwise |
\(\text {Du}_d\) | duration of discipline d |
\(Sk_{{\overline{d}}d}\) | if discipline \({\overline{d}}\) must be completed before discipline d |
\(\lambda \) | maximum number of disciplines for a student in a hospital |
\(\xi _\text {dwh}\) | 1, if discipline d can be assigned to ward w in hospital h |
\(\text {Dem}_\text {wht}^\text {Min}\) | minimum student requirements for ward w in hospital h in period t |
\(\text {Dem}_\text {wht}^\text {Max}\) | maximum student requirements for ward w in hospital h in period t |
\(\text {Av}_\text {st}\) | 1, if student s is available in period t; 0 otherwise |
\(\text {Ab}_\text {sdh}\) | 1, if student s is qualified for discipline d in hospital h; 0 otherwise |
\(\text {Pr}_\text {sd}^\text {disc}\) | preference of student s about discipline d |
\(\text {Pr}_\text {sh}^\text {hosp}\) | preference of student s about hospital h |
\(\text {Pr}_{d}^\text {trPr}\) | preference of the curriculum manager about discipline d |
\(\alpha \) | weight of student desires objective |
\(\beta \) | weight of fairness between students objective |
M | big number |
Symbol | Domain | Description |
---|---|---|
\(v_\text {sdth}\) | \(\in \{0,1\}\) | 1, if student s starts discipline d at period t in hospital h; 0 otherwise |
\(y_{s{\overline{d}}dh}\) | \(\in \{0,1\}\) | 1, if student s attends discipline d directly after discipline \({\overline{d}}\) in hospital h; 0 otherwise |
\(Ch_\text {sd}\) | \(\in \{0,1\}\) | 1, if student s changes hospital for discipline d; 0 otherwise |
\(W_\text {sd}\) | \(\ge 0\) | number of periods student s has to wait idle before starting discipline d |
\(\text {Des}_s\) | free | aggregated desire score for student s |
\(\text {Des}^\text {min}\) | free | worst aggregated desire score across all students |
4 Instances
4.1 Dataset 1
4.2 Dataset 2
Parameters | Cardinality |
---|---|
Students (\(|{\mathcal {S}}|\)) | 40, 80, 160, 240, 320 |
Disciplines (\(|{\mathcal {D}}|\)) | 12, 24 |
Duration (\(\text {Du}_{d}\)) | 1, 2, 4 |
4.3 Instance features
Instances | \(|{\mathcal {S}}|\) | \(|{\mathcal {D}}|\) | \(\text {Du}_d\) | \(|{\mathcal {T}}|\) | \(|{\mathcal {H}}|\) | P | St | B | Ds | Dp |
---|---|---|---|---|---|---|---|---|---|---|
Instance_10–14 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.796–0.863 | 0.136 | 3 |
Instance_20–24 | 80 | 12 | 1 | 12 | 6 | 1 | 0.000 | 0.790–0.849 | 0.136 | 3 |
Instance_30–34 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.879–0.921 | 0.106 | 2 |
Instance_40–44 | 80 | 12 | 1 | 12 | 6 | 1 | 0.000 | 0.889–0.923 | 0.106 | 2 |
Instance_50–54 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.794–0.878 | 0.091 | 2 |
Instance_60–64 | 80 | 12 | 1 | 12 | 6 | 1 | 0.000 | 0.837–0.862 | 0.091 | 2 |
Instance_70–74 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.808–0.851 | 0.136 | 3 |
Instance_80–84 | 80 | 12 | 1 | 12 | 5 | 1 | 0.000 | 0.816–0.851 | 0.136 | 3 |
Instance_90–94 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.869–0.942 | 0.106 | 2 |
Instance_100–104 | 80 | 12 | 1 | 12 | 5 | 1 | 0.000 | 0.900–0.906 | 0.106 | 2 |
Instance_110–114 | 40 | 12 | 1 | 12 | 3 | 1 | 0.000 | 0.841–0.909 | 0.091 | 2 |
Instance_120–124 | 80 | 12 | 1 | 12 | 5 | 1 | 0.000 | 0.860–0.902 | 0.091 | 2 |
Instance_L10–14 | 40 | 12 | 2 | 12 | 4 | 1 | 0.000 | 0.948–0.970 | 0.136 | 3 |
Instance_L20–24 | 40 | 12 | 4 | 24 | 4 | 1 | 0.000 | 0.933–0.971 | 0.136 | 3 |
Instance_L30–34 | 40 | 24 | 2 | 24 | 2 | 1 | 0.000 | 0.977–0.986 | 0.047 | 3 |
Instance_L40–44 | 40 | 24 | 4 | 48 | 2 | 1 | 0.000 | 0.970–0.985 | 0.047 | 3 |
Instance_L50–54 | 80 | 12 | 2 | 12 | 8 | 1 | 0.000 | 0.942–0.956 | 0.136 | 3 |
Instance_L60–64 | 80 | 12 | 4 | 24 | 8 | 1 | 0.000 | 0.938–0.957 | 0.136 | 3 |
Instance_L70–74 | 80 | 24 | 2 | 24 | 4 | 1 | 0.000 | 0.977–0.981 | 0.047 | 3 |
Instance_L80–84 | 80 | 24 | 4 | 48 | 5 | 1 | 0.000 | 0.971–0.985 | 0.047 | 3 |
Instance | \(|{\mathcal {S}}|\) | \(|{\mathcal {D}}|\) | \(\text {Du}_d\) | \(|{\mathcal {T}}|\) | \(|{\mathcal {H}}|\) | P | St | B | Ds | Dp |
---|---|---|---|---|---|---|---|---|---|---|
40_12_1 | 40 | 12 | 1 | 12 | 3 | 0.917 | 0.221 | 0.602 | 0.076 | 1 |
40_12_2 | 40 | 12 | 2 | 24 | 2 | 0.583 | 0.267 | 0.653 | 0.182 | 2 |
40_12_4 | 40 | 12 | 4 | 48 | 3 | 1.000 | 0.074 | 0.563 | 0.121 | 2 |
40_24_1 | 40 | 24 | 1 | 24 | 4 | 0.875 | 0.810 | 0.642 | 0.018 | 1 |
40_24_2 | 40 | 24 | 2 | 48 | 3 | 0.792 | 0.488 | 0.639 | 0.018 | 1 |
40_24_4 | 40 | 24 | 4 | 96 | 5 | 0.500 | 0.180 | 0.640 | 0.014 | 1 |
80_12_1 | 80 | 12 | 1 | 12 | 4 | 0.750 | 0.176 | 0.609 | 0.121 | 2 |
80_12_2 | 80 | 12 | 2 | 24 | 2 | 0.917 | 0.069 | 0.606 | 0.136 | 2 |
80_12_4 | 80 | 12 | 4 | 48 | 4 | 0.500 | 0.165 | 0.651 | 0.121 | 2 |
80_24_1 | 80 | 24 | 1 | 24 | 3 | 0.792 | 0.188 | 0.648 | 0.011 | 1 |
80_24_2 | 80 | 24 | 2 | 48 | 4 | 0.292 | 0.387 | 0.633 | 0.004 | 1 |
80_24_4 | 80 | 24 | 4 | 96 | 3 | 0.458 | 0.299 | 0.681 | 0.014 | 1 |
160_12_1 | 160 | 12 | 1 | 12 | 4 | 0.750 | 0.056 | 0.640 | 0.167 | 3 |
160_12_2 | 160 | 12 | 2 | 24 | 2 | 0.917 | 0.102 | 0.635 | 0.091 | 2 |
160_12_4 | 160 | 12 | 4 | 48 | 2 | 0.583 | 0.023 | 0.638 | 0.212 | 4 |
160_24_1 | 160 | 24 | 1 | 24 | 2 | 0.583 | 0.396 | 0.602 | 0.004 | 1 |
160_24_2 | 160 | 24 | 2 | 48 | 4 | 0.792 | 0.092 | 0.654 | 0.007 | 1 |
160_24_4 | 160 | 24 | 4 | 96 | 2 | 0.542 | 0.173 | 0.633 | 0.011 | 1 |
240_12_1 | 240 | 12 | 1 | 12 | 2 | 0.917 | 0.731 | 0.603 | 0.061 | 2 |
240_12_2 | 240 | 12 | 2 | 24 | 4 | 1.000 | 0.107 | 0.599 | 0.076 | 3 |
240_12_4 | 240 | 12 | 4 | 48 | 2 | 0.583 | 0.070 | 0.666 | 0.076 | 2 |
240_24_1 | 240 | 24 | 1 | 24 | 3 | 0.583 | 0.390 | 0.618 | 0.011 | 1 |
240_24_2 | 240 | 24 | 2 | 48 | 3 | 0.625 | 0.178 | 0.623 | 0.007 | 1 |
240_24_4 | 240 | 24 | 4 | 96 | 5 | 0.583 | 0.052 | 0.623 | 0.004 | 1 |
320_12_1 | 320 | 12 | 1 | 12 | 3 | 0.917 | 0.382 | 0.632 | 0.152 | 2 |
320_12_2 | 320 | 12 | 2 | 24 | 2 | 0.750 | 0.022 | 0.663 | 0.212 | 2 |
320_12_4 | 320 | 12 | 4 | 48 | 3 | 0.833 | 0.056 | 0.645 | 0.152 | 2 |
320_24_1 | 320 | 24 | 1 | 24 | 3 | 0.833 | 0.064 | 0.625 | 0.007 | 1 |
320_24_2 | 320 | 24 | 2 | 48 | 4 | 0.667 | 0.063 | 0.641 | 0.014 | 1 |
320_24_4 | 320 | 24 | 4 | 96 | 4 | 0.875 | 0.062 | 0.665 | 0.014 | 1 |
.dzn
) to store the instances, based on the data file format of MiniZinc (Stuckey et al., 2022). This choice is motivated by the will of making the instances easily readable by any class of users as well as highly structured and standardized to facilitate their parsing with respect to the original text-only format.5 Solution method
5.1 Search space and initial solution
5.2 Neighborhood relations
-
Change (C). The move C\(\langle s, p, w, p', w'\rangle \) reassigns the student s from the period p at ward w to a new period \(p'\) and a new ward \(w'\). The move has the precondition that s is currently idle in \(p'\), unless \(p = p'\); in the latter case the move represents a reassignment of the ward in the current period p. It is also possible that \(w = w'\), so that the student remains in the same ward, but at a different time. Conversely, it is not possible that \(p = p'\) and \(w = w'\), which would result in a null move.
-
Swap (S). The move S\(\langle s, p, w, p', w'\rangle \) swaps the assignments w and \(w'\) of student s in the two distinct periods p and \(p'\). The precondition here is that the student is assigned in both periods, i.e., \(w \ne -1\) and \(w' \ne -1\).
5.3 Simulated Annealing
5.4 Integration with the MIP model
6 Experimental results
6.1 Parameter tuning
Parameter | Description | Range | Winning |
---|---|---|---|
\(T_{0}\) | Start temperature | [10 – 80] | 18.64 |
\(T_{f}\) | Final temperature | [0.5 – 1.5] | 0.87 |
\(\alpha \) | Cooling rate | [0.985 – 0.995] | 0.99 |
\(\rho \) | Accepted moves ratio | [0.05 – 0.15] | 0.08 |
\(\sigma \) | swap rate | [0.1 – 0.3] | 0.11 |
6.2 Comparative results
CPU [s] | Gap (%) | Opt (%) | |
---|---|---|---|
MIP | 8054 | 9 | 50 |
CP | 2630 | 1 | 88 |
DP | 166 | 0 | 100 |
SA\(_5\) | 2.5 | 0.09 | 98.1 |
SA\(_{10}\) | 4.9 | 0.07 | 99.3 |
SA\(_{20}\) | 9.7 | 0.07 | 99.8 |
SA\(_{50}\) | 24.1 | 0.06 | 99.9 |
SA\(_{100}\) | 48.2 | 0.00 | 100.0 |
6.3 Results on larger instances
Instance | SA\(_{500M}\) | SA\(_{50M}\)+MIP\(_{1h}\) | MIPgap | UBgap | ||||
---|---|---|---|---|---|---|---|---|
best (max) | avg | time [s] | \(z_{\text {SA}}\) | \(z_{\text {SA+MIP}}\) | UB | (%) | (%) | |
40_12_1 | 4127 | 4126.7 | 243 | 4127 | 4127 | 4237 | 0.00 | 2.60 |
40_12_2 | 3920 | 3908.1 | 379 | 3899 | 3899 | 4236 | 0.54 | 7.46 |
40_12_4 | 2862 | 2856.1 | 383 | 2850 | 2850 | 3361 | 0.42 | 14.85 |
40_24_1 | 7799 | 7776.6 | 289 | 7698 | 7698 | 8377 | 1.31 | 6.90 |
40_24_2 | 7303 | 7264.8 | 410 | 7129 | 7129 | 8700 | 2.44 | 16.06 |
40_24_4 | 7096 | 7061.3 | 574 | 6984 | 6984 | 8680 | 1.60 | 18.25 |
80_12_1 | 8614 | 8612 | 254 | 8608 | 8608 | 8884 | 0.07 | 3.04 |
80_12_2 | 7206 | 7205 | 307 | 7206 | 7206 | 7634 | 0.00 | 5.61 |
80_12_4 | 8097 | 8075.8 | 478 | 8006 | 8006 | 9306 | 1.14 | 12.99 |
80_24_1 | 16453 | 16447.1 | 275 | 16437 | 16437 | 17087 | 0.10 | 3.71 |
80_24_2 | 15906 | 15874.1 | 466 | 15716 | 15716 | 17581 | 1.21 | 9.53 |
80_24_4 | 12704 | 12616.7 | 730 | 12069 | 12069 | 17327 | 5.26 | 26.68 |
160_12_1 | 17748 | 17742.2 | 266 | 17726 | 17728 | 18316 | 0.11 | 3.10 |
160_12_2 | 15085 | 15073 | 331 | 15057 | 15057 | 16200 | 0.19 | 6.88 |
160_12_4 | 14002 | 13989.3 | 477 | 13940 | 13942 | 15995 | 0.43 | 12.46 |
160_24_1 | 31470 | 31446.5 | 304 | 31381 | 31381 | 32824 | 0.28 | 4.13 |
160_24_2 | 35579 | 35561 | 359 | 35486 | 35486 | 37631 | 0.26 | 5.45 |
160_24_4 | 28412 | 28329.4 | 704 | 27943 | 27943 | 34138 | 1.68 | 16.77 |
240_12_1 | 20099 | 20059 | 275 | 19822 | 19829 | 21842 | 1.36 | 7.98 |
240_12_2 | 23183 | 23167.4 | 321 | 23144 | 23144 | 24552 | 0.17 | 5.58 |
240_12_4 | 21167 | 21150.7 | 529 | 21060 | 21060 | 24337 | 0.51 | 13.03 |
240_24_1 | 50278 | 50241.2 | 305 | 50066 | 50066 | 52642 | 0.42 | 4.49 |
240_24_2 | 45864 | 45840.4 | 382 | 45701 | 45701 | \(>10^6\) | 0.36 | \(\times \) |
240_24_4 | 48471 | 48421.1 | 481 | — | — | — | \(\times \) | \(\times \) |
320_12_1 | 31897 | 31869.9 | 284 | 31789 | 31789 | 33763 | 0.34 | 5.53 |
320_12_2 | 29895 | 29885.4 | 359 | 29873 | 29873 | 32261 | 0.07 | 7.33 |
320_12_4 | 32281 | 32259.6 | 447 | 32201 | 32201 | 36006 | 0.25 | 10.35 |
320_24_1 | 65943 | 65937.7 | 294 | 65920 | 65920 | 68011 | 0.03 | 3.04 |
320_24_2 | 67772 | 67740.5 | 375 | — | — | — | \(\times \) | \(\times \) |
320_24_4 | 66372 | 66333.9 | 519 | — | — | — | \(\times \) | \(\times \) |
6.4 Analyses and insights
Instance | \(\beta =1\) | \(\beta =0\) | \(\text {Des}_{\text {min}}\) gap | ||
---|---|---|---|---|---|
\(\text {Des}_{s}^{}\) | \(\text {Des}_{\text {min}}^{}\) | \(\text {Des}_{s}^{}\) | \(\text {Des}_{\text {min}}\) | ||
40_12_1 | 4114.5 | 12.0 | 4115.0 | 12.0 | 0.0 |
40_12_2 | 3903.5 | 3.0 | 3906.4 | 3.0 | 0.0 |
40_12_4 | 2850.8 | 4.0 | 2851.2 | 4.0 | 0.0 |
40_24_1 | 7754.9 | 40.0 | 7757.7 | 37.7 | 2.3 |
40_24_2 | 7306.7 | \(-\)17.3 | 7311.3 | \(-\)20.4 | 3.1 |
40_24_4 | 7060.8 | 3.5 | 7065.9 | \(-\)17.5 | 21.0 |
80_12_1 | 8598.2 | 14.0 | 8597.5 | 14.0 | 0.0 |
80_12_2 | 7196.6 | 9.0 | 7195.9 | 9.0 | 0.0 |
80_12_4 | 8076.4 | \(-\)2.0 | 8073.9 | \(-\)2.0 | 0.0 |
80_24_1 | 16411.1 | 35.0 | 16412.8 | 35.0 | 0.0 |
80_24_2 | 15859.6 | 12.0 | 15864.8 | 12.0 | 0.0 |
80_24_4 | 12663.4 | 14.5 | 12670.6 | \(-\)15.7 | 30.2 |
160_12_1 | 17735.4 | 8.0 | 17733.4 | 8.0 | 0.0 |
160_12_2 | 15076.8 | \(-\)3.0 | 15078.4 | \(-\)3.0 | 0.0 |
160_12_4 | 14011.4 | \(-\)14.0 | 1412.4 | \(-\)14.0 | 0.0 |
160_24_1 | 31415.9 | 30.0 | 31418.3 | 30.0 | 0.0 |
160_24_2 | 35538.3 | 25.0 | 35539.6 | 25.0 | 0.0 |
160_24_4 | 28349.5 | \(-\)29.0 | 28348.9 | \(-\)29.0 | 0.0 |
240_12_1 | 20077.7 | 9.0 | 20095.3 | 7.8 | 16.8 |
240_12_2 | 23155.7 | 11.0 | 23153.3 | 11.0 | 0.0 |
240_12_4 | 21198.1 | \(-\)47.0 | 21196.2 | \(-\)47.0 | 0.0 |
240_24_1 | 50230.4 | 12.0 | 50245.9 | 12.0 | 0.0 |
240_24_2 | 45834.2 | 9.0 | 45830.9 | 9.0 | 0.0 |
240_24_4 | 48495.0 | \(-\)54.0 | 48492.6 | \(-\)54.0 | 0.0 |
320_12_1 | 31871.8 | 9.8 | 31865.2 | 6.5 | 16.3 |
320_12_2 | 29882.8 | 1.0 | 29889.2 | 1.0 | 0.0 |
320_12_4 | 32299.9 | \(-\)40.0 | 32303.4 | \(-\)40.0 | 0.0 |
320_24_1 | 65924.2 | 15.0 | 65922.6 | 15.0 | 0.0 |
320_24_2 | 67740.0 | 10.0 | 67728.0 | 10.0 | 0.0 |
320_24_4 | 66387.2 | \(-\)47.0 | 66382.4 | \(-\)47.0 | 0.0 |