| |||||||||||
Production planning under energy supply uncertainty Description Plan the production of liquid nitrogen and liquid oxygen for
the next N periods subject to an Interruptible Load
Contract (ILC) for the power supply. Formulation using a polyhedral uncertainty set. Further explanation of this example: Whitepaper 'Robust Optimization with Xpress', Section 7 Production planning under energy supply uncertainty
Source Files By clicking on a file name, a preview is opened at the bottom of this page.
Data Files prodplan_robust.mos (!******************************************************* Mosel Example Problems ====================== file prodplan_robust.mos ```````````````````````` Production planning of liquid gases under energy uncertainty (c) 2014 Fair Isaac Corporation author: P. Belotti, Apr. 2014, rev. Jun. 2015 *******************************************************!) model robust_prodplan uses "mmrobust" parameters plan_data = "prodplan_robust.dat" end-parameters declarations NDAYS: integer ! Planning horizon PERDAY: integer ! Number of periods per day NPERIODS: integer ! Total number of periods PERIODS,PERIODS0: range ! Time periods GASES: set of string ! Set of products PROD_CAP: array(GASES) of real ! Production capacity every day INV_CAP: array(GASES) of real ! Inventory capacity INV_0: array(GASES) of real ! Initial inventory PROD_COST: real ! Production cost INV_COST: real ! Inventory cost DEMAND: array (PERIODS, GASES) of real ! Demand of each gas every day MAX_NINTERR: integer ! Maximum number of interruptions ! (as per contract) end-declarations !**** Initialize data **** initializations from plan_data NDAYS PERDAY PROD_CAP INV_CAP PROD_COST INV_COST INV_0 DEMAND MAX_NINTERR end-initializations NPERIODS := NDAYS * PERDAY PERIODS0 := 0..NPERIODS !**** Problem formulation **** declarations produce: array(PERIODS, GASES) of mpvar ! Production every day inventory: array(PERIODS0, GASES) of mpvar ! Inventory level every day, ! including initial level interruption: array(PERIODS) of uncertain ! Is power cut at this time? RobProd: array(PERIODS, GASES) of robustctr ! Robust constraint dealing with uncertainty end-declarations !**** Constraints **** ! Start inventory forall(g in GASES) inventory (0,g) = INV_0 (g) ! Inventory balance forall(t in PERIODS, g in GASES) do RobProd(t,g) := inventory(0,g) + sum(tp in PERIODS | tp <= t) ((1 - interruption(tp)) * produce(tp,g) - DEMAND(tp,g)) >= 0 inventory (0,g) + sum (tp in PERIODS | tp <= t) (produce(tp,g) - DEMAND(tp,g)) <= inventory(t,g) inventory(t,g) <= INV_CAP(g) produce(t,g) <= PROD_CAP(g) end-do ! Interruptions of production forall (t in PERIODS) do interruption (t) <= 1 interruption (t) >= 0 end-do sum(t in PERIODS) interruption (t) <= MAX_NINTERR interruption(1) = 0 !**** Solving **** setparam("robust_uncertain_overlap", true) ! Set verbosity level setparam("xprs_verbose", true) ! Objective function: total cost of production and storage minimize(sum (t in PERIODS, g in GASES) (PROD_COST * produce (t,g) + INV_COST * inventory(t,g))) !**** Solution reporting **** writeln("\nNumber of interruptions: ", MAX_NINTERR) writeln("\nOptimal solution has cost ", getobjval) COLWIDTH := 6 forall(g in GASES) do writeln("\nProduction of ", g) write(strfmt ("Time",-COLWIDTH)) forall(t in PERIODS0) write (strfmt(t,COLWIDTH)) write("\n", strfmt("Dem",-2*COLWIDTH)) forall(t in PERIODS) write(strfmt(DEMAND(t,g),COLWIDTH,1)) write("\n", strfmt("Prod",-2*COLWIDTH)) forall(t in PERIODS) write(strfmt (produce(t,g).sol,COLWIDTH,1)) write("\n", strfmt("Inv*",-COLWIDTH)) forall(t in PERIODS0) write (strfmt(inventory(0,g).sol + sum (tp in PERIODS | tp <= t) (produce(tp,g).sol - DEMAND(tp,g)),COLWIDTH,1)) writeln("\n\nWorst-case interruptions for ", g, ": ") forall(t in PERIODS | getsol(interruption(t),RobProd(t,g)) > 0) write (t, " ") writeln end-do end-model | |||||||||||
© Copyright 2024 Fair Isaac Corporation. |