$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;