The overtime crew scheduling (or runcutting) challenge
Everyone has opinions about overtime. Some think it’s an opportunity to earn more money, others are concerned about the resulting safety implications (or regulatory problems), as drivers drive long shifts and become fatigued.
Overtime is a natural byproduct of public transit services, since mass transit operating hours are extended and shift work is a must. Not being able to balance overtime has dire consequences: in that case, some employees will work long overtime shifts, while others won’t get enough work. In some cases, drivers are eligible to be paid for guaranteed time – they are guaranteed a certain wage regardless of hours worked. We’ve seen many cases where work wasn’t distributed evenly – with some drivers working too much and others too little.
Ideally we would like all drivers working at maximum capacity (i.e. working to the full extent as required for full time pay) with the minimal amount of overtime.
In the Mass Transit world, crew scheduling (or runcutting) is never simple: drivers can’t simply be assigned to the entire block, since there are limits to how long they can work, as well as requirements for breaks. The goals are to minimize the cost of labor, distribute overtime evenly among drivers and meet work shift rules such as:
– Beginning and starting work at the same terminal
– Time off before duties are resumed
– % of overtime duties and requirements for drivers to have similar assignments/shifts
In this post we’ll look at how Optibus deals with overtime, through its roster (rota) optimization functions.
First of all: finding the minimum overtime percentage
First, a note: in this post we’ll discuss a case where overtime is calculated on a weekly basis (i.e. based on the total hours worked for the week). Therefore, assuming that duties are fixed (and that we’ve already optimized the vehicle and duty schedules), the way to control overtime is through the roster (rota), ensuring that no single driver gets too many hours for any given week.
The dependency between overtime and the number of rosters is reflected in the following formula:
OT% =( Total paid timeOTh * Roster Count-1)*100
Total paid time=the total paid time in the entire booking/bid
OTh=the total weekly hours that are the upper limit beyond which overtime begins
Roster Count=number of rosters
OT%= the overtime percentage
For example, if we have 110 available drivers and 4,546 hours of paid time, in a given schedule, the minimum overtime percentage possible is 3.32%.
OT% =( Total paid timeOTh * Roster Count-1)*100=( 454640 * 110-1)*100=3.32%
It’s important to calculate the minimum possible overtime for a given number of drivers. We will use this number to assess the quality of our scheduling optimization results. If the scheduling optimization result is close to the Minimum Roster, we know we can’t optimize much more.
Total Roster Count vs Overtime
As we’ve mentioned above, the roster count is the determining factor for overtime in this case. Increasing the roster count will reduce overtime – but in case of guaranteed minimum wages (i.e. a driver getting paid for a minimum amount of weekly hours regardless of whether those hours were worked – we call this “guarantee time”), we run the risk of paying more than actual hours worked.
The way to manage this is to use global constraints. Global constraints are a quick and effective way of making changes to the entire schedule, going beyond a specific vehicle, shift, or run. In this case we will use them to limit the amount of rosters. In this example, we set the global constraint to 100-110 rosters. The result? The optimization returns a roster schedule with 110 rosters and 3.51% overtime.
In the second iteration we set the goal to 115-120 rosters and the optimization returned 0.53% overtime, which reflects a $ savings of 2.98% in overtime hours.
Optimizing duty length in order to reduce overtime
Duties are the building blocks of the roster schedule. The duration of each duty and the total number of duties have a significant impact on the guarantee time and overtime.
Assuming the overtime is calculated on a weekly basis and a work week of 40 hours, our first goal would be to create as many duties as possible that are around either 8- or 10-hour shifts. The 8-hour duties can be used to create 5-day work weeks (5 days X 8 hours = 40 hours per week) and the 10-hour duties can be used to create 4-day work weeks.
Meanwhile, we also want to avoid our duties falling far below the 40 hours per week guarantee time. Duties that are too short could create either part time rosters or rosters with a lot of guaranteed time payment.
Configuration of duty count with specific paid time range using global constraint
In the following example we asked the optimization algorithm to create at least 50 duties with paid time between 7 and 8 hours. We will use these duties to create 5-day work weeks with no overtime.
The two histograms below represent the same schedule, before and after using the paid time range global constraint. In the first chart, the length of shifts has a lot of variability. In the second chart, after applying the constraint, most shifts are around 8 hours long. This is positive, because it will reduce overall overtime hours. Another result of using our global constraint is that the number of short duties (0-7 hours) was reduced, which will help us prevent short rosters with guaranteed time.
Duties paid time histogram before using global constraint
Duty paid historgram after using global constraint
The duty count, duty length, and number of available drivers are the main factors that determine the overall volume of overtime hours. If we plan the schedule with attention to those factors, by using the global constraint we will be able to create a roster schedule with the minimum overtime, without excess guaranteed time.