Initializing help system before first use

Coco: The Coco productional planning problem


Type: Production planning
Rating: 2 (easy-medium)
Description: The company Coco has two plants that can produce two types of cocoa powder. The plant capacities are limited. It is possible to store raw materials and finished product from one time period to the next. Raw material prices, sales revenues, and the maximum amount that may be sold depend on the time period. Raw material storage capacity is limited. Storing product between time periods incurs storage costs. Some product is held in stock at the beginning of the planning period. The objective function of maximizing the total profit is to maximize the sales revenues, minus the cost of production, buying raw material, and storing finished products and raw material.
  • complete problem, data defined in the model definition
  • if-then, if-then-else, if-then-elif statements
File(s): coco.mos


coco.mos
(!*******************************************************
  * 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.0                         ! Unit cost to store any product p
 CRSTOCK = 1.0                         ! 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

© 2001-2020 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.