(!****************************************************** Mosel Example Problems ====================== file a5mine.mos ``````````````` Opencast mining An opencast uranium mine is being prospected. 6 of the 18 blocks contain uranium. To extract a block, 3 blocks of the level above it need to be extracted. Blocks have varied extraction costs and each block of uranium has a different market value. The objective is to determine which blocks to extract to maximize total benefit. This model uses binary variables to indicate which blocks will be extracted. There is also a two-dimensional array to enforce the extraction order between layers. A relaxed formulation of this constraint is commented out for reference. (c) 2008-2022 Fair Isaac Corporation author: S. Heipcke, Feb. 2002, rev. Mar. 2022 *******************************************************!) model "A-5 Opencast mining" uses "mmxprs" declarations BLOCKS = 1..18 ! Set of blocks LEVEL23: set of integer ! Blocks in levels 2 and 3 COST: array(BLOCKS) of real ! Exploitation cost of blocks VALUE: array(BLOCKS) of real ! Value of blocks ARC: array(LEVEL23,1..3) of integer ! Arcs indicating order of extraction extract: array(BLOCKS) of mpvar ! 1 if block b is extracted end-declarations initializations from 'a5mine.dat' COST VALUE ARC end-initializations ! Objective: maximize total profit Profit:= sum(b in BLOCKS) (VALUE(b)-COST(b))* extract(b) ! Extraction order ! forall(b in LEVEL23) 3*extract(b) <= sum(i in 1..3) extract(ARC(b,i)) forall(b in LEVEL23) forall(i in 1..3) extract(b) <= extract(ARC(b,i)) forall(b in BLOCKS) extract(b) is_binary ! Solve the problem maximize(Profit) ! Solving LP relaxation only ! maximize(XPRS_LIN, Profit) ! Solution printing declarations WEIGHT: integer ! Weight of blocks end-declarations initializations from 'a5mine.dat' WEIGHT end-initializations writeln("Total profit:", getobjval*WEIGHT) write("Extract blocks") forall(b in BLOCKS | getsol(extract(b))>0) write(" ", b) writeln end-model