Hard rules, never broken silently
These rules are hard, and the assigner keeps each one on every seat it fills: a judge never judges a project they have a conflict with; a judge never judges outside their categories when category match is set to required; a judge is only placed in a slot inside their availability windows; a judge never takes more projects than their maximum; a judge is in one place at a time; no judge sees one project twice; and, when the rule is on, no two judges from one school sit on the same panel. None is ever broken silently: when the rules leave a seat that no judge can take, the seat stays empty and the project is listed with the reason for every judge.
Your own hand moves are different. You may drag a judge anywhere, and a move that breaks a rule is allowed but flagged in red on the grid and listed on the conflict audit, because you may know something the tool does not.
What the assigner balances
Once the hard rules hold, the assigner weighs several things against each other, in cost points. Loads: each judge costs 2 times the square of their load, so twelve projects on one judge cost far more than six on two, and each project a judge falls below the minimum costs 40. Matching: when category match is preferred, each visit outside a judge's categories costs 25, and each visit where none of the judge's expertise tags matches costs 3. Spread: when two judges from one school are allowed on a panel, each such pair costs 20. Walking: each table step between a judge's consecutive visits costs 1. In a rebalance, each visit moved from where it was costs 8. An empty seat costs 1,000,000, more than any mix of the rest, so no balance is ever bought with an empty seat.
Seats, panels and rounds
Every project needs a panel of judges in every round: with three judges per project and one round, a fair of forty projects has 120 seats. Each seat is one visit on a judge's route sheet. With rounds, each round has its own panel, and a judge never sees the same project in two rounds. With time slots, each visit also gets a time: a judge makes one visit at a time, never two visits whose times overlap (even in different rounds, and the slot maker refuses a run of slots that would overlap), and a project hosts at most the number of judges at once that you allow, which is one for the classic walk round and the full panel when judges visit together.
How the assignment is built
Locked visits are placed first. Then the assigner works out the largest number of seats the judges could fill at all under the conflicts, categories, maximums and availability, using a maximum flow calculation, and starts from that fill. A search then moves judges between seats, swaps judges between projects and moves visits between slots, 220 tries per seat, never fewer than 40,000 or more than 400,000, keeping any change that lowers the cost and, early on, some that raise it, so it can escape a dead end. Every change it tries keeps every hard rule, and it never gives up a filled seat for a better balance. The search is seeded, so the same fair gives the same assignment every time. It runs in a background worker on the page. At the end, every warning and every reason is worked out again from the final assignment, not carried over from the search.
Why a project is short of judges
When a seat stays empty, every judge not already on the panel is checked, and each is given the first of these reasons that applies, on screen and on the printed sheets:
- Conflict
- The judge has a conflict of interest with the project: it is from their own school (when that rule is on), from a school they named, it is a project they named, or it has a student they said they know.
- Category
- Category match is required and the judge does not judge the project's category.
- Not available
- Time slots are on and none of the judge's availability windows covers a slot in the project's round.
- Already on this project
- The judge already judges this project, in this round or another. No judge sees one project twice.
- Same school on the panel
- No two judges from one school may sit on a panel, and a judge from the same school is already on it.
- At maximum
- The judge already has as many projects as their maximum allows.
- No free slot
- The judge could take the project, but every slot they are available for is taken, either by their other visits or because the project already has as many judges at once as the rules allow.
If no arrangement at all could fill more seats under your rules, the assigner says so, because the maximum flow calculation proves it. Otherwise it says how many more seats the rules might allow.
Reviewing by hand
The review grid shows one row per judge and, with time slots on, one column per slot. Drag a visit to another judge or another slot, or choose from the lists on each visit, and the conflict flags update while you move: a conflict of interest, a category mismatch, a judge over their maximum or double booked, a project with too many judges at once. Lock the visits you are sure of, then rebalance the rest: the assigner starts from your current grid and moves as few visits as it can.
Pasting projects and judges
Copy from any spreadsheet. With a header row, columns are matched by name: project or code, title, category, division, table or board, room, school, students and flags for projects; name, school, categories, expertise, conflict schools, conflict projects, conflict students, available and max for judges. Without a header, columns are read in that order. Categories, schools and divisions become lists you pick from, so a typing slip cannot switch off a rule. Pasting the same rows twice adds nothing: rows already in the list are reported and skipped.
Where the fair is kept
In this browser, and nowhere else. There is no server: the assignment runs on the page and the fair is saved in the browser's own storage. A backup file moves it to another computer. See the privacy page.