FICO Xpress Optimization Examples Repository
 FICO Optimization Community FICO Xpress Optimization Home

Blending ores

Description
Several ores are blended to a final product that must have a certain quality ('grade'). We wish to determine the quantity of every ore to be used in the blend with the objective to maximize the total profit (calculated as sales revenues - raw material cost).
• simple LP problem
• data in model or input from file
• bounds on variables
Further explanation of this example: 'Mosel User Guide', Section 2.2 'A blending example'; 'Applications of optimization with Xpress-MP', Section 2.7 'Blending constraints'. Similar problems: Section 6.1 'Production of alloys' (a1alloy.mos), Section 6.2 'Animal food production' (a2food.mos), Section 6.3 'Refinery' (a3refine.mos)

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.

Data Files

blending_graph.mos

(!******************************************************
Mosel Example Problems
======================

file blending.mos

TYPE:         Blending problem
DIFFICULTY:   1
FEATURES:     simple LP problem, formulation of blending constraints
DESCRIPTION:  Several ores are blended to a final product that must
have a certain quality (grade'). We wish to determine
the quantity of every ore to be used in the blend with
the objective to maximize the total profit (calculated
as sales revenues - raw material cost).
FURTHER INFO: Mosel User Guide', Section 2.2 A blending example';
Applications of optimization with Xpress-MP',
Section 2.7 Blending constraints'.
Similar problems: Section 6.1 Production of alloys',
Section 6.2 Animal food production',  Section 6.3 Refinery'

(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Jan. 2001, rev. Sep. 2017
*******************************************************!)

model blending
uses "mmxprs", "mmsvg"

declarations
ROres = 1..2                 ! Range of Ores
REV = 125                    ! Unit revenue of product
COST: array(ROres) of real   ! Unit cost of ores
AVAIL: array(ROres) of real  ! Availability of ores
GRADE: array(ROres) of real  ! Grade of ores (measured per unit of mass)

x: array(ROres) of mpvar     ! Quantities of ores used

end-declarations

COST :: [85, 93]
AVAIL:: [60, 45]

! Objective: maximize total profit
Profit:= sum(o in ROres) (REV-COST(o))* x(o)

! Lower and upper bounds on ore quality

! Set upper bounds on variables
forall(o in ROres) x(o) <= AVAIL(o)

! Solve the problem
maximize(Profit)

! Solution printing
writeln("Solution:\n Objective: ", getobjval)
forall(o in ROres)  writeln(" x(" + o + "): ", getsol(x(o)))

! Solution drawing
FACT:=20
ttl:=sum(o in ROres) x(o).sol
cum:=0.0
forall(o in ROres) do
cum+=x(o).sol/ttl
end-do

svgsetstyle(SVG_FILL,SVG_CURRENT)
svgsetstyle(SVG_OPACITY, 0.5)
`