Starting the solver…
1 Load availability
2 Settings and first schedule
3 Something changed? Reschedule with minimal disruption
Frozen interviews (already held or confirmed) keep their slot and panel; they still count towards each person’s workload.
File format & rules
- Availability CSVs (Doodle export): row 1 = dates, row 2 = slot start times (
9,9.45,10.3— the part after the dot is minutes — or09:00-09:45), then one row per person. Only Yes means available by default; No and blank cells mean unavailable, and If needed follows the setting above. A person listed twice (answered the poll twice) is merged according to the setting above. Both files must use the same dates and slot labels. - Leads: pick them from the list shown after loading (or type their names; staff named
lead…are detected automatically). Every panel gets at least one lead. - Forbidden pairs: a supervisor never sits on their own applicant’s panel. CSV with
candidate_id,staff_idcolumns, or the interview sheet format (Surname, First name(s), Potential Supervisors), or inlineapplicant:staff. - Hard rules: one interview per applicant, one applicant per slot (per room), everyone only when available, panel size within the chosen bounds, no staff member in two rooms at once. If they cannot all be met the answer is infeasible — with an explanation, never a schedule that breaks a rule.
- Soft goals: change as few applicants and panellists as possible when rescheduling, then spread the interviews evenly across staff.
Solved with HiGHS (mixed-integer programming) running in WebAssembly. Based on the 2025 UG4 project by Guillermo Perfect, University of Edinburgh — source code.