| |||||||||||||
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).
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 MINGRADE = 4 ! Min permitted grade of product MAXGRADE = 5 ! Max permitted grade 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] GRADE:: [2.1, 6.3] ! Objective: maximize total profit Profit:= sum(o in ROres) (REV-COST(o))* x(o) ! Lower and upper bounds on ore quality LoGrade:= sum(o in ROres) (GRADE(o)-MINGRADE) * x(o) >= 0 UpGrade:= sum(o in ROres) (MAXGRADE-GRADE(o)) * x(o) >= 0 ! 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 svgaddgroup("O"+o, "Ore "+o) svgaddpie(100,100,55,cum,cum+(x(o).sol/ttl)) cum+=x(o).sol/ttl svgaddline(175, GRADE(o)*FACT, 225, GRADE(o)*FACT) end-do svgaddgroup("msg", "", SVG_BLACK) svgaddtext(75,15, "Composition") svgaddtext(185,15, "Quality") svgaddgroup("lim", "Target quality range", SVG_GREEN) svgsetstyle(SVG_FILL,SVG_CURRENT) svgsetstyle(SVG_OPACITY, 0.5) svgaddrectangle(175, MINGRADE*FACT, 50, (MAXGRADE-MINGRADE)*FACT) svgaddgroup("final", "Blend quality", SVG_BROWN) svgsetstyle(SVG_OPACITY, 0.5) val:=sum(o in ROres) GRADE(o)*FACT* x(o).sol/ttl svgaddline(175, val, 225, val) svgsave("blend.svg") svgrefresh svgwaitclose("Close browser window to terminate model execution.", 1) end-model | |||||||||||||
© Copyright 2024 Fair Isaac Corporation. |