(!******************************************************* * Mosel Example Problems * * ====================== * * * * file coco.mos * * ````````````` * * Example for the use of the Mosel language * * (Complete Coco Problem. * * Specify phase by PHASE parameter. * * Data input in the model, not via data files.) * * * * (c) 2008 Fair Isaac Corporation * * author: S. Heipcke, 2001, rev. Feb. 2010 * *******************************************************!) model Coco ! Start a new model uses "mmxprs" ! Load the optimizer library uses "mmsystem" parameters PHASE=5 (!* Phase = 3: Multi-period parameterised model; mines always open * Phase = 4: Mines may open/closed freely; when closed save 20000 per month * Phase = 5: Once closed always closed; larger saving !) end-parameters declarations NT=4 ! Number of time periods RP=1..2 ! Range of products (p) RF=1..2 ! factories (f) RR=1..2 ! raw materials (r) RT=1..NT ! time periods (t) REV: array(RP,RT) of real ! Unit selling price of product p CMAKE: array(RP,RF) of real ! Unit cost to make product p ! at factory f CBUY: array(RR,RT) of real ! Unit cost to buy raw material r COPEN: array(RF) of real ! Fixed cost of factory f being ! open for one period REQ: array(RP,RR) of real ! Requirement by unit of product p ! for raw material r MXSELL: array(RP,RT) of real ! Max. amount of p that can be sold MXMAKE: array(RF) of real ! Max. amount factory f can make ! over all products PSTOCK0: array(RP,RF) of real ! Initial product p stock level ! at factory f RSTOCK0: array(RR,RF) of real ! Initial raw material r stock ! level at factory f CPSTOCK = 2 ! Unit cost to store any product p CRSTOCK = 1 ! Unit cost to store any raw mat. r MXRSTOCK = 300 ! Max. amount of r that can be ! stored each f and t make: array(RP,RF,RT) of mpvar ! Amount of product p made at ! factory f sell: array(RP,RF,RT) of mpvar ! Amount of product p sold from ! factory f in period t buy: array(RR,RF,RT) of mpvar ! Amount of raw material r bought ! for factory f in period t pstock: array(RP,RF,1..NT+1) of mpvar ! Stock level of product p at ! factory f at start of period t rstock: array(RR,RF,1..NT+1) of mpvar ! Stock level of raw material r at ! factory f at start of period t openm: array(RF,RT) of mpvar ! 1 if factory f is open in ! period t, else 0 end-declarations REV :: [400, 380, 405, 350, 410, 397, 412, 397] CMAKE :: [150, 153, 75, 68] CBUY :: [100, 98, 97, 100, 200, 195, 198, 200] COPEN :: [50000, 63000] REQ :: [1.0, 0.5, 1.3, 0,4] MXSELL :: [650, 600, 500, 400, 600, 500, 300, 250] MXMAKE :: [400, 500] PSTOCK0 :: [50, 100, 50, 50] RSTOCK0 :: [100, 150, 50, 100] ! Objective: maximize total profit MaxProfit:= sum(p in RP,f in RF,t in RT) REV(p,t) * sell(p,f,t) - ! revenue sum(p in RP,f in RF,t in RT) CMAKE(p,f) * make(p,f,t) - ! prod. cost sum(r in RR,f in RF,t in RT) CBUY(r,t) * buy(r,f,t) - ! raw mat. cost sum(p in RP,f in RF,t in 2..NT+1) CPSTOCK * pstock(p,f,t) - ! p stor. cost sum(r in RR,f in RF,t in 2..NT+1) CRSTOCK * rstock(r,f,t) ! r stor. cost if PHASE=4 then ! Factory fixed cost MaxProfit -= sum(f in RF,t in RT) (COPEN(f)-20000)*openm(f,t) elif PHASE=5 then MaxProfit -= sum(f in RF,t in RT) COPEN(f)* openm(f,t) end-if ! Product stock balance forall(p in RP,f in RF,t in RT) PBal(p,f,t):= (pstock(p,f,t+1) = pstock(p,f,t) + make(p,f,t) - sell(p,f,t)) ! Raw material stock balance forall(r in RR,f in RF,t in RT) RBal(r,f,t):= rstock(r,f,t+1) = rstock(r,f,t) + buy(r,f,t) - sum(p in RP) REQ(p,r)*make(p,f,t) ! Capacity limit at factory f forall(f in RF,t in RT) MxMake(f,t):= sum(p in RP) make(p,f,t) <= MXMAKE(f)*openm(f,t) ! Limit on the amount of prod. p to be sold forall(p in RP,t in RT) MxSell(p,t):= sum(f in RF) sell(p,f,t) <= MXSELL(p,t) ! Raw material stock limit forall(f in RF,t in 2..NT+1) MxRStock(f,t):= sum(r in RR) rstock(r,f,t) <= MXRSTOCK if PHASE=5 then ! Once closed, always closed forall(f in RF,t in 1..NT-1) Closed(f,t):= openm(f,t+1) <= openm(f,t) end-if ! Initial product levels forall(p in RP,f in RF) pstock(p,f,1) = PSTOCK0(p,f) ! Initial raw material levels forall(r in RR,f in RF) rstock(r,f,1) = RSTOCK0(r,f) if PHASE>=4 then forall(f in RF,t in RT) openm(f,t) is_binary else forall(f in RF,t in RT) openm(f,t) = 1 end-if maximize(MaxProfit) ! Solve the LP or MIP-problem ! Print out the solution writeln("Solution:\n Objective: ", getobjval) hline:=60*"-" writeln("Total profit: ", getobjval) writeln(hline) write(8*" ", "Period") forall(t in 0..NT) write(strfmt(t,8)) writeln("\n", hline) writeln("Finished products\n", "=================") forall(f in RF) do writeln(" Factory ", f) forall(p in RP) do write(3*" ", "P", p, ": Prod", 10*" ") forall(t in RT) write(strfmt(make(p,f,t).sol,8)) writeln write(8*" ", "Sell", 10*" ") forall(t in RT) write(strfmt(sell(p,f,t).sol,8)) writeln write(8*" ", "(Stock)") forall(t in 1..NT+1) write(" (", strfmt(pstock(p,f,t).sol,3), ")") writeln end-do end-do writeln(hline) writeln("Raw material\n", "============") forall(f in RF) do writeln(" Factory ", f) forall(r in RR) do write(3*" ", "R", r, ": Buy ", 10*" ") forall(t in RT) write(strfmt(buy(r,f,t).sol,8)) writeln write(8*" ", "Use ", 10*" ") forall(t in RT) write(strfmt(getsol(sum(p in RP) REQ(p,r)*make(p,f,t)),8)) writeln write(8*" ", "(Stock)") forall(t in 1..NT+1) write(" (", strfmt(rstock(r,f,t).sol,3), ")") writeln end-do end-do writeln(hline) end-model