Operational Optimization Formulation
This page documents the canonical FHOPS operational MILP formulation used by the
Pyomo implementation in fhops.model.milp.operational.
The formulation is maintained from a shared source module so the SoftwareX manuscript and Sphinx docs stay synchronized.
FHOPS’ deterministic operational solver is formulated on a day-shift grid and maximizes weighted delivered production while penalizing leftovers, landing
over-capacity slack, and machine movement costs. The equations below mirror the implemented Pyomo model in
fhops.model.milp.operational.build_operational_model and the bundle normalization in fhops.model.milp.data.build_operational_bundle.
Problem statement. Given harvest blocks, machine roles, shift calendars, block windows, landing capacities, and harvest-system role prerequisites, choose machine-block assignments and per-shift production quantities to maximize weighted production subject to feasibility and sequencing constraints.
Sets and indices.
\(m \in \mathcal{M}\): machines.
\(b \in \mathcal{B}\): blocks.
\(s=(d,\sigma) \in \mathcal{S}\): shift slots indexed by day \(d \in \mathcal{D}\) and shift label \(\sigma\).
\(\mathcal{R}_b\): ordered machine roles required by the harvest system assigned to block \(b\).
\(\mathcal{L}\): landings.
\(\mathcal{P}^{\text{inv}} \subseteq \{(r,b): r \in \mathcal{R}_b\}\): role-block pairs with upstream prerequisites.
\(\mathcal{P}^{\text{act}} \subseteq \mathcal{P}^{\text{inv}}\): role-block pairs that require positive head-start buffer activation.
\(\mathcal{P}^{\text{load}} \subseteq \{(r,b): r \in \mathcal{R}_b\}\): loader role-block pairs.
Parameters.
\(\bar{p}_{mb}\): production rate for machine \(m\) on block \(b\) (units per shift).
\(W_b\): required total block production volume.
\(A_{m,s} \in \{0,1\}\): machine availability for shift \(s\).
\(\mathbf{1}^{\text{window}}_{b,d} \in \{0,1\}\): block window indicator (1 if day \(d\) is within block \(b\) window).
\(\omega^{\text{prod}},\omega^{\text{mob}},\omega^{\text{trans}},\omega^{\text{land}}\): objective weights.
\(\delta_{m,b',b}\): mobilization cost when machine \(m\) transitions from block \(b'\) to block \(b\).
\(C_{\ell}\): daily assignment capacity for landing \(\ell\).
\(\ell(b)\): landing associated with block \(b\).
\(\mathcal{U}_{r,b}\): upstream roles that must feed role \(r\) on block \(b\).
\(B_{r,b}\): required staged buffer volume before role \(r\) may activate on block \(b\).
\(Q_{r,b}\): role production capacity upper bound per shift (used for activation linearization).
\(q^{\text{batch}}_{r,b}\): loader batch size for loader role \(r\) on block \(b\).
\(\mathcal{T}_b \subseteq \mathcal{R}_b\): terminal roles for block \(b\) (roles credited in block completion objective terms).
Decision variables.
\(x_{m,b,s} \in \{0,1\}\): 1 if machine \(m\) is assigned to block \(b\) in shift \(s\).
\(p_{m,b,s} \ge 0\): production by machine \(m\) on block \(b\) in shift \(s\).
\(z_{r,b,s} \ge 0\): aggregated role-level production for role \(r\) on block \(b\) in shift \(s\).
\(y_{m,b',b,s} \in \{0,1\}\): transition indicator for machine \(m\) from previous-shift block \(b'\) to current block \(b\) (defined for non-initial shifts).
\(I^{\text{start}}_{r,b,s} \ge 0\): staged inventory available at start of shift \(s\) for role \(r\) on block \(b\).
\(I_{r,b,s} \ge 0\): staged inventory at end of shift \(s\) for role \(r\) on block \(b\).
\(g_{r,b,s} \in \{0,1\}\): role activation indicator for buffered downstream roles.
\(n_{r,b,s} \in \mathbb{Z}_{\ge 0}\): loader batch count for loader role-block pair \((r,b)\).
\(u_{r,b,s} \ge 0\): loader partial remainder volume.
\(L_b \ge 0\): leftover unmet block volume slack.
\(S_{\ell,d} \ge 0\): landing daily surplus slack.
Objective.
FHOPS maximizes weighted terminal production and subtracts penalty terms:
If a block has no terminal-role metadata, the implementation falls back to machine-level production sums for the production reward term.
Constraints.
Machine assignment feasibility:
Role compatibility (machines can only work roles allowed by the block’s assigned harvest system):
Production upper bound per assignment:
Block window enforcement:
Role-production aggregation:
Transition linking (for non-initial shifts only):
Role inventory start and balance for prerequisite-driven downstream roles:
Head-start activation for buffered downstream roles:
Loader batching:
Block completion balance with leftover slack:
Landing daily assignment capacity with surplus slack:
Domain restrictions:
Implementation mapping (equation blocks to code).
Equation/constraint block |
Pyomo component / helper |
Data provenance |
|---|---|---|
Machine capacity and availability |
|
|
Role compatibility |
|
|
Production-assignment coupling |
|
|
Block windows |
|
|
Role aggregation |
|
|
Transition linkage |
|
|
Inventory dynamics and guards |
|
harvest-system prerequisites and role buffers |
Head-start activation |
|
|
Loader batching |
|
|
Block balance with leftovers |
|
|
Landing capacity with slack |
|
|
Objective assembly |
|
|
Data/parameter normalization |
|
|
This formulation is the canonical mathematical reference for FHOPS operational MILP documentation and thesis-level reporting.