Ask any server who closes on Fridays, and you'll usually hear the same name. Nobody planned it. The scheduling tool found the cheapest schedule that covers the floor, and it doesn't care who gets the 11 p.m. finish, the Saturday close, or the “clopen” (close at night, open the next morning). Week after week, the small imbalances pile up on the same few people.

This is the first post in a series on award-winning operations research theses, applied outside the setting the authors studied. It starts with a thesis about trains.

The two-minute version, narrated by Renan with an AI voice clone of his own voice.
Read the video transcript

Ask any restaurant server who closes on Fridays, and you'll usually hear the same name. Nobody planned it. The scheduling tool found the cheapest schedule, and it doesn't care who gets the late finish.

This is the first post in a series on award-winning operations research theses, applied somewhere new. It starts with Bart van Rossum's thesis, a finalist for the 2026 EURO Doctoral Dissertation Award. Motivated by crew planning at Netherlands Railways, it studies how to build fairness into the models that decide who does which work.

A bad week now can be made up later, but you never know what next week brings. So each week, among the schedules that are cheap enough, pick the most even one. Then assign it best-to-worst: the heaviest week goes to whoever has carried the least so far.

I applied it to a restaurant near Truist Park, with twelve servers, through the 2026 Braves season. The real input is the schedule of home games, which adds a dinner rush and a late crowd.

Each server's week earns sour points: for closing shifts, for Friday and Saturday closes, for closing on game nights, and for clopens, which means closing at night and opening the next morning.

With blind rotation, luck piles up. After twenty-six weeks, the most burdened server carries thirty-nine more sour points than the least, about twenty extra weekend closes. With the thesis's strategy, the gap stays at two. Even knowing the whole season in advance, the best possible was one.

It used the same seven thousand four hundred seventy-eight paid hours and the same number of closes and clopens. Only who gets them changes.

One part of the thesis didn't matter here. Spending extra labor cost on fairness changed nothing, because so many schedules were equally cheap. On a railway, where crews differ and fairness has many dimensions, that trade-off is real, and the thesis builds large-scale methods for it. In a twelve-person restaurant, it wasn't.

To use it on Monday, keep a running tally of the shifts your team dislikes. Then give the heaviest week to whoever has the lowest tally.

The full write-up and the code are on bisdecisions.com. Thanks to Bart van Rossum and his coauthors for the research behind it.

What the thesis did

Bart van Rossum's PhD thesis, Optimising Fair Work Allocation: Applications in Railway Crew Planning (Erasmus University Rotterdam, 2025), was one of four finalists for the 2026 EURO Doctoral Dissertation Award.12 Motivated by crew planning at Netherlands Railways (NS), it studies how fairness can be built into the optimization models that decide who does which work. At NS, that means spreading attractive and unattractive duties across thousands of drivers and guards. On real NS instances with up to 572 guards, one chapter's method met individual fairness rules for 95.2% of employees on average.3

The key word is over time. Making every single day perfectly fair can be expensive. Over weeks or months there is more room: whoever got the bad end this week can get a better one next week. The catch is that you don't know what next week will bring. Demand, disruptions and absences arrive as they come, and you still have to decide every period, without seeing the future.

The idea I borrow is from Chapter 5, joint work with Rui Chen and Andrea Lodi.4 It is built for exactly that situation. Work arrives period by period, with no knowledge of what comes later, and is split into pieces for a group of interchangeable workers. Each period you pick a solution whose cost is within a factor (1 + α) of the cheapest, preferring the one whose pieces are most even. Then you assign the pieces best-to-worst: the heaviest piece goes to whoever has carried the least so far. The thesis proves this assignment is the best possible for that period, and that the accumulated gap between workers never exceeds the largest gap within any single period. The authors tested it on vehicle routing. The restaurant application below is mine, not theirs.

Illustration · four servers · grey = sour points so far, colour = this week's lineServer B9 + 4 = 13Server D10 + 3 = 13Server A12 + 1 = 13Server C15 + 0 = 15Lowest tally gets the heaviest line: before 9–15 (gap 6), after 13–15 (gap 2)
Best-to-worst, illustrated. This week's heaviest line goes to the server who has carried the least so far, the next heaviest to the next, and so on. The gap between the four servers shrinks from 6 to 2 in one step.

