Last quarter I pulled the route data off a small service business I help run in Toronto. Twenty nine working days. Three thousand three hundred and fifty eight kilometres. That works out to about 115 km a day to complete roughly one and a half jobs.
Nobody had ever looked at that number, because nobody was measuring it. We were measuring jobs completed and revenue per job. Both were going up. The business looked healthy.
What we were actually running was a vehicle routing problem, and we were solving it greedily.
Greedy scheduling looks fine until it isn't
Every booking got placed at whatever time the customer asked for. First come, first served, no constraint on where the previous job was. On paper that is maximum customer satisfaction. In practice it meant a morning in Mississauga and an afternoon in Markham, with ninety minutes of highway in between that nobody is paying for.
The cost is invisible because it never appears as a line item. It shows up as fatigue, as a late arrival, as a third job that could not be booked because there was no room left in the day.
The constraint we added
One rule: a day gets one geographic cluster. If the first job is in Scarborough, every other job that day is in Scarborough.
That sounds obvious written down. It was not obvious while the calendar was filling itself. We had to turn down bookings we could technically have serviced, which felt like leaving money on the table right up until the day we fit three jobs into the hours that used to hold two.
Agincourt turned out to be the cleanest test case. It is dense, it is residential, the housing stock is consistent, and the drive between any two addresses inside it is under ten minutes. Once we started treating house cleaning in Agincourt as a single scheduling unit instead of a series of unrelated appointments, jobs per working day went up without anyone working longer hours.
What I would tell someone building the same system
Measure the gaps, not the tasks. Task duration is the number everyone instruments, because it is the easy one to instrument. The gap between tasks is where the capacity actually goes, and in a field service business that gap is measured in kilometres.
Cluster before you sequence. Sorting a day's stops by travel time is a much smaller optimization than deciding which stops belong in the same day at all. Get the partition right and the ordering barely matters.
Treat geography as a hard constraint, not a soft preference. Soft preferences lose every argument with a customer who wants Tuesday at nine. If the rule can bend, it will bend every time, and you end up back at greedy.
The frustrating part is that none of this needed software. We did not build a solver. We drew five circles on a map and refused to book outside the circle of the day. The whole fix was a constraint we had been unwilling to enforce, and the reason we had been unwilling to enforce it was that the dashboard we were watching could not see the cost.
Top comments (0)