Lecture V - Planning in Breweries

Applied Optimization with Julia

Author
Affiliation

Dr. Tobias Vlćek

University of Hamburg - Fall 2025

Introduction

Case Study

  • Large brewery
  • Brews and sells beverages
  • Production planning by hand
  • Planner has a lot of experience
  • But will retire soon

Challenges

  • Strong competition
  • Customer demand is changing
  • Craft beer gains popularity
  • Variety of drinks is increasing
  • Batch sizes are getting smaller

Different costs

  • Plant can fill multiple types
  • Time depends on type and batch
  • Changing type leads to set-up costs for preparation and cleaning
  • Unsold beer bottles can be stored in a warehouse
  • This leads to inventory costs

Where is the

challenge?

Problem Structure

Objective

Question: What could be the objective?

Minimize the combined setup and inventory holding cost while satisfying the demand and adhering to the production capacity.

Trade-Off

Question: What is the trade-off?

Larger batches require less setup cost per bottle, but increase the storage cost.


Available Sets

Question: What are sets again?

. . .

Sets are collections of objects.

. . .

Question: What could be the sets here?

. . .

  • \(\mathcal{I}\) - Set of beer types indexed by \(i \in \{1,2,...,|\mathcal{I}|\}\)
  • \(\mathcal{T}\) - Set of time periods indexed by \(t \in \{1,2,...,|\mathcal{T}|\}\)

Available Parameters

Question: What are possible parameters?

. . .

  • \(a_t\) - Available time on the bottling plant in period \(t\in\mathcal{T}\)
  • \(b_i\) - Time used for bottling one unit of beer type \(i\in\mathcal{I}\)
  • \(g_i\) - Setup time for beer type \(i\in\mathcal{I}\)
  • \(f_i\) - Setup cost of beer type \(i\in\mathcal{I}\)
  • \(c_i\) - Inventory holding cost for unit of beer type \(i\in\mathcal{I}\)
  • \(d_{i,t}\) - Demand of beer type \(i\in\mathcal{I}\) in period \(t\in\mathcal{T}\)

Decision Variables?

NoteWe have the following sets:
  • Beer types indexed by \(i \in \{1,2,...,|\mathcal{I}|\}\)
  • Time periods of the planning horizon indexed by \(t \in \{1,2,...,|\mathcal{T}|\}\)

. . .

ImportantOur objective is to:

Minimize the combined setup and inventory holding cost while satisfying the demand and adhering to the production capacity.

. . .

Question: What could be our decision variable/s?

Decision Variables

  • \(W_{i,t}\) - Inventory of type \(i\in\mathcal{I}\) at the end of \(t\in\mathcal{T}\)
  • \(Y_{i,t}\) - 1, if type \(i\in\mathcal{I}\) is bottled in \(t\in\mathcal{T}\), 0 otherwise
  • \(X_{i,t}\) - Batch size of type \(i\in\mathcal{I}\) in \(t\in\mathcal{T}\)

Model Formulation

Objective Function?

ImportantOur objective is to:

Minimize the combined setup and inventory holding cost while satisfying the demand and adhering to the production capacity.

. . .

Question: What could be our objective function?

. . .

NoteWe need the following variables:
  • \(W_{i,t}\) - Inventory of type \(i\in\mathcal{I}\) at the end of \(t\in\mathcal{T}\)
  • \(Y_{i,t}\) - 1, if type \(i\in\mathcal{I}\) is bottled in \(t\in\mathcal{T}\), 0 otherwise

Objective Function

NoteWe need the following parameters:
  • \(f_i\) - Setup cost of beer type \(i\in\mathcal{I}\)
  • \(c_i\) - Inventory holding cost for one unit of beer type \(i\in\mathcal{I}\)

. . .

\[\text{Minimize} \quad \sum_{i=1}^{\mathcal{I}} \sum_{t=1}^{\mathcal{T}} (c_i \times W_{i,t} + f_i \times Y_{i,t})\]

Constraints

Question: What constraints?

  • Transfer unused inventory
  • Fulfill the customer demand
  • Set up beer types
  • Calculate batch size per set-up
  • Compute remaining inventory
  • Limit the bottling plant

Demand/Inventory Constraints?

ImportantThe goal of these constraints is to:

Consider the current inventory and batch sizes and compute the remaining inventory.

. . .