The restaurant

A casual-dining restaurant near Truist Park, open 10 a.m. to 11 p.m., with 12 servers. Each server works 3 to 5 shifts a week, at most 40 hours, in shifts of 4, 6 or 8 hours. Hourly demand follows a typical shape: a lunch peak, a dinner peak, busier Friday and Saturday nights, and Sunday brunch. The one real input is the 2026 Braves home schedule from the MLB Stats API: 78 home games fall in the 26 weeks studied, and each adds a pre-game dinner rush and a post-game late crowd (or an afternoon crowd for day games).5

Servers needed per hour024610 a.m.1 p.m.4 p.m.7 p.m.10 p.m.TuesdaySaturdayTuesday, 7:20 p.m. home game
Servers needed per hour on an ordinary Tuesday, a Saturday, and a Tuesday with a 7:20 p.m. Braves home game. The game adds the dinner rush of a Saturday and a later crowd than any regular night.
Cheapest paid hours per week (bars, axis from 250) · dots = Braves home games that weekRed: weeks with 5–6 home games (304–308 h) · blue: 0–4 games (268–294 h)Mar 30Sep 21
The cheapest schedule each week, in paid hours. Weeks with no home games need 268 hours; weeks with six need 304 to 308. The games are why every week is a different scheduling problem.

Each week, a CP-SAT model finds the schedule with the fewest paid hours that covers demand.6 Each server's week gets “sour points”: 1 for a close, 2 for a Friday or Saturday close, 1 more for closing on a game night, and 2 for a clopen. Then I compared three ways of running the season.

  • Blind rotation: take the cheapest schedule and hand its weekly lines to people at random. That is roughly what “we rotate” means in practice. I averaged it over 1,000 random seasons.
  • Best-to-worst: take the same cheapest schedule, but give the heaviest line to whoever has the fewest sour points so far. This is the thesis's assignment rule, and it costs nothing.
  • Even and best-to-worst: among the schedules that are just as cheap, pick the one with the most even lines, then assign best-to-worst. This is the thesis's full strategy with α = 0.
Friday, Sep 11 · the even scheduleEach bar is one server's shift · red ends at close · right: that server's sour points for the whole week10 a.m.–2 p.m.week: 511 a.m.–7 p.m.week: 411 a.m.–7 p.m.week: 45 p.m.–11 p.m.week: 45 p.m.–11 p.m.week: 55 p.m.–11 p.m.week: 55 p.m.–11 p.m.week: 47 p.m.–11 p.m.week: 4024610 a.m.1 p.m.4 p.m.7 p.m.10 p.m.Servers on the floor (bars) vs servers needed (line)Coverage matches demand every hour · 5 of 8 shifts close · every server's week totals 4 or 5
What an even schedule looks like, one night of it. Friday, September 11, with a Braves home game: eight shifts cover the demand exactly, and five of them close. The closes are spread so that, over the whole week, every server ends with 4 or 5 sour points.
This week's demandincl. Braves gamesCheapest scheduleCP-SAT · paid hoursMost evenamong equally cheapBest-to-worstheaviest → lowest tallyupdate each server's running tally → next weekSteps 3 and 4 are the thesis's strategy (Chapter 5); here they cost no extra hours
One week of the method. The schedule is solved for cost first. The thesis's two steps, choosing the most even of the equally cheap schedules and assigning best-to-worst, decide who gets which line.

What happened

010203040wk 1wk 9wk 18wk 26Gap in accumulated sour points, most- vs least-burdened serverBlind rotation · 39Best-to-worst · 6Even + best-to-worst · 2Same 7,478 paid hours and 971 sour points in all three · blind = mean of 1,000 seasons
Gap in accumulated sour points between the server who has carried the most and the one who has carried the least, over the 2026 season. All three use the same 7,478 paid hours and the same 971 sour points in total; only who gets them changes.

Blind rotation drifts. It's fair on average, but random luck accumulates, and after 26 weeks the most-burdened server has 39 more sour points than the least-burdened, on average. That is roughly 20 extra Friday or Saturday closes. In one season out of ten it is 52 or more. Taking the solver's output as is, with the same person getting the same line every week, ends at 51.

