Due to the ongoing trend towards increased product variety, fast-moving consumer goods such as food and beverages, pharmaceuticals, and chemicals are typically manufactured through so-called make-and-pack processes. These processes consist of a make stage, a pack stage, and intermediate storage facilities that decouple these two stages. In operations scheduling, complex technological constraints must be considered, e.g., non-identical parallel processing units, sequence-dependent changeovers, batch splitting, no-wait restrictions, material transfer times, minimum storage times, and finite storage capacity. The short-term scheduling problem is to compute a production schedule such that a given demand for products is fulfilled, all technological constraints are met, and the production makespan is minimised. A production schedule typically comprises 500–1500 operations. Due to the problem size and complexity of the technological constraints, the performance of known mixed-integer linear programming (MILP) formulations and heuristic approaches is often insufficient. We present a hybrid method consisting of three phases. First, the set of operations is divided into several subsets. Second, these subsets are iteratively scheduled using a generic and flexible MILP formulation. Third, a novel critical path-based improvement procedure is applied to the resulting schedule. We develop several strategies for the integration of the MILP model into this heuristic framework. Using these strategies, high-quality feasible solutions to large-scale instances can be obtained within reasonable CPU times using standard optimisation software. We have applied the proposed hybrid method to a set of industrial problem instances and found that the method outperforms state-of-the-art methods. scheduled batches new batches tasks {PM,FM,S,P} units groups of identical batches scheduled make batches new make batches scheduled pack batches new pack batches scheduled batches that require task k ∈ K scheduled batches whose task k ∈ K is performed on unit/tank j ∈ J k new batches that require task k ∈ K new batches that require task k ∈ K and can be assigned to unit j ∈ J k new batches that require task k and belong to group g ∈ G scheduled make batches that supply scheduled pack batch i ∈ I P new make batches that can supply new pack batch i ∈ N P scheduled pack batches that are supplied by scheduled make batch i ∈ I M new pack batches that can be supplied by new make batch i ∈ N M units that perform task k ∈ K assigned unit for scheduled batch i ∈ I k and available units for new batch i ∈ N k ( k ∈ K ) final-mix units that can be connected to premix unit j ∈ J PM immediate successor(s) of batch i ∈ I k ( k ∈ K ) last pack batch in the processing sequence of unit j ∈ J P duration of task k ∈ { PM , FM } for batch i ∈ I k ∪ N k duration of task k ∈ K ⧹ { S } for batch i ∈ I k ∪ N k on unit j ∈ J i k (= α i k for k ∈ { PM , FM } ) quarantine time of make batch i ∈ I M ∪ N k transfer time of make batch i ∈ I PM ∪ N PM pump out time of make batch i ∈ I M ∪ N M changeover time between batch i ∈ I k ∪ N k and i ′ ∈ I k ∪ N k on unit j ∈ J i k ∩ J i ′ k capacity of tank j ∈ J s size of make batch i ∈ I M ∪ N M (batch independent) size of pack batch i ∈ I P ∪ N P (batch independent) position of task k ∈ K ⧹ { S } of batch i ∈ I k ∪ N k in processing sequence value of p i k in previous iteration; in the first iteration, p i prev , k = 1 position of storage task of batch i ∈ I M ∪ N M in tank j in storing sequence value of p ij S in previous iteration; in the first iteration, p ij prev , S = 1 makespan of previous iteration; in the first iteration, C prev =0 makespan of packing line j ∈ J P of previous iteration; in the first iteration, C j prev = 0 sufficiently large number start time of task k ∈ K ⧹ { S } of batch i ∈ I k ∪ N k amount of material that make batch i ∈ N M supplies to pack batch i ′ ∈ N i P through tank j ∈ J S makespan of production plan makespan of packing line j ∈ J P =1, if make batch i ∈ N M supplies pack batch i ′ ∈ N i P ; =0, otherwise =1, if batch i ∈ N is assigned to unit j ∈ J i k for task k ∈ K ; =0, otherwise = 1 , if batch i ∈ N k is processed / stored before batch i ′ ∈ I k ∪ N k for task k ∈ K ⧹ { S } = 0 , if batch i ∈ N k is processed / stored after batch i ′ ∈ I k ∪ N k for task k ∈ K ⧹ { S } 
A hybrid method for large-scale short-term scheduling of make-and-pack production processes