foodemp.gms : Food Manufacturing Problem - Blending of oils

Description

The problem is to plan the blending of five kinds of oil, organized in two
categories (two kinds of vegetable oils and three kinds of non vegetable oils)
into batches of blended products over six months.

Some of the oil is already available in storage. There is an initial stock of
oil of 500 tons of each raw type when planning begins. An equal stock should
exist in storage at the end of the plan. Up to 1000 tons of each type of raw oil
can be stored each month for later use. The price for storage of raw oils is
5 monetary units per ton. Refined oil cannot be stored. The blended product
cannot be stored either.

The rest of the oil (that is, any not available in storage) must be bought in
quantities to meet the blending requirements. The price of each kind of oil
varies over the six-month period.

The two categories of oil cannot be refined on the same production line.
There is a limit on how much oil of each category (vegetable or non vegetable)
can be refined in a given month:
 - Not more than 200 tons of vegetable oil can be refined per month.
 - Not more than 250 tons of non vegetable oil can be refined per month.

There are constraints on the blending of oils:
 - The product cannot blend more than three oils.
 - When a given type of oil is blended into the product, at least 20 tons of
   that type must be used.
 - If either vegetable oil 1 (v1) or vegetable oil 2 (v2) is blended in the
   product, then non vegetable oil 3 (o3) must also be blended in that product.

The final product (refined and blended) sells for a known price:
150 monetary units per ton.

The aim of the six-month plan is to minimize production and storage costs while
maximizing profit.


Small Model of Type : LOGICAL


Category : GAMS EMP library


Main file : foodemp.gms

$title Food Manufacturing Problem - Blending of oils  (FOODEMP,SEQ=59)

$onText
The problem is to plan the blending of five kinds of oil, organized in two
categories (two kinds of vegetable oils and three kinds of non vegetable oils)
into batches of blended products over six months.

Some of the oil is already available in storage. There is an initial stock of
oil of 500 tons of each raw type when planning begins. An equal stock should
exist in storage at the end of the plan. Up to 1000 tons of each type of raw oil
can be stored each month for later use. The price for storage of raw oils is
5 monetary units per ton. Refined oil cannot be stored. The blended product
cannot be stored either.

The rest of the oil (that is, any not available in storage) must be bought in
quantities to meet the blending requirements. The price of each kind of oil
varies over the six-month period.

The two categories of oil cannot be refined on the same production line.
There is a limit on how much oil of each category (vegetable or non vegetable)
can be refined in a given month:
 - Not more than 200 tons of vegetable oil can be refined per month.
 - Not more than 250 tons of non vegetable oil can be refined per month.

There are constraints on the blending of oils:
 - The product cannot blend more than three oils.
 - When a given type of oil is blended into the product, at least 20 tons of
   that type must be used.
 - If either vegetable oil 1 (v1) or vegetable oil 2 (v2) is blended in the
   product, then non vegetable oil 3 (o3) must also be blended in that product.

The final product (refined and blended) sells for a known price:
150 monetary units per ton.

The aim of the six-month plan is to minimize production and storage costs while
maximizing profit.


This example is taken from the Cplex 12 User's Manual
(ILOG, Cplex 12 User's Manual, 2009)

Williams, H P, Model Building in Mathematical Programming. John Wiley
and Sons, 1978.

Contributor: Jan-Hendrik Jagla, January 2011
$offText

Sets m      planing period     / m1*m6 /
     p      raw oils           / v1*v2, o1*o3 /
     pv(p)  vegetable oils     / v1*v2 /
     pnv(p) non-vegetable oils / o1*o3 /
Parameters
     maxstore  maximum storage of each type of raw oil /   1000 /
     maxusepv  maximum use of vegetable oils           /    200 /
     maxusepnv maximum use of non-vegetable oils       /    250 /
     minusep   minimum use of raw oil                  /     20 /
     maxnusep  maximum number of raw oils in a blend   /      3 /
     sp        sales price of refined and blended oil  /    150 /
     sc        storage cost of raw oils                /      5 /
     stock(p)  stock at the beginning and end          / #p 500 /
     hmin      minimum hardness of refined oil         /      3 /
     hmax      maximum hardness of refined oil         /      6 /
     h(p)      hardness of raw oils / v1 8.8, v2 6.1, o1 2, o2 4.2, o3 5.0 /

Table cost(m,p) raw oil cost
    v1  v2  o1  o2  o3
m1 110 120 130 110 115
m2 130 130 110  90 115
m3 110 140 130 100  95
m4 120 110 120 120 125
m5 100 120 150 110 105
m6  90 100 140  80 135;

Variables
     produce(m)    production of blended and refined oil per month
     use(m,p)      usage of raw oil per month
     induse(m,p)   indicator for usage of raw oil per month
     buy(m,p)      purchase of raw oil per month
     store(m,p)    storage of raw oil at end of the month
     profit        objective variable;
Positive variables produce, buy, store, use;
Binary variable induse;

Equations
     defobj        objective
     defusepv(m)   maximum use of vegetable oils
     defusepnv(m)  maximum use of non-vegetable oils
     defproduce(m) production of refined oil
     defhmin(m)    minmum hardness requirement
     defhmax(m)    maximum hardness requirement
     stockbal(m,p) stock balance constraint
     minuse(m,p)   minimum usage of raw oil
     maxuse(m,p)   usage of raw oil is 0 if induse is 0
     maxnuse(m)    maximum number of raw oils used in a blend
;
Logic Equation
     deflogic1(m)  if some vegetable raw oil is use we also need to use o1
;

defobj..        profit =e=   sum(m, sp*produce(m))
                           - sum((m,p), cost(m,p)*buy(m,p))
                           - sum((m,p), sc*store(m,p));

defusepv(m)..   sum(pv, use(m,pv)) =l= maxusepv;

defusepnv(m)..  sum(pnv, use(m,pnv)) =l= maxusepnv;

defproduce(m).. produce(m) =e= sum(p, use(m,p));

defhmin(m)..    sum(p, h(p)*use(m,p)) =g= hmin*produce(m);

defhmax(m)..    sum(p, h(p)*use(m,p)) =l= hmax*produce(m);

* steady-state stock
stockbal(m,p).. store(m--1,p) + buy(m,p) =e= use(m,p) + store(m,p);

* Now come the logical constraints
minuse(m,p)..   use(m,p) =g= minusep;

maxuse(m,p)..   use(m,p) =l= 0;

maxnuse(m)..    sum(p, induse(m,p)) =l= maxnusep;

deflogic1(m)..  induse(m,'v1') or induse(m,'v2') -> induse(m,'o3');

model foodemp /all/;

$onEcho > "%emp.info%"
disjunction induse minuse else maxuse
$offEcho

store.up(m,p)    = maxstore;
store.fx('m6',p) = stock(p);

option optcr=0;
solve foodemp max profit using emp;