FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Mining and process industries

Description
Problem name and type, featuresDifficultyRelated examples
A‑1 Production of alloys: Blending problem

formulation of blending constraints; data with numerical indices, solution printout, if-then, getsol
* blending_graph.mos
A‑2 Animal food production: Blending problem

formulation of blending constraints; data with string indices, as, formatted solution printout, use of getsol with linear expressions, strfmt
* a1alloy.mos
A‑3 Refinery : Blending problem

formulation of blending constraints; sparse data with string indices, dynamic initialization, union of sets
** a2food.mos
A‑4 Cane sugar production : Minimum cost flow (in a bipartite graph)

mo ceil, is_binary, formattext
* e2minflow.mos, mincostflow_graph.mos
A‑5 Opencast mining: Minimum cost flow

encoding of arcs, solving LP-relaxation only, array of set
** a4sugar.mos
A‑6 Production of electricity: Dispatch problem

inline if, is_integer, looping over optimization problem solving
**


Further explanation of this example: 'Applications of optimization with Xpress-MP', Chapter 6: Mining and process industries (blending problems)

mosel_app_1.zip[download all files]

Source Files

Data Files





a2food.mos

(!******************************************************
   Mosel Example Problems
   ======================
    
   file a2food.mos
   ```````````````
   Food production for farm animals
   
   Food must meet required content levels of nutritional 
   components (Proteins, Lipids, Fiber). Given the raw 
   materials available each day and daily demand to meet, 
   the objective is to determine how the Oat, Maize, 
   and Molasses should be blended to minimize the total cost.

   Simple linear programming blending problem formulation includes 
   data with string indices and string formatting for solution printout.

   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, Feb. 2002
*******************************************************!)

model "A-2 Animal Food Production"
 uses "mmxprs"
 
 declarations
  FOOD = 1..2                    ! Food types
  COMP = 1..3                    ! Nutritional components
  RAW  = {"oat", "maize", "molasses"}   ! Raw materials
  
  P: array(RAW,COMP) of real     ! Composition of raw materials (in percent)
  REQ: array(COMP) of real       ! Nutritional requirements
  AVAIL: array(RAW) of real      ! Raw material availabilities
  COST: array(RAW) of real       ! Raw material prices
  PCOST: array(set of string) of real  ! Cost of processing operations
  DEM: array(FOOD) of real       ! Demands for food types

  use: array(RAW,FOOD) of mpvar  ! Quantity of raw mat. used for a food type
  produce: array(FOOD) of mpvar  ! Quantity of food produced
 end-declarations

 initializations from 'a2food.dat'
  P REQ PCOST DEM
  [AVAIL, COST] as 'RAWMAT'
 end-initializations
 
! Objective function
 Cost:= sum(r in RAW,f in FOOD) COST(r)*use(r,f) +
        sum(r in RAW,f in FOOD|r<>"molasses") PCOST("grinding")*use(r,f) +
        sum(r in RAW,f in FOOD) PCOST("blending")*use(r,f) +
        sum(r in RAW) PCOST("granulating")*use(r,1) +
        sum(r in RAW) PCOST("sieving")*use(r,2)

! Quantity of food produced corresponds to raw material used
 forall(f in FOOD) sum(r in RAW) use(r,f) = produce(f)

! Fulfill nutritional requirements
 forall(f in FOOD,c in 1..2) 
  sum(r in RAW) P(r,c)*use(r,f) >= REQ(c)*produce(f)
 forall(f in FOOD) sum(r in RAW) P(r,3)*use(r,f) <= REQ(3)*produce(f)

! Use raw materials within their limit of availability
 forall(r in RAW) sum(f in FOOD) use(r,f) <= AVAIL(r)

! Satisfy demands
 forall(f in FOOD) produce(f) >= DEM(f)

! Solve the problem
 minimize(Cost)

! Solution printing
 writeln("Total cost: ", getobjval)
 write("Food type"); forall(r in RAW) write(strfmt(r,9))
 writeln("  protein  lipid   fiber")
 forall(f in FOOD) do
  write(strfmt(f,-9))
  forall(r in RAW) write(strfmt(getsol(use(r,f)),9,2))     
  forall(c in COMP) write("   ", 
   strfmt(getsol(sum(r in RAW) P(r,c)*use(r,f))/getsol(produce(f)),3,2),"%")
  writeln
 end-do
 
end-model

Back to examples browserPrevious exampleNext example