Open to work · Available June 2026

← Work

Move Agency · 2023

Reinforcement Learning Scheduler

An RL agent trained in simulation to optimise crew and equipment scheduling for large-scale event logistics — handling dynamic constraints that make the problem too complex for rule-based approaches.

Reinforcement Learning Python Simulation Optimisation

RL scheduler architecture and training loop diagram

Context

Move Agency coordinates logistics for large events — festivals, product launches, stadium events. Scheduling the right crew members to the right tasks at the right times involves dozens of constraints simultaneously: skill requirements per task, crew availability windows, equipment dependencies, travel time between locations, and hard deadlines tied to show schedules.

The existing process was manual, handled by experienced logistics coordinators. It worked, but it scaled poorly and produced schedules that, while valid, often left slack time and missed efficiency optimisations that a human planner under time pressure wouldn't catch.

Challenge

Crew scheduling with this many simultaneous constraints is NP-hard. Classical optimisation approaches (integer programming, constraint satisfaction) can find optimal solutions but become intractably slow as the problem size grows. The goal was a system that could produce good — not necessarily optimal — schedules fast enough to be useful during live planning sessions.

What I built

A simulation environment modelling the scheduling problem as a Markov Decision Process, with a Proximal Policy Optimisation (PPO) agent trained against it:

  1. Environment — Custom Gym environment encoding tasks, crew members, constraints, and a time horizon. Actions = assigning a crew member to a task at a given time slot. Reward = schedule efficiency score minus constraint violations.
  2. Agent — PPO with a small MLP policy network. Trained over 2M timesteps on randomised problem instances drawn from historical event data.
  3. Output — The trained agent produces a draft schedule in under a second for typical problem sizes. Coordinators review and adjust; the system handles the initial allocation that previously took 30–45 minutes.

Note: the agent was evaluated in simulation. Deployment in live production scheduling was outside the scope of this project.

Key results

In simulation benchmarks against historical schedules, the RL agent produced solutions with 12–18% better crew utilisation and significantly fewer constraint violations than the baseline greedy heuristic. On large problem instances (50+ crew, 200+ task slots), it outperformed simulated annealing in solution quality within equivalent time budgets.

What I learned

Reward shaping is the hardest part of RL in practice. The first reward function I designed produced an agent that learned to avoid constraint violations by... not assigning anyone to anything. Zero violations, zero utility. Getting the reward signal right required understanding what "good" looks like from the domain expert's perspective and encoding that into a function that the agent could actually learn from.

I also learned the limits of simulation-to-real transfer. The agent performs well on problem instances that look like its training distribution. When coordinators described edge cases from real events — a crew member going home sick mid-event, a stage delayed by two hours — the agent struggled. Handling distributional shift properly would require either a more diverse training set or a different architecture.