NoteWe need the following variables and parameters:
  • \(W_{i,t}\) - Inventory of beer type \(i\in\mathcal{I}\) at the end of period \(t\in\mathcal{T}\)
  • \(X_{i,t}\) - Batch size of beer type \(i\in\mathcal{I}\) in \(t\in\mathcal{T}\)
  • \(d_{i,t}\) - Demand of beer type \(i\in\mathcal{I}\) in period \(t\in\mathcal{T}\)

. . .

Question: What could the constraint look like?

Demand/Inventory Constraints

\[W_{i,t-1} + X_{i,t} - W_{i,t} = d_{i,t} \quad \forall i\in\mathcal{I},t\in\mathcal{T}|t>1\]

. . .

NoteRemember, these are the variables and parameters:
  • \(W_{i,t}\) - Inventory of beer type \(i\in\mathcal{I}\) at the end of period \(t\in\mathcal{T}\)
  • \(X_{i,t}\) - Batch size of beer type \(i\in\mathcal{I}\) in \(t\in\mathcal{T}\)
  • \(d_{i,t}\) - Demand of beer type \(i\in\mathcal{I}\) in period \(t\in\mathcal{T}\)

. . .

Question: What does \(|t>1\) mean?

Setup Constraints?

ImportantThe goal of these constraints is to:

Set up beer types where the batch size is \(\geq\) 0.

. . .

NoteWe need the following variables and parameters:
  • \(Y_{i,t}\) - 1, if beer type \(i\in\mathcal{I}\) is bottled in period \(t\in\mathcal{T}\), 0 otherwise
  • \(X_{i,t}\) - Batch size of beer type \(i\in\mathcal{I}\) in \(t\in\mathcal{T}\)
  • \(d_{i,t}\) - Demand of beer type \(i\in\mathcal{I}\) in period \(t\in\mathcal{T}\)

. . .

Question: What could the second constraint be?

Setup Constraints

\[X_{i,t} \leq Y_{i,t} \times \sum_{\tau=1}^{\mathcal{T}} d_{i\tau} \quad \forall i\in\mathcal{I},\forall t\in\mathcal{T}\]

. . .

Question: Do you know this type of constraint?

. . .

This type of constraint is called a “Big-M” constraint!

. . .

  • M (here \(\sum_{\tau=1}^{\mathcal{T}} d_{i\tau}\)) is a large number
  • It is coupled with a binary variable (here \(Y_{i,t}\))
  • Like an if-then constraint

Capacity Constraints?

ImportantThe goal of these constraints is to:

Limit the capacity of the bottling plant per period.

. . .

NoteWe need the following variables and parameters:
  • \(Y_{i,t}\) - 1, if beer type \(i\in\mathcal{I}\) is bottled in period \(t\in\mathcal{T}\), 0 otherwise
  • \(X_{i,t}\) - Batch size of beer type \(i\in\mathcal{I}\) in \(t\in\mathcal{T}\)
  • \(a_t\) - Available time on the bottling plant in period \(t\in\mathcal{T}\)
  • \(b_i\) - Time used for bottling one unit of beer type \(i\in\mathcal{I}\)
  • \(g_i\) - Setup time for beer type \(i\in\mathcal{I}\)

Capacity Constraints

Question: What could the third constraint be?

It has more variables and parameters when compared to the other constraints but it is easier to understand.

. . .

\[\sum_{i=1}^{\mathcal{I}} (b_i \times X_{i,t} + g_i \times Y_{i,t}) \leq a_t \quad \forall t\in\mathcal{T}\]

. . .

And that’s basically it!

CLSP: Objective Function

\[\text{Minimize} \quad \sum_{i \in \mathcal{I}} \sum_{t \in \mathcal{T}} (c_i \times W_{i,t} + f_i \times Y_{i,t})\]

ImportantThe goal of the objective function is to:

Minimize the combined setup and inventory holding cost while satisfying the demand and adhering to the production capacity.

CLSP: Constraints

\[W_{i,t-1} + X_{i,t} - W_{i,t} = d_{i,t} \quad \forall i\in\mathcal{I},t\in\mathcal{T}|t>1\]

\[X_{i,t} \leq Y_{i,t} \times \sum_{\tau \in \mathcal{T}} d_{i,\tau} \quad \forall i\in\mathcal{I},\forall t\in\mathcal{T}\]

\[\sum_{i \in \mathcal{I}} (b_i \times X_{i,t} + g_i \times Y_{i,t}) \leq a_t \quad \forall t\in\mathcal{T}\]

