openpit.gms : Dynamic open pit mining extraction

**Description**

This is an example of how to model material extractions that have sequencing requirements with a multi-period decision process. A segment has to be extracted completely before we can start on the next segment. Segments not completely extracted have to be extracted in the next time period or remain partially extracted in the last time period. The requirement of full extraction adds complications to the modeling within the multi-period framework.

**Reference**

- GAMS Development Corporation, Formulation and Language Example.

**Large Model of Type :** MIP

**Category :** GAMS Model library

**Main file :** openpit.gms

```
$title Dynamic open pit mining extraction (OPENPIT,SEQ=309)
$ontext
This is an example of how to model material extractions that
have sequencing requirements with a multi-period decision process.
A segment has to be extracted completely before we can start on
the next segment. Segments not completely extracted have to be
extracted in the next time period or remain partially extracted in
the last time period. The requirement of full extraction adds
complications to the modeling within the multi-period framework.
Reference: GAMS Development Corporation, Formulation and Language
Example.
$offtext
$if NOT set tmx $set tmx 4
$if NOT set smx $set smx 50
$if NOT set pmx $set pmx 4
set t extraction periods / t1*t%tmx% /
s extraction segments / s1*s%smx% /
p pits / p1*p%pmx% /;
parameter nev(p,s) net extraction benefit
evo(p,s) extraction volume
demand(t) product demand
rho discount rate
delta(t) discount factor;
parameter fix(p) offset for random value
var(p) var for random values;
* produce random input data with differing net benefit profiles
fix(p) = uniform(-1,+1); var(p) = -sign(fix(p))*uniform(1,5);
nev(p,s) = (fix(p) + var(p)/card(s)*(ord(s)-1));
evo(p,s) = uniform(.1,1);
* set demand to 70 percent of total resource
demand(t) = sum((p,s), evo(p,s))*0.7/card(t);
rho = 0.1; delta(t) = power(1+rho,1-ord(t));
binary variables
b(p,s,t) segment can be extracted
e(p,s,t) last extracted segment and start
open(p,s) segments activated
integer variable
ej(p,t) period of last segment
positive variable
out(p,s,t) extraction level
pout(p,t) pit output
variables
obj total discounted net income
equations
eone(p,t) extraction sequence ends only once
etwo(p,t) extraction ending sequence
ethree(p,t) sequencing of end start
opendef(p,s,t) set open to one
openlow(p,s) set open to zero
brun(p,s,t) define staircase for B
defpout(p,t) define pit output
dem(t) total demand
outlim(p,s,t) extraction limit
outmax(p,s) total extraction limit
outall(p,s) force complete extraction except last one
defobj;
eone(p,t).. sum(s, e(p,s,t)) =e= 1;
etwo(p,t).. ej(p,t) =e= sum(s, ord(s)*e(p,s,t));
ethree(p,t-1).. ej(p,t-1) =l= ej(p,t);
brun(p,s,t).. b(p,s,t) =e= b(p,s-1,t) - e(p,s-1,t) + e(p,s,t-1) +
(ord(t)=1 and ord(s)=1);
defpout(p,t).. pout(p,t) =e= sum(s, out(p,s,t));
dem(t).. sum(p, pout(p,t)) =e= demand(t);
opendef(p,s,t).. open(p,s) =g= b(p,s,t);
openlow(p,s).. open(p,s) =l= sum(t, b(p,s,t));
outlim(p,s,t).. out(p,s,t) =l= evo(p,s)*b(p,s,t);
outall(p,s).. sum(t, out(p,s,t)) =g= evo(p,s)*open(p,s+1);
outmax(p,s).. sum(t, out(p,s,t)) =l= evo(p,s)*open(p,s);
defobj.. obj =e= sum((p,s,t), delta(t)*nev(p,s)*out(p,s,t));
model extract /all /;
if(card(s)*card(p)*card(t) > 200,
option limrow=0,limcol=0,solprint=off,optcr=0.01
else
option optcr=0; display evo,nev );
* limit single pit output to 80 percent of demand
pout.up(p,t) = 0.8*demand(t);
solve extract using mip max obj;
display ej.l,e.l,b.l,out.l,pout.l;
```