| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Mining and process industries Description
Further explanation of this example: 'Applications of optimization with Xpress-MP', Chapter 6: Mining and process industries (blending problems)
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
Data Files
a3refine.mos (!****************************************************** Mosel Example Problems ====================== file a3refine.mos ````````````````` Refinery planning A refinery produces butane, petrol, diesel oil, and heating oil from two crudes. Four types of operations are necessary to obtain these products: separation, conversion, upgrading, and blending. Monthly demand must be met while certain levels of octane value, vapor pressure, volatility, and sulfur content are enforced by law. The objective is to minimize crude and production cost. A much more involved linear programming blending problem with two production stages that are related in complicated ways. The implementation has sparse data with string indices that are initialized dynamically from the input data file. A new set 'ALLPRODS' is defined as the union of several other sets. (c) 2008-2022 Fair Isaac Corporation author: S. Heipcke, Feb. 2002, rev. Mar. 2022 *******************************************************!) model "A-3 Refinery planning" uses "mmxprs" declarations CRUDES: set of string ! Set of crudes ALLPRODS: set of string ! Intermediate and final products FINAL: set of string ! Final products IDIST: set of string ! Products obtained by distillation IREF: set of string ! Products obtained by reforming ICRACK: set of string ! Products obtained by cracking IPETROL: set of string ! Interm. products for petrol IDIESEL: set of string ! Interm. products for diesel IHO={"hogasoil", "hocrknaphtha", "hocrkgasoil"} ! Interm. products for heating oil DEM: array(FINAL) of real ! Min. production COST: array(set of string) of real ! Production costs AVAIL: array(CRUDES) of real ! Crude availability OCT, VAP, VOL: array(IPETROL) of real ! Octane, vapor pressure, and ! volatility values SULF: array(IDIESEL) of real ! Sulfur contents DIST: array(CRUDES,IDIST) of real ! Composition of crudes (in %) REF: array(IREF) of real ! Results of reforming (in %) CRACK: array(ICRACK) of real ! Results of cracking (in %) end-declarations initializations from 'a3refine.dat' DEM COST OCT VAP VOL SULF AVAIL DIST REF CRACK end-initializations ALLPRODS:= FINAL+IDIST+IREF+ICRACK+IPETROL+IHO+IDIESEL declarations use: array(CRUDES) of mpvar ! Quantities used produce: array(ALLPRODS) of mpvar ! Quantities produced end-declarations ! Objective function Cost:= sum(c in CRUDES) COST(c)*use(c) + sum(p in IDIST) COST(p)*produce(p) ! Relations intermediate products resulting of distillation - raw materials forall(p in IDIST) produce(p) <= sum(c in CRUDES) DIST(c,p)*use(c) ! Relations between intermediate products ! Reforming: forall(p in IREF) produce(p) <= REF(p)*produce("naphtha") ! Cracking: forall(p in ICRACK) produce(p) <= CRACK(p)*produce("residue") produce("crknaphtha") = produce("petcrknaphtha") + produce("hocrknaphtha") + produce("dslcrknaphtha") produce("crkgasoil") = produce("hocrkgasoil") + produce("dslcrkgasoil") ! Desulfurization: produce("gasoil") = produce("hogasoil") + produce("dslgasoil") ! Relations final products - intermediate products produce("butane") = produce("distbutane") + produce("refbutane") - produce("petbutane") produce("petrol") = sum(p in IPETROL) produce(p) produce("diesel") = sum(p in IDIESEL) produce(p) produce("heating") = sum(p in IHO) produce(p) ! Properties of petrol sum(p in IPETROL) OCT(p)*produce(p) >= 94*produce("petrol") sum(p in IPETROL) VAP(p)*produce(p) <= 12.7*produce("petrol") sum(p in IPETROL) VOL(p)*produce(p) >= 17*produce("petrol") ! Limit on sulfur in diesel oil sum(p in IDIESEL) SULF(p)*produce(p) <= 0.05*produce("diesel") ! Crude availabilities forall(c in CRUDES) use(c) <= AVAIL(c) ! Production capacities produce("naphtha") <= 30000 ! Reformer produce("gasoil") <= 50000 ! Desulfurization produce("residue") <= 40000 ! Cracker ! Satisfy demands forall(p in FINAL) produce(p) >= DEM(p) ! Solve the problem minimize(Cost) ! Solution printing writeln("Production costs: ", strfmt(getobjval,10,2)) forall(c in CRUDES) writeln(c, ": ", getsol(use(c))) forall(p in ALLPRODS) writeln(p, ": ", getsol(produce(p))) writeln("Petrol properties:") writeln(" octane: ", getsol(sum(p in IPETROL) OCT(p)*produce(p))/ getsol(produce("petrol")), " vapor presure: ", getsol(sum(p in IPETROL) VAP(p)*produce(p))/ getsol(produce("petrol")), " volatility: ", getsol(sum(p in IPETROL) VOL(p)*produce(p))/ getsol(produce("petrol"))) writeln("Sulfur in diesel oil: ", getsol(sum(p in IDIESEL) SULF(p)*produce(p))/getsol(produce("diesel")) ) end-model | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
© Copyright 2023 Fair Isaac Corporation. |