ImportantOur constraints ensure:

Demand is met, inventory transferred, setup taken care of, and capacity respected.

CLSP: Variable Domains

\[Y_{i,t}\in\{0,1\} \quad \forall i\in\mathcal{I},t\in\mathcal{T}\]

\[W_{i,t}, X_{i,t}\geq 0 \quad \forall i\in\mathcal{I},t\in\mathcal{T}\]

ImportantThe variable domains make sure that:

The binary setup variable is either 0 or 1 and that the inventory and batch size are non-negative.

Julia Implementation

Variables in Julia

Question: How could we formulate the variables in Julia?

. . .

using JuMP, HiGHS
beer_types = ["IPA", "Lager", "Stout"] # Beer types
periods = ["week_1", "week_2", "week_3"] # Time periods
clsp_model = Model(HiGHS.Optimizer)

. . .

@variable(clsp_model, Y[i in beer_types, t in periods], Bin)
@variable(clsp_model, X[i in beer_types, t in periods] >= 0)
@variable(clsp_model, W[i in beer_types, t in periods] >= 0)
2-dimensional DenseAxisArray{VariableRef,2,...} with index sets:
    Dimension 1, ["IPA", "Lager", "Stout"]
    Dimension 2, ["week_1", "week_2", "week_3"]
And data, a 3×3 Matrix{VariableRef}:
 W[IPA,week_1]    W[IPA,week_2]    W[IPA,week_3]
 W[Lager,week_1]  W[Lager,week_2]  W[Lager,week_3]
 W[Stout,week_1]  W[Stout,week_2]  W[Stout,week_3]

Objective Function in Julia

\[\text{Minimize} \quad \sum_{i \in \mathcal{I}} \sum_{t \in \mathcal{T}} (c_i \times W_{i,t} + f_i \times Y_{i,t})\]

. . .

c = Dict("IPA" => 0.1, "Lager" => 0.1, "Stout" => 0.1) # Holding costs
f = Dict("IPA" => 5000, "Lager" => 4000, "Stout" => 6000) # Setup costs

. . .

@objective(clsp_model, Min,
    sum(c[i] * W[i,t] + f[i] * Y[i,t]
        for i in beer_types, t in periods)
)

Model Characteristics

Recap on some Basics

There exist several types of optimization problems:

  • Linear (LP): Linear constraints and objective function
  • Mixed-integer (MIP): Linear constraints and objective function, but discrete variable domains
  • Quadratic (QP): Quadratic constraints and/or objective
  • Non-linear (NLP): Non-linear constraints and/or objective
  • And more!

Recap on Solution Algorithms

  • Simplex algorithm to solve LPs
  • Branch & Bound to solve MIPs
  • Outer-Approximation for mixed-integer NLPs
  • Math-Heuristics (e.g., Fix-and-Optimize, Tabu-Search, …)
  • Decomposition methods (Lagrange, Benders, …)
  • Heuristics (greedy, construction method, n-opt, …)
  • Graph theoretical methods (network flow, shortest path)

Model Characteristics

Questions: On model characteristics

  • Is the model formulation linear/ non-linear?
  • What kind of variable domains do we have?
  • What kind of solver could we use?
  • Can the Big-M constraint be tightened?

Model Assumptions

Questions: On model assumptions

  • What assumptions have we made?
  • What is the problem with the planning horizon?
  • Any idea how to solve it?

Impact

Can this be

applied?

Scale as a Problem

Solving the problem with commercial solvers is not feasible.

Scale of the Case Study

  • 220 finished products
  • 100 semi-finished products
  • 13 production resources
  • 8 storage resources
  • 3 main production levels
  • 52 weeks planning horizon

Any idea what

could be done?

Heuristics and Optimization

  • Multi-level Capacitated Lot-Sizing Problem
  • Heuristic fix and optimize approach 1
  • Operating cost reduction by 5% and planning effort by 40%

1 Mickein, Koch, and Haase (2022)

Mickein, Markus, Matthes Koch, and Knut Haase. 2022. “A Decision Support System for Brewery Production Planning at Feldschlösschen.” INFORMS Journal on Applied Analytics 52 (2): 158–72.

. . .

NoteAnd that’s it for todays lecture!

We now have covered the basics of the CLSP and are ready to start solving some tasks in the upcoming tutorial.

Questions?

Literature

Literature I

For more interesting literature to learn more about Julia, take a look at the literature list of this course.

Literature II