![The Solution](images/solution.jpg)
Standard scheduling algorithms do not handle tankage well even in much simpler
situations. In order to generate a schedule which closely meets demand for beer brands
while synchronising tank usage and yeast re-use, we must use mixed integer programming.
We cannot handle individual tanks over the two-month timespan required, so we work at the
level of tank groups and their total capacity.
Batches of beer cannot be mixed, so we
cannot treat the primary stages (brewhouse, fermentation, storage) as independent processes
linked only by material balances. Instead we recognise the concept of "batch"
in the model. In each day a finite (predetermined) number of batches of each beer brand
may or may not start. For each batch of a given brand on a given day we must decide:
![](images/bullet1.jpg)
|
Which brewhouse to use
|
![](images/bullet2.jpg)
|
Which group of fermentation tanks to use
|
![](images/bullet3.jpg)
|
Which generation of yeast to tip in – noting that the "zeroth"
generation implies a smaller prop batch
|
![](images/bullet4.jpg)
|
Which group of storage tanks to use.
|
The original model used these decisions to determine a collection of "route"
variables, representing a complete path through the primary stages. There are many
restrictions on the physical links between the stages – for example, which brewhouses
can feed which fermentation tank groups. Even so, the number of route variables was
very large and the problem became impractical.
Further analysis showed that three subsets of the four decisions above were sufficient to
determine all interactions with the rest of the model:
![](images/bullet5.jpg)
|
Brewhouse, fermentation tank group and prop/standard batch together determine brewhouse,
racking and fermentation tank usage
|
![](images/bullet6.jpg)
|
Brewhouse, fermentation tank group and yeast generation determine yeast quantities
tipped and cropped, and the timing of those activities
|
![](images/bullet7.jpg)
|
Fermentation tank group, storage tank group and prop/standard batch determine
storage vessel usage up to maturity, and mature beer quantity and ready time.
|
The quantities of fermenting and maturing beer are not represented in the model –
all we are concerned with is tank usage. Even if a tank is not full, its capacity
is fully used by one batch, and we can accurately represent that situation by consuming
a whole tank-worth of capacity out of the tank group's total over the appropriate time span.
However, once the beer is mature, it may be removed from the storage tank at any time,
possibly in a series of separate filtering operations as required to meet demand.
So we must treat it in the conventional manner as a material in inventory, which consumes
storage capacity. We can make the capacity used a multiple (for example 1.1) of the
quantity held to recognise the average fill percentage (for example 91%).
The model solves in a few minutes. The results are passed to the scheduling module,
where specific fermentation and storage tanks are allocated on a first-come first-served
basis. The complete schedule is displayed in the planning board as activities on tank
facilities (and packaging lines), with material flow links connecting the stages of each
batch.
![Schedule](images/tanks3.jpg)
|