Вы находитесь на странице: 1из 6

Open Pit Mine Scheduling with Blending

Constraints
Jos Gonzales B.
SME Professional Member #4160608

1. - Abstract
An optimal treatment schedule for a Life of Mine plan is developed that honors crusher
capacity constraints and ore quality constraints, by blending ore from several stockpiles
and also allowing direct feed from the pit. In addition, a non-linear equation is applied to
model sulfur grade decay in the stockpiled ore.

2. - Introduction
A treatment schedule defines what is going to be treated, specifying tonnages and
grades from each ore stockpile and direct feed from the pit. Conversely, a mining
schedule, details tonnages and grades mined from the pit and their destinations.
Although there is available commercial software that optimizes mining and treatment
schedules for complex projects in a single process, an alternative approach to manage
them independently was required in order to apply different objectives to each schedule,
to evaluate the reclaiming policy from the stockpiles, and to keep track of the ore grade
remaining in each stockpile to apply a grade decay curve.

3. - Mathematical model
Maximize the recoverable gold in the ore sent to crusher, subject to:
Average sulfur grade must be a constant value for all periods,
Maximum crusher capacity by period,
Reclaimed ore from stockpiles must not exceed existing inventory
Direct feed must not exceed the amount mined each period
Recoverable gold is determined as the sum of recoverable gold obtained by direct feed
and recoverable gold obtained from stockpiles:
Sum(AuRi * xi) + Sum(AuRj * yj)
Where AuRi is the recoverable gold grade of the i-th ore type
xi is the tonnage mined of the i-th ore type
AuRj is the recoverable gold grade from the j-th stockpile

yj is the tonnage reclaimed from the j-th stockpile


If there are m ore types and each of them is sent to a specific stockpile, the total
number of decision variables will be 2m, since there will be m possible variables for
direct feed and m for stockpile feed. The last two constraints ensure that decision
variables do not become negative.
The problem falls into linear programming category (LP), since the objective function
and the constraints are linear. Therefore it can be solved by using the Simplex
algorithm, developed originally by Dantzig (1949), which finds an optimum solution by
searching along the edges of the feasible region. The fact that the optimum value is
attained on one vertex of that boundary is beyond the scope of this paper.
The successive application of this algorithm for each period is expressed as a loop
sentence:
1: read constraints for the period
2: solve the LP model
3: update constraints for the next period
4: repeat steps 1 to 3 until last period is solved
Note that the optimal solution from one period depends on the previous, because the
algorithm will read the previous solution to calculate the new remaining tonnages in
each stockpile and these values will be used for the next optimization.
Step 3 involves the following tasks:
-

Update tonnage on each stockpile, by adding the new tonnage mined, minus the
reclaimed ore during the period, minus the direct feed tonnage
Update recoverable gold grade on each stockpile, by adding the gold mined,
minus the reclaimed gold, minus the direct feed gold
Update sulfur grade, by adding the sulfur mined, minus the reclaimed sulfur,
minus the direct feed sulfur
Apply the sulfur grade decay, formulated as:
S(new) = S(old) * f
Where S is the sulfur grade and f is a factor less than 1 estimated by empirical
tests

Note that at the end of k periods, sulfur grade will be affected by a factor of f ^ k.

4. Case study
A treatment schedule was produced from a mine schedule consisting of two pits divided
in 9 phases, with 18 ore types defined as follow:
Au, g/t
S,%
0 - 5.0
5.0 - 7.5
>7.5

< 3.0

3.0 4.0

4.0 5.0

5.0 6.0

6.0 8.0

> 8.0

21
22
23

31
32
33

41
42
43

51
52
53

61
62
63

81
82
83

Sulfur decay factor is 0.9882 per year, and is applied after the first year.
Crusher capacity is given by:
Period 1 to 17
Period 18 to 70

Ramp up from 1,500 to 24,000 tonnes/day


24,000 tonnes/day

Sulfur grade required to the plant is 6.79%. Total number of periods in the treatment
schedule is 70, the first 41 periods represent months and the rest are years.
Blending algorithm was run on a 2.8 GHz processor and 4.0 Gb RAM, using Microsoft
Excel VBA and Solver libraries, and it took 2.8 min to solve the entire life of mine plan.
Table 1 contains the tonnage and grades by ore type from the mine schedule and
Tables 2 and 3 show direct feed and stockpile reclaimed tonnes and grades after
optimal blending, respectively.
For this case study, mining period number 13 is treatment period number 1, which
means there are twelve months of stockpiling before the plant is commissioned.
Table 4 shows the inventory at each stockpile by period, for the first 8 periods.
Stockpile Units
21
Au
S
22
Au
S
.