Best-to-worst on the same schedules ends at 6, and it never went above 8 in any week. Choosing the most even of the equally cheap schedules first brings it to 2: every server finishes the season within 2 points of every other, between 80 and 82. The hours, the coverage and the total number of closes and clopens are identical in all three. Only the order of who takes what changes.

Blind rotation (median season)67 to 106 · gap 396771727374787885888990106Even + best-to-worst80 to 82 · gap 2808081818181818181818182Season total of sour points per server, sorted · same 971 points shared in both
Each server's season total of sour points, sorted. Left: a typical blind-rotation season (the median of 1,000), where totals range from 67 to 106. Right: the thesis's strategy, where every server ends between 80 and 82. Both seasons hand out the same 971 points.

How close is that to the best possible? I solved the season again with perfect information: all 26 weeks known in advance, the same weekly lines, and the assignment chosen jointly to end as evenly as possible. The best possible end is a gap of 1, because 971 points don't split evenly among 12 people. The thesis's strategy, deciding week by week without seeing ahead, ends at 2. Measured by the worst gap at any point in the season, it matches the perfect-information optimum: 2.

Cheapest, solver's pick308 hours · range 9012344455699Equally cheap, most even308 hours · range 1444444445555Sour points per server, sorted · week of Sep 7, 2026 · 6 Braves home games
One week (September 7–13, 2026; six home games). Both schedules cover the same demand with 308 paid hours. The cheapest schedule the solver picked gives two servers 9 sour points and one server none. An equally cheap schedule gives everyone 4 or 5.

The part of the thesis that didn't matter here

The thesis lets you spend a budget α: accept a schedule up to α more expensive in exchange for fairness. I tried α = 2%, 5% and 10%. None of them changed anything. In this restaurant there are so many equally cheap schedules that fairness was free. At NS, with long duties, depots and labor rules, that trade-off is real. In a 12-person restaurant it wasn't. That is a property of this example, not a flaw in the method.

What the rest of the thesis handles

This restaurant makes three simplifying assumptions. Servers are identical and can take any shift. Fairness is measured along one dimension, sour points. And finding the most even schedule each week is easy for a solver. Real crew planning breaks the first two. At NS, crew members differ, and work has to be balanced along several dimensions at once, so the thesis uses large-scale column-generation heuristics to spread it fairly.3 The third can break too: in vehicle routing, even finding the most even set of routes for a single day is already hard and needs tailored solution methods.1

If you want to try it

  • Keep a running tally of the shifts your team dislikes. Decide the weights with them. Some servers like closing for the tips, which makes it a sweet shift for them, not a sour one.
  • When you build the week, give the heaviest line to whoever has the lowest tally. In this experiment, that one rule did most of the work.
  • If your scheduling tool optimizes cost, ask it for the most even schedule among the cheapest ones. Here that was one extra constraint, not a new system.

What would change this conclusion

  • Fewer equally cheap schedules. With a smaller team, stricter labor rules or long fixed shifts, the cheapest schedule may be nearly unique. Then fairness would cost hours, and the α trade-off from the thesis would start to matter.
  • People who aren't interchangeable. If availability or skills decide who can take which shift, best-to-worst can only shuffle among the people who qualify. The thesis's guarantees assume interchangeable workers, so I wouldn't expect the gap to stay at 2.
  • Different preferences. If half the team wants the closes, the sour points are wrong, and so is the tally. The fix is to measure preferences, not to trust my weights.
  • A different restaurant. I tested one demand shape, one team size and one season. A floor with a flatter day, or a much bigger team, could behave differently.

Caveats

The demand shape is synthetic; only the game schedule is real. The servers are interchangeable here. Real teams have availability, skills and preferences, and those break the “homogeneous workers” assumption that the thesis's guarantees rely on. The sour-point weights are my choice. The experiment covers one restaurant over one season, and all 130 weekly solves were proven optimal. The code and results are public.7

Drafted with AI assistance (Claude). The experiment ran on my machine, and every number above is in the repository.