Seasonal Workforce Planning
LINEAR PROGRAMMING
Agriculture · Production · TacticalA 1,200 ha grain-oilseed farm in the Châteauguay valley south of Montréal runs on a tightly seasonal labour profile: a skeleton crew through winter, a three-week seeding sprint in late April, a summer of scouting and spraying, and an all-hands harvest in September–October. Hiring too late costs yield; hiring too early costs wages. Linear programming finds the cost-optimal hire-retain-fire plan for the whole season at once, given monthly labour demand, wages, and hiring/severance frictions.
Why this decision matters
Three verified facts on Canadian agricultural labour
Where this decision fits
Agriculture sector decision chain · tactical, pre-season horizon
Problem & formulation
Canonical multi-period workforce LP
Sets & indices
| Symbol | Meaning | Domain |
|---|---|---|
| \(i \in I\) | Worker type (field crew, machine operator, agronomist) | finite |
| \(t \in T\) | Month in the planning horizon | \(\{1, \ldots, 12\}\) |
Parameters
| Symbol | Meaning | Unit |
|---|---|---|
| \(d_{i,t}\) | Labour demand in month \(t\) for worker type \(i\) | hours |
| \(H\) | Hours worked per full-time-equivalent per month | hrs |
| \(c_i\) | Wage for worker type \(i\) (monthly, one FTE) | CAD |
| \(h_i\) | Hiring cost per new worker of type \(i\) (posting, training) | CAD |
| \(f_i\) | Severance cost per released worker of type \(i\) | CAD |
| \(x_{i,0}\) | Starting headcount of type \(i\) (carried from prior season) | FTE |
Decision variables
| Symbol | Meaning | Domain |
|---|---|---|
| \(x_{i,t}\) | Number of FTE of type \(i\) retained in month \(t\) | \(\geq 0\) |
| \(y_{i,t}\) | New hires of type \(i\) in month \(t\) | \(\geq 0\) |
| \(z_{i,t}\) | Releases of type \(i\) in month \(t\) | \(\geq 0\) |
Objective
Minimize the total labour cost over the planning horizon — wages paid, plus hiring and severance frictions:
Constraints
Demand must be met every month, and the headcount must reconcile period to period:
An integer-valued variant (\(x, y, z \in \mathbb{Z}^+\)) would make the problem a mixed-integer program; in practice the LP relaxation is near-integer for this structure and the LP solution can be rounded with negligible cost increase.
Why this formulation works
The LP is a classic network-flow problem on a monthly staircase graph: each worker type defines an independent sub-problem whose optimal structure is well known. When hiring plus firing is cheaper than carrying unused workers across a low-demand valley, the model fires and re-hires; when carrying is cheaper, it smooths. The dual variables reveal the implicit hourly rate the farm is paying at each month, useful for sensitivity analysis.
Real-world → OR mapping
How a farm manager’s vocabulary translates to the LP
| On the farm | In the LP model |
|---|---|
| Field crew / tractor operator / agronomist | \(i \in I\) |
| Each month of the growing season | \(t \in T\), \(|T| = 12\) |
| Hours of spraying, scouting, seeding needed | \(d_{i,t}\) |
| Standard full-time-equivalent month (≈160 hrs) | \(H\) |
| Payroll + benefits for one FTE-month | \(c_i\) |
| Posting + onboarding + orientation cost | \(h_i\) |
| Severance + record-of-employment admin | \(f_i\) |
| Headcount carried from prior winter | \(x_{i,0}\) |
| How many workers on payroll in month \(t\) | \(x_{i,t}\) |
| Seasonal hires brought on in month \(t\) | \(y_{i,t}\) |
| Releases at month \(t\) | \(z_{i,t}\) |
| Total labour cost for the year | Objective value |
Interactive solver
Edit the demand profile and cost inputs; re-solve in your browser
Monthly labour demand (hours)
Under the hood
Because worker types do not interact (no cross-type constraints), the problem decomposes into three independent single-type LPs. For each type, the closed-form valley-smoothing algorithm computes the optimal trajectory in \(\mathcal{O}(|T|^2)\) time: start from \(x_t = \lceil d_t / H \rceil\) (just meet demand), then for every valley \([t_1, t_2]\) between local peaks compare carrying cost vs. fire-and-rehire cost, and fill the valley whenever carrying is cheaper. This is provably optimal for the convex LP; a general-purpose simplex implementation would return the same trajectory modulo tie-breaking.
Reading the solution
What a farm manager actually does with the output
Three patterns to watch for
- Smoothed plateau vs. sharp pulse. If wages are low and hire/fire costs are high, the optimal plan carries workers through off-peak months; if wages dominate, the plan fires aggressively and rehires later.
- Staggered by worker type. Agronomists often stay on through the scouting window (May–August) while field crew peak around seeding (April–May) and harvest (September–October). The LP reveals how the two cycles overlap.
- Shadow prices (duals). The dual of each demand constraint is the implicit hourly rate being paid in that month. When a dual is high, the farm is capacity-constrained and could profitably add labour; when it is zero, labour is slack.
Sensitivity questions the model answers instantly
- What if the hire cost doubles (e.g., because of a tighter labour market)? — rerun with a higher \(h_i\).
- What if a Temporary Foreign Worker programme closes late in the season? — set \(d_{i,t}\) to zero for unavailable months and rerun.
- What if we defer harvest by two weeks? — shift the Sept/Oct peak to October/November.
Model extensions
Natural generalizations beyond the base LP
Stochastic demand
Weather-driven demand uncertainty (e.g., wet spring delays seeding) suggests a two-stage stochastic program: commit to winter headcount now, adjust \(y, z\) once the spring forecast clarifies. Recourse penalties prevent under-hiring in peak months.
See the tactical cell →Integer headcount (MIP)
Real workers come in whole numbers. The LP relaxation here is near-integer, but a true mixed-integer program enforces \(x, y, z \in \mathbb{Z}^+\) and is solvable by branch-and-bound for the small instance sizes typical on a single farm.
Continuous family →Shared-labour cooperative
Two or more farms with complementary peak profiles can cooperate: one crew serves both, reducing total hires. The decision problem becomes a multi-farm LP with side constraints on simultaneous assignment and travel time between farms.
Related: field routing →Key references
Cited above · DOIs and permanent URLs