Period
13

Period
14

Period
15

Period
16

Period
17

Period
18

Tonnes
g/t
%
Tonnes
g/t
%

Table 1 Mine schedule by ore type for periods 13 to 20

Period
19

Period
20

Stockpile Units
21
22

Au 21
Au 22

S 21
S 22

Period
1

Period
2

Period
3

Period
4

Period
5

Period
6

Period
7

Period
8

tonnes
tonnes

g/t
g/t

%
%

Table 2 Treatment schedule by ore type for periods 1 to 8 Direct feed


Stockpile Units
21
22

Au 21
Au 22

S 21
S 22

Period
1

Period
2

Period
3

Period
4

Period
5

Period
6

Period
7

Period
8

tonnes
tonnes

g/t
g/t

%
%

Table 3 Treatment schedule by ore type for periods 1 to 8 Stockpiles reclaim


Stockpile Start
values
21
22

Au 21
Au 22

S 21
S 22

Period
1

Period
2

Period
3

Period
4

Period
5

Period
6

Period
7

Period
8

Table 4 Inventory by ore type for periods 1 to 8

5. - Conclusions
With this algorithm, a blending plan for k periods and m ore stockpiles can be performed
with the certainty of finding optimum solutions for each period. Using successive linear

programming, the complexity of the problem is reduced, from 2mk variables to 2m at a


time, without sacrificing optimality and speeding up the solution finding time.

6. Source code
Sub cummulative_stocks()
'Blending algorithm
'==================
'Inputs: Mined tonnages and grades accumulated by period by stockpile
'
Crushing rate by period
'
Target value for the grade to blend by period
'Output: Tonnages and grades by period by stockpile sent directly to process
'
Tonnages and grades by period reclaimed from each stockpile
'Technical notes:
'--------------'
- Total number of periods is adjusted in this code (future improvement)
'
- Maximum number of stockpiles is 12 (future improvement)
'
- Only 2 grades are managed: one is maximized and the other is controlled
'
- Row or column insertions in the main worksheet will cause code to fail
'Not tested with a different maximum number of periods or stockpiles
'
'(c) 2012 Jose Gonzales Borja
jose.gonzales.borja@gmail.com
'===========================================================================
Dim
Dim
Dim
Dim
Dim
Dim
Dim

i As Integer
'main period counter
j As Integer
tval As Single
rval As Single
scont As Single
'sulfur content of current period analyzed
ccap As Long
'maximum crusher capacity of current period analyzed
tstart As Date, tstop As Date

'Main loop
'=========
tstart = Time()
For i = 1 To 56
'1.- Solver Library is run in active worksheet
SolverReset
SolverOptions Iterations:=1000, Precision:=0.01, AssumeLinear:=True, AssumeNonNeg:=True
'1.1 set objective function

======> Variable cells range must be compact

SolverOk SetCell:=Cells(112, 3 + i), MaxMinVal:=1, ValueOf:="0", ByChange:=Range(Cells(2,


3 + i), Cells(25, 3 + i))
'1.2 set tonnage constraints for each stock type
'direct feed calculated <= rom for period
SolverAdd CellRef:=Cells(2, 3 + i), Relation:=1, FormulaText:=Cells(179, 3 + i)
SolverAdd CellRef:=Cells(3, 3 + i), Relation:=1, FormulaText:=Cells(180, 3 + i)
SolverAdd CellRef:=Cells(4, 3 + i), Relation:=1, FormulaText:=Cells(181, 3 + i)
SolverAdd CellRef:=Cells(5, 3 + i), Relation:=1, FormulaText:=Cells(182, 3 + i)
SolverAdd CellRef:=Cells(6, 3 + i), Relation:=1, FormulaText:=Cells(183, 3 + i)
SolverAdd CellRef:=Cells(7, 3 + i), Relation:=1, FormulaText:=Cells(184, 3 + i)
SolverAdd CellRef:=Cells(8, 3 + i), Relation:=1, FormulaText:=Cells(185, 3 + i)
SolverAdd CellRef:=Cells(9, 3 + i), Relation:=1, FormulaText:=Cells(186, 3 + i)
SolverAdd CellRef:=Cells(10, 3 + i), Relation:=1, FormulaText:=Cells(187, 3 + i)
SolverAdd CellRef:=Cells(11, 3 + i), Relation:=1, FormulaText:=Cells(188, 3 + i)
SolverAdd CellRef:=Cells(12, 3 + i), Relation:=1, FormulaText:=Cells(189, 3 + i)
SolverAdd CellRef:=Cells(13, 3 + i), Relation:=1, FormulaText:=Cells(190, 3 + i)
'from stockpile <= existing inventory

SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd
SolverAdd

CellRef:=Cells(14,
CellRef:=Cells(15,
CellRef:=Cells(16,
CellRef:=Cells(17,
CellRef:=Cells(18,
CellRef:=Cells(19,
CellRef:=Cells(20,
CellRef:=Cells(21,
CellRef:=Cells(22,
CellRef:=Cells(23,
CellRef:=Cells(24,
CellRef:=Cells(25,

3
3
3
3
3
3
3
3
3
3
3
3

+
+
+
+
+
+
+
+
+
+
+
+

i),
i),
i),
i),
i),
i),
i),
i),
i),
i),
i),
i),

Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,
Relation:=1,

FormulaText:=Cells(126,
FormulaText:=Cells(127,
FormulaText:=Cells(128,
FormulaText:=Cells(129,
FormulaText:=Cells(130,
FormulaText:=Cells(131,
FormulaText:=Cells(132,
FormulaText:=Cells(133,
FormulaText:=Cells(134,
FormulaText:=Cells(135,
FormulaText:=Cells(136,
FormulaText:=Cells(137,

2
2
2
2
2
2
2
2
2
2
2
2

+
+
+
+
+
+
+
+
+
+
+
+

i)
i)
i)
i)
i)
i)
i)
i)
i)
i)
i)
i)

'1.4 Crusher capacity constraint ===> equality constraint


SolverAdd CellRef:=Cells(111, 3 + i), Relation:=2, FormulaText:=Cells(122, 3 + i)
'1.3 Sulfur content constraint ===> equality constraint
ccap = Cells(122, 3 + i).Value
SolverAdd CellRef:=Cells(113, 3 + i), Relation:=2, FormulaText:=ccap * 0.0679
'1.5 solve
SolverSolve UserFinish:=True
'2.- Calculate inventory at end of current period: (previous - consumption + new input)
For j = 1 To 12
'2.1 tonnes
tval = Cells(125 + j, 2 + i).Value
tval = tval - Cells(13 + j, 3 + i).Value
tval = tval + Cells(178 + j, 3 + i).Value
tval = tval - Cells(1 + j, 3 + i).Value
Cells(125 + j, 3 + i).Value = Round(tval, 0)
'2.2 Gold grade
rval = Cells(125 + j, 2 + i).Value * Cells(138 + j, 2 + i).Value
rval = rval - Cells(13 + j, 3 + i).Value * Cells(68 + j, 3 + i).Value
rval = rval + Cells(178 + j, 3 + i).Value * Cells(27 + j, 3 + i).Value
rval = rval - Cells(1 + j, 3 + i).Value * Cells(27 + j, 3 + i).Value
Cells(138 + j, 3 + i).Value = safedivide(Round(rval, 0), tval)
'2.3 Sulfur grade
rval = Cells(125 + j, 2 + i).Value * Cells(151 + j, 2 + i).Value
rval = rval - Cells(13 + j, 3 + i).Value * Cells(81 + j, 3 + i).Value
rval = rval + Cells(178 + j, 3 + i).Value * Cells(40 + j, 3 + i).Value
rval = rval - Cells(1 + j, 3 + i).Value * Cells(40 + j, 3 + i).Value
Cells(151 + j, 3 + i).Value = safedivide(Round(rval, 0), tval)*sulfurdecay(i)
'2.4 Recoverable gold grade
rval = Cells(125 + j, 2 + i).Value * Cells(164 + j, 2 + i).Value
rval = rval - Cells(13 + j, 3 + i).Value * Cells(94 + j, 3 + i).Value
rval = rval + Cells(178 + j, 3 + i).Value * Cells(53 + j, 3 + i).Value
rval = rval - Cells(1 + j, 3 + i).Value * Cells(53 + j, 3 + i).Value
Cells(164 + j, 3 + i).Value = safedivide(Round(rval, 0), tval)
Next j
Next i
tstop = Time()
MsgBox "Elapsed time = " & ElapsedTime(tstart, tstop) & Chr(10) & "Successful completion!!",
vbOKOnly
End Sub

Вам также может понравиться