You are on page 1of 100

Stope mine design optimisation

using various algorithms for the


Randgold Kibali project

Master of Science Thesis

J.J.Sens

Department of Geotechnology

Stope mine design optimisation using


various algorithms for the Randgold
Kibali project
Master of Science Thesis

For the degree of Master of Science in Resource Engineering at Delft


University of Technology

J.J.Sens
November 21, 2011

Faculty of Civil Engineering and Geo Technology(CITG) Delft University of Technology

The work in this thesis was supported by Randgold Limited. Their cooperation is hereby
gratefully acknowledged.

c Resource Engineering
Copyright
All rights reserved.

Abstract

In current practice stope mines are designed using simple rules of thumb or using algorithms
that do not find the true optimisation. Therefore a combinatorial optimisation algorithm was
developed for optimising stope boundaries for sublevel stope mines.
The profitability of a stope and the feasibility of a mine depends on the infrastructure that is
needed to reach and operate the stope. An algorithm using Ant Colony Logic was developed
for designing the access and longer sections of infrastructure. A third algorithm using hill
climbing optimisation was developed for generating an optimised ore hauling system.
For this thesis, the developed algorithms were used for generating an optimised design for the
Kibali project underground sublevel stope mine. This design is then compared to the design
by Randgold. It can be seen that the mining locations in both designs match. Because the
optimisation algorithm takes the stope shapes into account a higher percentage of dilution is
found.

Master of Science Thesis

J.J.Sens

ii

J.J.Sens

Master of Science Thesis

Table of Contents

1 Introduction
1-1 Overview of the problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
1

1-2 Problem statement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


1-3 Aim of the project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2
2

1-4 Methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2 Description for the Kibali Project

2-1 Project Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-2 History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3 Geology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3-1

Regional geology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3-2

Local geology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3-3

Specific geology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3-4

Mineralogy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-4 Mining Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-5 Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-6 Decommissioning and rehabilitation

. . . . . . . . . . . . . . . . . . . . . . . .

10

2-7 Resettlement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

10

3 Sublevel Open Stoping

11

3-1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3-2 Development . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 Optimisation of Sublevel Open Stope mining

13

4-1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4-2 Algorithms developed for this project . . . . . . . . . . . . . . . . . . . . . . . .
Master of Science Thesis

11
11

13
14

J.J.Sens

iv

Table of Contents

5 Infrastructure optimisation using Ant Colony Optimisation

15

5-1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5-2 Ant Colony Optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

15
15

5-3 Infrastructure optimisation using Ant Colony Optimisation . . . . . . . . . . . .

16

5-4 Infrastructure shape manipulation . . . . . . . . . . . . . . . . . . . . . . . . . .

21

5-5 Ant Colony Optimisation variables . . . . . . . . . . . . . . . . . . . . . . . . .

23

5-6 Rockstrength estimation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

6 Ore Hauling System Optimisation (OHSO)

27

6-1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6-2 Basic layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27
27

6-3 Optimisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

6-4 Dewatering restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

6-5 Disadvantages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

7 Stope boundary optimisation

33

7-1 Existing stope optimisation techniques . . . . . . . . . . . . . . . . . . . . . . .

33

7-1-1

Floating stope algorithm . . . . . . . . . . . . . . . . . . . . . . . . . .

33

7-1-2

Multiple Pass Floating Stope Algorithm . . . . . . . . . . . . . . . . . .

34

7-1-3

Maximum Neighbourhood Value . . . . . . . . . . . . . . . . . . . . . .

34

7-2 Stope boundary optimiser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35

7-2-1
7-2-2

Block converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Stope optimiser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

35
35

7-3 Economic block value manipulation . . . . . . . . . . . . . . . . . . . . . . . . .

37

7-3-1

Scheduler and NPV optimisation . . . . . . . . . . . . . . . . . . . . . .

40

7-3-2

Visualiser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

41

8 Supporting logarithms

43

8-1 Orientation changer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

43

8-2 Surpac exporter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

8-3 Position and profit cut off . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

8-4 Basic infrastructure generation . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

9 Randgold Kibali underground mine design

47

10 Conclusions and recommendations


10-1 Conclusions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10-2 Recomendations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

53
53
53

References
J.J.Sens

55
Master of Science Thesis

Table of Contents

Glossary

57

List of Acronyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

List of Symbols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

57

Matlab scripts

59

10-3 Graphic user interfacer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

59

10-4 Drives to Surpac Exporter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

10-5 Block Model Converter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


10-6 Corner Section Creator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10-7 Straight Section Creator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

76
78
79

10-8 Stope Production Scheduler . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

80

10-9 Stope Visualiser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

Master of Science Thesis

J.J.Sens

vi

J.J.Sens

Table of Contents

Master of Science Thesis

List of Figures

2-1 Project Location . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2-2 Geology in region (Cahen, 1954) . . . . . . . . . . . . . . . . . . . . . . . . . .

2-3 Geology in region (Cahen, 1954) . . . . . . . . . . . . . . . . . . . . . . . . . .

2-4 Kibali mineralised zone location . . . . . . . . . . . . . . . . . . . . . . . . . . .


2-5 Schematic view of the Carbon in Leach (CIL) . . . . . . . . . . . . . . . . . . .

8
10

3-1 Schematic stope view . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

12

5-1 Schematic view of the Ant Colony Optimisation (ACO) process (Dreo, 2006) . .

16

5-2 Example of random routes generated by the Ant Logic Infrastructure Optimiser
(ALIO) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

18

5-3 Example of random routes generated by the ALIO avoiding the safetycone around
a shaft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5-4 Solution of the ACO process . . . . . . . . . . . . . . . . . . . . . . . . . . . .

19
21

5-5 Solution of the ACO process while avoiding the area inside the safetycone . . . .

21

5-6 Flowchart of the ALIO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .


5-7 Total infrastructure cost vs. antcycle . . . . . . . . . . . . . . . . . . . . . . . .

22
23

5-8 Total infrastructure cost vs. number of ant attempts . . . . . . . . . . . . . . .

24

6-1 Ore pass system example 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

6-2 Ore pass system example 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

28

6-3 Ore pass system example 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

6-4 example of an optimised ore hauling system . . . . . . . . . . . . . . . . . . . .

30

6-5 Flowchart of the ore hauling system optimisation . . . . . . . . . . . . . . . . .

31

6-6 Local maximum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

7-1 Example of floating stope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

Master of Science Thesis

J.J.Sens

viii

List of Figures

7-2 flowchart of the stope optimation process . . . . . . . . . . . . . . . . . . . . .

38

7-3 Schematic view of economic block value manipulation by depth . . . . . . . . . .

40

7-4 accumulated revenue and accumulated Net Present Value (NPV) . . . . . . . . .

41

7-5 Stope design view shown by the visualiser . . . . . . . . . . . . . . . . . . . . .

42

8-1 Basic infrastructure seen from above as generated by the basic infrastructure generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

45

9-1 Randgold Kibali underground mine design, topview . . . . . . . . . . . . . . . .

47

9-2 Randgold Kibali underground mine design, sideview . . . . . . . . . . . . . . . .

48

9-3 Randgold Kibali underground mine design, sideview . . . . . . . . . . . . . . . .

49

9-4 Randgold Kibali underground mine design, sideview . . . . . . . . . . . . . . . .

50

9-5 Optimisation algorithm underground mine design, topview . . . . . . . . . . . .

50

9-6 Optimisation algorithm underground mine design, sideview . . . . . . . . . . . .

51

9-7 Optimisation algorithm underground mine design, sideview . . . . . . . . . . . .

51

9-8 Optimisation algorithm underground mine design, sideview . . . . . . . . . . . .

52

J.J.Sens

Master of Science Thesis

List of Tables

2-1 Oxidation Process Testwork . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7-1 Example of a stopes table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

39

8-1 Example .str file containing the position of each corerpoint in the string (line) . .

45

8-2 Example .dtm file . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

46

Master of Science Thesis

J.J.Sens

J.J.Sens

List of Tables

Master of Science Thesis

Chapter 1
Introduction

1-1

Overview of the problem

Mining is a capital intensive business. Capital costs and start-up costs for mines can easily
exceed of several hundreds of millions of dollars. Since operating a mine is very expensive,
investing in mining can be very risky. To minimise the risks, thorough plans must be made in
advance to lower the risk of failure. Due to the high capital costs and high revenues involved
in this industry, small improvements in efficiency can save or make a significant amount of
money. One of the biggest factors influencing the efficiency of a mining project is the mine
design. In open cast mining, computer algorithms are commonly used to optimise mine
design, often with software packages such as Whittle. However, in underground mining such
optimisation packages are uncommon. Instead many underground mines are still designed
manually using standard rules of thumb. Examples of these rules are:
When using Load Haul Deliver (LHD) extraction, ore passes should be spaced at intervals not exceeding 500 feet (sic) (and waste passes should not be more than 750 feet
(sic) apart) along the footwall drift. Source: Jack de la Vergne (Robertson, 2011).
The maximum economical tramming distance for a 5 cubic yard (sic) capacity LHD is
500 feet (sic). For an 8 cubic yard (sic) LHD it is 800 feet (sic). Source: Len Kitchener
(Robertson, 2011).
The amount of pre-production stope development that is required to bring a mine into
production is equal to that required for 125 days of mining. Source: Alan OHara
(Robertson, 2011).
Although these rules of thumb are based on many years of experience in mining they are
general rules that cannot guarantee that the best possible solution to a problem is found
(Leinart, 2011).
Master of Science Thesis

J.J.Sens

Introduction

1-2

Problem statement

In underground mining, many different factors determine the efficiency and profitability of a
mine. In current practice, many features of an underground mine are designed using simple
rules of thumb which do not necessarily generate the optimal mine design. In order to achieve
higher efficiency and profitability in sublevel stope mining, optimisation algorithms need to
be developed.

1-3

Aim of the project

The aim of this project is to develop several algorithms that can help calculate and find
underground mine designs with increased efficiency and decreased capital costs. Three main
aspects of the sublevel stope mine were chosen to be optimised, which are;
1. Stope boundaries
2. Underground infrastructure
3. Ore handling system
After completing the algorithms, these algorithms were used to generate several optimisations
for the Kibali sublevel stope mine project. This was done to check the efficiency of the
algorithms and to generate several options for increasing the Kibali Projects profitability.
The Kibali project was chosen because it fits the mine profile for which the optimisation
algorithm was designed. Also because this thesis is made in cooperation with Randgold the
author was able to get detailed information about the Kibali project, so realistic values could
be used for the optimisation.

1-4

Methodology

The algorithms were developed using the Matlab software package, because Matlab can easily
work with multidimensional arrays. Generating and manipulating arrays containing blockmodel information is relatively easy using this software. The algorithms developed in this
project are based upon mathematical algorithms that have been developed in the past but
have never before been applied to these situations. To ensure that the changes made to the
original algorithms in this project increase their functionality, both the new and original algorithms were run using a blockmodel, and their results were compared. Also simple test cases
were created, so the calculations and results of the algorithms could be manually recalculated
and verified.

J.J.Sens

Master of Science Thesis

Chapter 2
Description for the Kibali Project

The Kibali Gold Project consists of the Kibali goldfields, which were acquired by Randgold
in 2009. Several opencast mines and a sublevel open stope mine are being planned for this
resource, and these plans will be discussed in this chapter. For this thesis the Kibali project
was chosen because it fits the mine profile for which the optimisation algorithm was designed,
also because this thesis is made in cooperation with Randgold the author was able to get
detailed information about the Kibali project, so proper realistic could be used for the optimisation. Also because a mine design by Randgold is available a good comparison could be
made afterwards.

2-1

Project Location

The Kibali Gold Project is located in the Moto Goldfields in the north east of the Democratic
Republic of Congo, about 560kms north east of Kisangani and 150km west of the Ugandan
border town of Arua. The Project covers a 7km by 5km area near the towns of Doko and
Durba. The district capital of Watsa lies about 9 km to the south of the project, which is
situated just north of the Kibali River on the road to Faradje and the Sudan. The coordinates
of the project are approximately 3.13 North and 29.58 East. A map of the area can be seen
in Figure 2-1 (Adams et al., 2009).

2-2

History

Gold was first discovered in the region by Hannan and OBrien in 1903, and gold production
commenced in 1906. Since then, an estimated 11 million ounces of gold have been mined,
and half of this came from alluvial deposits. This mining was conducted by the society of
gold mining in Kilo-Moto called le Socit des Mines dOr de Kilo-Moto, which the Belgian
Government established in 1926. Most of the mining in the Kibali project was done during
the 1950s. However, due to civil unrest in the area, the records of this have been lost (Adams
et al., 2009).
Master of Science Thesis

J.J.Sens

Description for the Kibali Project

Figure 2-1: Project Location

J.J.Sens

Master of Science Thesis

2-3 Geology

After the Democratic Republic of the Congo gained its independence from Belgium in 1960,
mining was only undertaken by artisanal workers (orpailleur) and small scale alluvial operations. As a result, gold production dropped sharply. In 1966, the Socits name was changed
to Offices des Mines d Or de Kilo-Moto (OKIMO), and it became the biggest gold mine
operator again (Adams et al., 2009).
Underground mining has been conducted in the area, but the biggest part sonsits of surface
mining operations. In the 1980s and 1990s, most of the records about the underground
mining operations were lost due to civil unrest (Adams et al., 2009).
In 1991, an extensive assessment of the area was made by Davy McKee on behalf of the
Government of Zaire. This included a large amount of drilling to verify the historical data
that was available for some of the deposits (Adams et al., 2009).
In 1996, Barrick Gold Corporation (BGC) acquired exploration rights over most of the area
in a joint venture with OKIMO. During this period, the soil anomaly of the Kibali project
was mapped (Adams et al., 2009).
In 1998, BGC went into a joint venture with Anglo American Corporation (AAC), after
which AAC became the main operator of the project. During this joint venture, drilling and
soil sampling were carried out in the Kibali and Pakaka concession areas, and a regional
aeromagnetic survey was also conducted. The results from these studies form the basis of the
current geological data. In 1998, AAC and BGC had to retreat from the area because of a
civil war (Adams et al., 2009).
From 2006 to 2009, MOTO ran a number of studies, including a pre-feasibility study, a
feasibility study, and an optimised feasibility. After this, the concession areas were bought
by a joint venture of Randgold and AngloGold (Adams et al., 2009).

2-3
2-3-1

Geology
Regional geology

The Northern part of the Democratic Republic belongs to the highland regions bordering the
Zaire-river basin and is entirely made up of Precambrian Rocks. The Nyanza-Kibali granite/greenstone terrane in which the Kibali project is located is comprised of metasediments and
volcanics. It extends from Northern Tanzania into the Central African Republic (Lavreau,
1984). The Congo Basin is largely made up of Mesozoic and Quaternary sediments, and it
occupies large areas in the west and centre of the country. In the eastern part of the country,
Precambrian metamorphosed sediments and Proterozoic platform sediments can be found.
The south east of the country, the Shaba Province, has Dolomites and Neoproterozoic sediments which belong to the Groupe de Katanga. Along the Western Rift and in the eastern
part of the country, numerous Tertiary to recent volcanoes are present (Straaten, 2000).
Geologically, Congo can be divided into five different regions. These regions can be seen in
Figure 2-2. The groups and formations present in these regions can be seen in Table 2-3
(Cahen, 1954). The Kibali project is situated in the North East of the Democratic Republic
of Congo which is in the Geologic Congo Oriental region.
Master of Science Thesis

J.J.Sens

Description for the Kibali Project

Figure 2-2: Geology in region (Cahen, 1954)

Figure 2-3: Geology in region (Cahen, 1954)


J.J.Sens

Master of Science Thesis

2-3 Geology

2-3-2

Local geology

The Kibali goldfield is named after the Kibali stream, which crosses a thick sequence of metamorphosed albitic schists and itabirites in the Moto Goldfields. These schist formations are
over 2000 million years old (Lavreau, 1973). The particular region of the Moto Goldfields
where the Kibali goldfield is located is a part of the Moto greenstone belt. This greenstone
is comprised of the Archean Kibalian volcano-sedimentary rocks and ironstone-chert horizons which have been metamorphosed to greenschist facies. The Moto goldfields are cut by
regional-scale faults, which trend north, east, northeast and northwest. The stratigraphy of
the Moto goldfields consists of a volcano-sedimentary sequence comprising fine-grained sedimentary rocks, several varieties of pyroclastic rocks, basaltic flow rocks, mafic-intermediate
intrusions and intermediate-felsic intrusive rocks. (Adams et al., 2009) In the Kilbali project,
gold is associated with zones of bleaching (sericite-albite-silica-alteration) with sulphide content (mainly pyrite and arsenopyrite). (Adams et al., 2009) The main gold concentrations are
associated with the greenstones and with the granitoids that intrude the greenstone. Chloritoschists, actinilitoschists, amhibolites and diorites contain gold traces up to 0.1 gram per
tonne. The granite is in general barren. Around the mylonites present in the area, gold content can rise to 0.1-1 gram per tonne. Mylonitic, cataclastic rock and quartz veins can contain
the highest concentrations of gold going up to 100 grams per tonne. However, the mineralisation of these is irregular. The gold in the schists and amhibolites has probably been leached
during intense tectonic deformation delivered by silica-rich fluids. It was re-concentrated in
low pressure zones, fissures and pores where quartz veins were formed. (Lavreau, 1973, 1984)
The majority of gold mineralisation is of a disseminated style, hosted within a sequence of
coarse volcaniclastic and sedimentary rocks. This mineralisation has a general stratigraphy
and is associated with quartz-carbonate alteration and pyrite. Quartz and quartz-carbonate
veins are present within the ore zones but are generally found to be barren with respect to
mineralisation. (Adams et al., 2009)

2-3-3

Specific geology

The lowest part of the Kibali project is a mafic volcanic sequence called the Kibali River
Basalt, which forms the footwall of the Kibali prospect. This massive and variably altered unit
is classified as pillowed tholeitic basalt flows with minor inter-bedded interflow sedimentary
horizons. The Kibali River Basalt is believed to strike to the north-east and dip moderately to
the north-west. At the Kibali project, mineralisation is spatially associated with shear zones
that contain thick sequences of felsic tuff, coarse fragmental rocks, fine grained sedimentary
rocks and chert. Gold can be found in zones with bleaching (sericite-albite-silica-alteration),
and the sulphide contents can reach up to 15%. The shear zone in which the mineralised zone
is hosted has a north-easterly strike, and it dips to the northwest at approximately 40 degrees
over a total length of approximately 1.6 km and with an average width of 300 metres. The
top of the mineralised zone occurs at a depth of 250 metres. In Figure 2-4, a map with the
location of the Kibali mineralised zone can be seen. (Adams et al., 2009)
Master of Science Thesis

J.J.Sens

Description for the Kibali Project

Figure 2-4: Kibali mineralised zone location

2-3-4

Mineralogy

In the higher grade mineralised zones, multiple types of breccias have been observed. Early
formed breccias characterised by an amorphous silica matrix are generally barren with respect
to gold. In some places, the silica matrix is accompanied by albite and ankerite-siderite
sulphides and can carry anomalous gold values. Late breccias are present which are sealed
with a matrix of secondary chlorite. These breccias can carry very high gold values, and
coarse gold can be visible in hand specimen. Because gold is a noble metal, it is very hard
for gold to bind with a molecule. All the gold in the Kibali project is therefore unbound, it
does however get locked inside other crystals.

2-4

Mining Methods

In the Kibali project, a number of different mines have been planned including several open
pit mines and one underground mine. In March 2009, a feasibility study assessed the open pit
mining potential at the Kibali Gold Project, and it was determined that there are Probable
Open Pit Mineral Resources of 30.7Mt at 3.2 g/t Au for 3.2Moz of gold.
Six separate pits have been proposed which will be mined over eight years (including the prestripping period). An extra extension of nine years could also be possible giving a total mine
life of 17 years. A conventional excavation and truck mining system has been suggested for
the open pit mines. For the first six years of the mine life a steady state material movement
of 22Mtpa will be used, and after this, the materials movement will be reduced to match the
treatment requirements, which is between 1.6Mtpa and 2,9 Mtpa.
The underground mining potential has been found to be 11.6Mt at 6.2 g/t Au for 2.3Moz of
gold, and the proposed underground mine design has a mine life of 13 including development
and lead time. A mechanised longhole open stoping method with paste fill has been chosen
for this mine design, with a steady state production of approximately 1.5Mta.
J.J.Sens

Master of Science Thesis

2-5 Processing

2-5

Processing

Several tests have been performed on core samples to test the mineralogy and determine
the processing efficiency. In the oxide master composite, the grade was found to be 2.90
g/t, in the master oxide composite the grade was found to be 4.02 g/t, and in the master
underground composite the grade was 8.84 g/t. Small amounts of silver were found, but it
was not considered to be economical to extract such small proportions. Small amounts of
mercury were also found, and because of this, appropriate ventilation in the underground mine
is needed. Antimony levels were found to be low and will not influence the process. Arsenic
levels were found to be moderate and could contribute to low leach recoveries. Telluride levels
are low and will probably not influence the leach process.
Testing was done on the primary concentrates to determine the effect of oxidation on the
process, and the results of this can be seen in Table 2-1.
Table 2-1: Oxidation Process Testwork

Process
Pressure Oxidation
Roasting
Biological Oxidation
Partial Oxidation
Partial Oxidation
Partial Oxidation
Partial Oxidation
Partial Oxidation

Oxidation

0%
14%
39%
55%
84%

Recovery
96%
95%
aborted due to lab problems
82%
84%
90%
90%
98%

For retrieving the gold cyanide will be used to dissolve the gold.
Testing on underground samples resulted in extractions ranging from 71% to 81% with an
average of 76% when the oxide process was followed. When following the primary process
route extraction ranges from 85% to 95% with an average of 90%.
Processing will be done using the Carbon in Leach (CIL) process. The CIL process is a
continuous process that is used for winning precious metals from fine ground ore. This is
achieved through simultaneous dissolution and adsorption of the precious metals onto fine
carbon in an agitated tank of ore solids slurry. During this process, activated carbon is
moved from one tank to the other in counter current with the ore slurry, after which the
loaded carbon is extracted in the first tank. The CIL process uses granulated activated
carbon that is mixed with the slurry consisting of ore and water. After the carbon has been
loaded with aurocyanide iron, the carbon is pumped out of the absorption circuit and sent to
the elution process. A schematic view can be seen in Figure 2-5.
Master of Science Thesis

J.J.Sens

10

Description for the Kibali Project

Figure 2-5: Schematic view of the CIL

2-6

Decommissioning and rehabilitation

The Equator Principles and good international practice dictate that the operator must take
provisions for closure of the mine and rehabilitation of the area. The costs that will be needed
for the decommissioning will be part of the overall project costs. The final closure costs will
be estimated as part of the Equator Principles report. Because of extensive undocumented
mining in the past, it is difficult to assess the original state of the area (Adams et al., 2009).

2-7

Resettlement

For the project, it will be necessary to relocate over 10,000 inhabitants currently living in
the immediate project area. Negotiations with the local communities have commenced and
a strategy has been put in place for these relocations. As most of the resettlement is only
needed for the surface mining operations, it will not be included in the cost estimation for
the underground mine (Adams et al., 2009).

J.J.Sens

Master of Science Thesis

Chapter 3
Sublevel Open Stoping

3-1

Introduction

Sublevel open stope mining is also known as sublevel stoping, longhole stoping or blast hole
stoping. It is an underground mining method that is classified as a self-supported mining
method. As a high-production bulk mining method, it can be used in large steep dipping or
regular shaped ore bodies. The ore body needs to have competent rock that does not require
extensive support. The main reason for selecting sublevel stoping over block caving is to
minimise dilution of the product.
Sublevel stoping is a method that requires a lot of pre-development, but this is partly offset
by the fact that most of the development is located inside the orebody. Therefore, it can
generate an ore feed and revenue. For extracting the ore, large open areas are created which
are called the stopes. These stopes are not meant to be accessed by the miners, which means
that all drilling and blasting has to be done from the sublevels that are located at regular
intervals.

3-2

Development

When developing a stope, a funnel is first created at the bottom of the stope by blasting an
access point from which a Load Haul Deliver (LHD) truck can collect ore. Sublevels are then
driven through the location of the stope, and towards the back of the stope a vertical slot is
driven, which is usually accomplished with a raise bore. This vertical slot is installed to ensure
the material from the first slice does not get jammed. After constructing the vertical slot,
boreholes are drilled and loaded with explosive in a fan shaped ring at the lowest sublevel.
After blasting, this first slab of ore falls down into the funnel, and it is collected and moved.
Then, drilling and blasting takes place at the next highest sublevel, and so on and so forth
until this has been done at all sublevels. After this, drilling and blasting starts all over
again from the lowest sublevel up until the whole stope has been produced. After the stopes
Master of Science Thesis

J.J.Sens

12

Sublevel Open Stoping

have been completely produced, it is possible to backfill the stope. However, if this is not
desired pillars need to be kept in place to prevent the stopes from collapsing. In Figure 3-1 a
schematic view of a stope in production can be seen. In this figure the outside of the section
of the stope which has not yet been produced can be seen. The stope has two sublevels and
one production level. The infrastructure of the sublevels can be seen in the middle of the
stope, and the blast holes can also be seen. At the bottom, the production chute and the
Haul drive can be seen.

Figure 3-1: Schematic stope view

Stopes in sublevel stoping mines generally have dimensions of 25x25x90 metres. Haulage
levels are between 25 to 120 meters apart, and sublevels are 10 to 55 meters apart. The
vertical distance between the sublevels is generally dictated by the equipment used. The
longest distance the borehole rigs need to be able to drill is from the sublevel to the edge of
the stope at the centre between the sublevels. In Figure 3-1, the boreholes that are drilled
can be seen, and the ones which have a 45 degree angle from the main axes are the longest
boreholes that need to be drilled.
After blasting has occurred, the material is gathered at the bottom of the chute and transported to its destination. This can be done in several different ways. The most common way
is to have an LHD load the material and haul it to a drop off point. From here, the material
will be transported using gravity through ore passes. At collection points, the material will
be loaded on conveyor belts or trains and transported to the surface or to the shaft. This
method is the most flexible and requires the least development. Another way of gathering
and transporting material is by only using conveyor belts. This is a highly mechanised way
of handling the material, but due to the high forces at the bottom of the chute, failure of the
equipment is very likely. Handling can also be completely gravity driven. In this method, ore
passes are developed directly to the bottom of the chute. After a ring is blasted, the material
will flow down through these ore passes. This way, no energy is needed for transporting the
ore from the stopes. However, very extensive development has to be created before production
can commence. Also, the blasting of the rings has to be done very carefully because large
pieces of rock can jam the ore passes. Clearing obstructions from ore passes is very expensive
and dangerous, and it needs to be avoided as much as possible. (Hartman, 1992)
J.J.Sens

Master of Science Thesis

Chapter 4
Optimisation of Sublevel Open Stope
mining

4-1

Introduction

Due to diminishing metals and minerals reserves while the market for these products constantly grows, it is increasingly important to design more cost effective mines. One way
of increasing the cost efficiency of a mine is to economically optimise the mine design. In
this thesis, for the Sublevel Open Stope mining method, algorithms have been developed to
optimise three aspects of the Sublevel Open Stope process, which are;
Infrastructure (Chapter 5)
Ore handling system (Chapter 6)
Stope locations and stope boundaries (Chapter 7)
The most important optimisation aspect is the optimisation of the stope locations and stope
boundaries. In current practice, stopes are often designed following a set pattern and dimensions and boundaries are decided using basic rules of thumb. Also, in many cases stopes
are placed based upon locations with a minimum cut-off rate .However, this practice does
not neccesarily produce optimal profit or best Net Present Value (NPV). As a result, the
maximum possible revenue is not achieved. It is also possible that orebodies might not be
found profitable because of this.
In order to produce the optimal stope mine design algorithms can be used which calculate
the ideal stope locations and boundaries based on economic boundary conditions. Existing
stope optimisation algorithms are:
1. Floating stope algorithm (Alfords et al.,2007, Alfords, 1995).
2. Multiple pass floating stope process (Cawrse, 2001).
3. Maximum neighbourhood values (Ataee-Pour, 2004).
Master of Science Thesis

J.J.Sens

14

4-2

Optimisation of Sublevel Open Stope mining

Algorithms developed for this project

For this project, an optimisation algorithm was developed which uses a combinatorial optimisation algorithm. The algorithm optimises the stope layout based on economic constraints
which increase the profitability of the mine. A large part of the pre-development cost goes
into the infrastructure, especially the mine access. Therefore optimisation of the infrastructure is important. Several methods for optimising the access have been developed, like the
UNO (underground network optimiser) and DOT (decline optimisation tool). (Brazil et al.,
2007) However, in this thesis, an algorithm was developed using an Ant Colony Optimisation (ACO). The advantage of using Ant Colony Logic is that it can give fast results for
complex problems. The last aspect of the sublevel stope mine for which in this thesis developed an optimisation algorithm is the Ore Handling System. Several optimisations and
models exist for the operation of the Ore Handling System, but little research has been done
on minimising its total length and construction costs. The algorithm developed in this thesis
uses a so-called hill climbing algorithm for finding the optimum system layout. By using and
combining these three algorithms a large part of the Sublevel Stope Mine can be designed
and optimised. In chapter 6 an optimisation using the algorithms can be seen.

J.J.Sens

Master of Science Thesis

Chapter 5
Infrastructure optimisation using Ant
Colony Optimisation

5-1

Introduction

Ant Colony Optimisation (ACO) is a Metaheuristic approach used to solve combinatorial


problems. It was first developed by Marco Dorigo in his 1992 PhD thesis. His algorithms
were aimed at finding the optimal paths in graphs. The ACO is well known for being able to
quickly solve various non-deterministic polynomial-time hard, np-hard problems. Essentially,
the algorithm imitates the process that ant colonies in nature use to find the most efficient
route from a food source to the colony. In this thesis, ACO is used for finding the most
cost effective route between two locations underground. This algorithm will be referred to as
the Ant Logic Infrastructure Optimiser (ALIO) (Dorigo and Stutzle, 2004). For this thesis,
an algorithm was developed for generating and optimising the underground infrastructure.
This algorithm uses the Ant Colony Logic principles to generate the most cost efficient route,
taking infrastructure shape and rock strength properties into account.

5-2

Ant Colony Optimisation

Ant colonies are capable of finding the most efficient route between a food source and the
colony by using very simple structures. At first, an ant will wander around randomly until
it spots a food source. During its search, it will lay down a pheromone trail, and when a
food source is found, the ant will trace its way back along the pheromone trail to the colony.
Once there, it will communicate to the other ants that it has found a food source and other
ants will then follow its pheromone trail to find the food source. The shorter the path to
the food source, the more often an ant can walk the route in a certain time span. As the
pheromones evaporate over time, a shorter path will generally have a stronger pheromone trail.
Ants are more likely to follow a strong pheromone trail, which means that trails with strong
pheromone appeal more to the ants back in the colony. When following a pheromone trail,
Master of Science Thesis

J.J.Sens

16

Infrastructure optimisation using Ant Colony Optimisation

ants will amplify it by adding more pheromones themselves, making the trail more appealing
to other ants. At any given moment, an ant can choose not to follow the pheromone trail,
and this is more likely to occur when the pheromone trail is weaker. As ants are capable of
diverting from the trail, a shorter trail or shortcut could be found by chance.
When a shorter route is discovered, the ant will be able to travel from the food source to
the colony more often, and this means that the pheromones in the trail get amplified more
often. As the trail increases in strength, other ants will also start using this new route or
shortcut, and this will further amplify the pheromones in the trail. Over time, the old route
will fade away due to disuse and the new route or shortcut will take over as the main route.
A schematic view of the ACO can be seen in Figure 5-1. At 1, a single ant has found a food
source using a long path; in 2, ants can be seen following both the original route and the
alternative routes; in 3, the strength of the shortest route has increased significantly compared
to the longer routes, and the majority of the ants are using this shorter route. The ACO is
only used during the designing and optimising phase as a method for quickly generating a
design between two locations.

Figure 5-1: Schematic view of the ACO process (Dreo, 2006)

5-3

Infrastructure optimisation using Ant Colony Optimisation

As previously mentioned, Ant Colony logic has proven to be very efficient in solving certain
NP-hard problems, such as the travelling salesman problem (Angus, 2007). An NP-hard
problem is informally described as being "at least as hard as the hardest problems in NP".
(Garey, 1979) A problem H is NP-hard only if there is an NP-complete problem L that is
polynomial time Turing-reducible to H (i.e., L <TH) (Garey, 1979).
When using ACO for optimising infrastructure or finding the shortest feasible route between
two points, one point has to be assigned the role of food source, the other point is assigned
the role of the colony. In nature, obstacles like water, trees or rocks limit the amount of
possible routes from the food source to the colony. In an underground mine, the amount of
possible routes between two points are limited by, for example, the shaft or stopes. Around
J.J.Sens

Master of Science Thesis

5-3 Infrastructure optimisation using Ant Colony Optimisation

17

every shaft, a virtual safety cone is placed in which development and production should not
take place. This safety cone is put in place because fractures and geological stress caused by
the development and production could damage the shaft. The ALIO designs the cone with
the shaft as its middlepoint, and the top of the cone touches the surface. The angle of the
cone can be set by the user.
The second constraint is that the possible routes have to be suitable to be driven on by the
equipment being used. This means that these routes need to have a maximum gradient and
a minimum radius in the bends. If the gradient is designed to be too high, equipment might
not make it uphill when fully loaded. If the radius in the bends is too small, the equipment
might get stuck. Therefore, the first stage of the ALIO is to create a set of possible routes
between both points. These routes are put in place by randomly generating routes between
the points that have to be connected. These random routes do not exceed the constraints
which have been set by the user, which are the maximum gradient and the minimum radius
in the corners.
After creating a random route, which is described in the next paragraph, checking is undertaken to determine if the route passes through areas that are not permissible. If this is the
case, the route is discarded and the random route generation is repeated. The amount of
random routes that are generated in this step has a big influence on the overall efficiency of
the ALIO. When too few random routes are generated, the amount of choices available for
the ALIO are limited. In general, the more random routes are generated the better the result.
However, the more random routes that have to be created, the more time the algorithm will
take. The amount of random routes that are created by the algorithm can be set with the
variable norandroutes.
When creating the random routes, the first step is to decide if a left-hand corner section, a
right-hand corner section or a straight section will be created, which is done randomly. The
chance of this happening can be influenced by changing the variable cornerchance. This
variable has to have a value between zero and one.
In Figure 5-2, an example can be seen in which the algorithm has created a set of random
routes shown in blue. The distances can be seen on the axes.
In Figure 5-3, an example can be seen in which the random routes are avoiding the area inside
the safety-cone that has been placed around the location of a shaft. The outline of this cone
which is drawn at several intervals, is shown in green. The distances are shown on the axes.
After a number of random routes (set by the user) have been found, the ALIO passes on to the
next stage. In this stage the algorithm checks where the random routes connect and so-called
nodes are put in place. For a route to connect, it is important that both route directions are
the same. This is to make sure that in the final optimisation step no 90 degree corners can
be created.
The final step of the ALIO is the actual ant colony optimisation. In this step, a number
of digital ants will start following the random routes, leaving behind a certain amount of
pheromone. In the model, this will be simulated by increasing the Pheromone Value (PhV)
of the chosen route. The total number of ants can be set by the user. In general, more ants
result in a better optimisation. The total amount of ants that are run can be set by changing
the variable Noants. When encountering a node, the ant will make a choice regarding which
of the possible routes it will use. The likelihood of choosing a certain direction depends on
Master of Science Thesis

J.J.Sens

18

Infrastructure optimisation using Ant Colony Optimisation

Figure 5-2: Example of random routes generated by the ALIO

the PhV of the route. As the PhV on each route is different, some routes are more likely to
be chosen by the ant. While travelling towards the destination, the total length or costs of
the used infrastructure are calculated. This is then compared to the direct distance between
the starting point and the destination. Based on this, the PhV of the route taken by the ant
is increased by a certain amount. A shorter route will result in a higher increase of the PhV.
Over time, the PhV of the shortest or cheapest route will have increased the most. This will
then be chosen as the optimal route by the ALIO.
The rate in which the PhV increases can be influenced by changing the variable pheromoneadd.
The rate by which the PhV decreases over time, mimicking the evaporation of pheromones in
nature, can be influenced by changing the pheromoneavap value. In general these variables
should be somewhere in between 0.80 and 0.95.
The formula for calculating the amount of pheromones that have to be added, in case the
infrastructure is optimised based on minimum length, can be seen in Eq. (5-1). This formula
was developed for this thesis but based on the principles found in (Dorigo and Stutzle, 2004).
In the formula the table containing the pheromone values for each section of infrastructure is
updated using the distance between the start point and the destination and the total length
of the infrastructure.


[phertbl(n + 1)] = [phertbl(n)] +

startdestdist
routedist

pheradd [antloc]

(5-1)

Phertb: this matrix contains the PhV for each section of random route
Startdestdist: this is the direct distance between the starting point and the destination
point. This is calculated using the abc-formula.
Routedist: this is the total distance of the route travelled by the ant before reaching the
destination point.
J.J.Sens

Master of Science Thesis

5-3 Infrastructure optimisation using Ant Colony Optimisation

19

Figure 5-3: Example of random routes generated by the ALIO avoiding the safetycone around a
shaft

Pheradd: this is a variable that can be changed by the user to determine how strongly
the amount of pheromones change.
Antloc: this is a matrix that contains the information about which sections have been
travelled by the ant.
The increase of the PhV for each step n is calculated by taking the ratio between the Startdestdist and the Routedist times the Pheradd which is a value without dimension. This value
is then multiplied by the Antloc matrix, which only changes the values on the path which
the last ant travelled. This value is then added to the Phertb for step n. This results in the
matrix which is used in the next step n +1.
It is also possible to use an exponential function for calculating the amount of pheromone to
be added. This has the advantage that shorter routes get an exponential higher amount of
pheromone added to their trail, making it more likely for the other ants to start following this
trail too. The formula that is used in this case can be seen in Eq. (5-2). In the formula the
table containing the pheromone values for each section of infrastructure is updated using the
distance between the start point and the destination, and the total cost of the infrastructure.


[phertbl(n + 1)] = [phertbl(n)] +

startdestdist
routedist

power

pheradd [antloc]

(5-2)

Phertbl: this matrix contains the PhV for each section of random route.
Startdestdist: this is the direct distance between the starting point and the destination
point. This is calculated using the abc-formula.
Routedist: this is the total distance of the route travelled by the ant before reaching the
destination point.
Master of Science Thesis

J.J.Sens

20

Infrastructure optimisation using Ant Colony Optimisation

Pheradd: this is a variable that can be changed by the user to determine how strongly
the amount of pheromones change.
Antloc: this is a matrix that contains the information about which sections have been
travelled by the ant.
Power: this is a variable that can be set by the user to increase the effect of shorter
routes, and this should have a value which is larger than one.
The increase of the PhV for each step n is calculated by taking the ratio between the Startdestdist and the Routedist to the power Power times the Pheradd which are values without
dimension. This value is then multiplied by the Antloc matrix, which only changes the values
on the path which the last ant travelled. This value is then added to the Phertb for step n
which results in the matrix that is used in the next step, n +1.
In case it is chosen to optimise the infrastructure based on the total cost the slightly different
formula Eq. (5-3) is used. In the formula the table containing the pheromone values for
each section of infrastructure is updated using the distance between the start point and the
destination and the total cost of the infrastructure.


[phertbl(n + 1)] = [phertbl(n)] +

startdestcost
routecost

pheradd [antloc]

(5-3)

Phertbl: this matrix contains the PhV for each section of random route.
Startdestcost: this is a cost factor which is calculated based on the direct distance
between the starting point and the destination point, this distance is calculated using
the abc-formula.
Routecost: this is the total cost of the route travelled by the ant before reaching the
destination point.
Pheradd: this is a variable that can be changed by the user to determine how strongly
the amount of pheromones change.
Antloc: this is a matrix that contains the information about which sections have been
travelled by the ant.
The increase of the PhV for each step n is calculated by taking the ratio between the Startdestcost and the Routecost times the Pheradd which is a value without dimension. This value
is then multiplied by the Antloc matrix,which only changes the values on the path which the
last ant travelled. This value is then added to the Phertb for step n, which results in the
matrix that is used in the next step, n +1.
The total cost to generate the route chosen by the ant is calculated by adding up the costs for
each section. The costs of each section are calculated by multiplying the sections distance by
its cost per metre. The costs per metre infrastructure can depend on its depth, or the rock
strength at this location. When calculating the cost per meter infrastructure the local rock
strength is taken into account. The process of this calculation can be seen in section 5-6. In
J.J.Sens

Master of Science Thesis

5-4 Infrastructure shape manipulation

21

these cases, extra costs per metere are added. In Figure 5-4, an example of the result of one
of these optimisations can be seen. In Figure 5-5, an example of an optimisation can be seen
in which a decline is designed avoiding the safety cone around a shaft. The route generated
by the ALIO is shown in red and the safetycone can is shown in green.

Figure 5-4: Solution of the ACO process

Figure 5-5: Solution of the ACO process while avoiding the area inside the safetycone

In Figure 5-6 a flowchart can be seen describing the steps the ALIO takes when optimising
the infrastructure.

5-4

Infrastructure shape manipulation

When using the algorithm for decline optimisation, several extra constraints can be set and
the algorithm can be influenced to produce a certain style of output. As it is undesirable
to have a spiral as a decline, the maximum number of 90 degree corners can be set to two.
Doing this means that the optimisation algorithm can only produce switchbacks. For the
Master of Science Thesis

J.J.Sens

22

Infrastructure optimisation using Ant Colony Optimisation

Figure 5-6: Flowchart of the ALIO

J.J.Sens

Master of Science Thesis

5-5 Ant Colony Optimisation variables

23

straight sections, a minimum and maximum length can be set, allowing the number of corners
appearing in the final design to be controlled. Setting the minimum length of the straight
sections at a high value will produce a design containing long straight sections which will
cover most of the vertical distance. Another tool for influencing the final design is a penalty
value that can be set for straight sections or corners. This penalty value increases the costs
the optimising algorithm uses in its optimisation. However it is not taken into account when
the real costs are calculated. The use of this penalty value will increase the costs for the type
of infrastructure used in the optimisation algorithm. Therefore choosing the other type of
section more often would result in a lower total cost and therefore be more favourable. Using
this penalty value can therefore increase or decrease the ratio of straight sections or corner
sections.

5-5

Ant Colony Optimisation variables

When using an ACO algorithm, it is important to correctly choose both the pheromone evaporation variable and the pheromone adding variable. An example of a reasonably successful
optimisation can be seen in Figure 5-7. In this graph, the Y-axis shows the cost of the route
tested by the ALIO, and the X-axis shows the number of attempts. It can be seen that it takes
the ALIO a reasonably long time for any route to become the main route. The final result
appears to be the best result possible. This means that this attempt has found the best route
connecting the two underground locations (used in the optimisation) with infrastructure that
complies with the set boundaries.

Figure 5-7: Total infrastructure cost vs. antcycle

When the evaporation rate is too high, the PhV might decrease faster than it can be increased
Master of Science Thesis

J.J.Sens

24

Infrastructure optimisation using Ant Colony Optimisation

by the virtual ants. Due to this, the PhV will become zero for all sections and the optimisation
will not work. The route found in the last run will be used as the final result, which in this case
is a random result. When the evaporation rate is too low, however, early routes will increase
their PhV too quickly, making it impossible for shorter or cheaper routes to take over. A plot
showing such a case can be seen in Figure 5-8. After 50 ant cycles a non-optimal route takes
the upper hand and no further optimisation happens, which means the optimal result is not
found.

Figure 5-8: Total infrastructure cost vs. number of ant attempts

5-6

Rockstrength estimation

When designing underground infrastructure, the rock mechanics are important. For example,
it is undesirable to build a tunnel in weak rock, meaning that these areas should be avoided.
Also, the rock conditions influence the cost of the infrastructure. When developing infrastructure in weaker rock conditions, rock bolting is necessary, increasing the overall cost. In
this chapter, several methods are described for estimating the amount of support needed.
When available in the blockmodel, the tunnelling quality index Q and the Evacuation Support
Rate ESR can be used for estimating the amount of support that may be needed. The
tunnelling quality index can be determined by using equation 5-4.


Q=

RQD
Jn

Jr
Ja

Jw
SRF

(5-4)

where
J.J.Sens

Master of Science Thesis

5-6 Rockstrength estimation

25

Q is the tunnelling quality index.


RDQ is the Rock Quality Designation.
Jn is the joint set number.
Jr is the joint roughness number.
Ja is the joint alteration number.
Jw is the joint water deduction factor.
SRF is the stress reduction factor.
The ESR depends on the function of the underground infrastructure, and for mining infrastructure an ESR of 1.6 is generally chosen.(Hoek, 1995) Eq. (5-5) can be used for estimating
the maximum unsupported span which the infrastructure is allowed to have (Choi, 2006).
maxunsupportedspan = 2 ESR Q0.4

(5-5)

The span used is set by the user. It is possible to slightly change the formula to estimate how
much support is needed in a certain section using Eq. (5-6). If the right side is larger than
the left side in this equation, the section of infrastructure needs support (Choi, 2006).
width < 2 ESR Q0.4

(5-6)

For estimating the length of the rockbolts, Eq. (5-7) can be used. In this formula, B is the
width of the infrastructure. With the rockbolt length, a more detailed estimation of the costs
can be made (Choi, 2006).


L=2

Master of Science Thesis

0.15 B
ESR

(5-7)

J.J.Sens

26

J.J.Sens

Infrastructure optimisation using Ant Colony Optimisation

Master of Science Thesis

Chapter 6
Ore Hauling System
Optimisation (OHSO)

6-1

Introduction

The ore hauling system is one of the most expensive parts of the mine In sublevel stope
mines, the biggest part of the hauling system, such as the shaft, the bunker , the breaker,
and the ore passes to the section of the mine that will be first in production, has to be put in
place before mining can commence. Due to the high costs involved in the development of the
ore hauling system small improvements in the design can generate huge cost reductions. For
optimising the ore handling system, an optimisation method using the so-called hill climbing
method is used. The hill climbing technique is an iterative algortihm belonging to the family
of local search. The algorithm starts by taking an arbitrary solution, which in this case is an
ore handling system layout that contains only 90 degree corners. Small changes are made to
single elements of the solution, and if a better solution is found, small changes are then made
to this new solution. The process is repeated until a better solution cannot be found anymore.
In the OHSO, small random changes are made to the nodes in the ore handling system, and
then calculations are made to determine if these changes generate a cheaper option. The total
costs of the ore handling system are calculated by adding the estimated costs of the shaft,
ore passes and conveyor belts. During the optimisation process, it is made sure that certain
constraints are not breached. These constraints are the minimum grade of the ore passes and
the maximum grade of the conveyor system.

6-2

Basic layout

Before starting the optimisation the program asks the user to define the locations where the
dump point accesses have to be placed. It will then look for the closest grid point, to start
from, which is done to speed up the optimisation process. This closest grid point will never
be further away than half one grid size, and the grid size is set by the user. From this point,
Master of Science Thesis

J.J.Sens

28

OHSO

the OHSO looks at the haul and sublevels above this point. If all the sublevels are designed
along the same east-west coordinates a simple vertical pass is designed connecting the levels.
This can be seen in Figure 6-1. If one or more levels are located to the east of the drop point
location set by the user, horizontal drives are designed to connect the levels to the ore pass,
which can be seen in Figure 6-2. If one or more levels are located to the west of the drop
location set by the user the whole ore pass will be designed n grid sizes further to the west and
drives are designed connecting the other levels to the ore pass, this can be seen in Figure 6-3

Figure 6-1: Ore pass system example 1

In Figure 6-1, the stopes are shown in blue, the drives to the stopes are shown in green, the
basic infrastructure is shown in red and the ore passes are shown in black. In this case, all
of the haul and sublevels are situated directly above each other so no extra development is
needed to connect to the drop of locations.

Figure 6-2: Ore pass system example 2

In Figure 6-2, the stopes are shown in blue, the drives to the stopes are shown in green, the
basic infrastructure is shown in red, the ore passes are shown in black and the development
connecting the drives to the drop of points are shown in orange. In this case, the top two
haul and sublevels are situated to the right therefore extra development is needed to connect
J.J.Sens

Master of Science Thesis

6-3 Optimisation

29

the top two drives to the drop of locations.

Figure 6-3: Ore pass system example 3

In Figure 6-3 the stopes are shown in blue, the drives to the stopes are shown in green, the
basic infrastructure is shown in red, the ore passes are shown in black and the development
connecting the drives to the drop of points are shown in orange. In this case the top two haul
and sublevels are situated to the left therefore extra development is needed to connect the
bottom two drives to the drop of locations. In order to make this possible the algorithm has
to place the ore pass one gridsize to the left from the location selected by the user
The algorithm starts by first creating a very simple rudimentary non-optimised ore handling
system, where ore passes are designed perfectly vertical to a set depth a variable number of
metres under the lowest haulage level. The lowest points of the ore passes are then connected
by horizontal conveyor belts. The shaft is designed to the depth of the conveyor belts using
the Northing and Easting set by the user. The order in which the passes are connected is
determined by the distance between the ore pass and the shaft. The shaft will be connected
to the node closest to the shaft or it will create an extra node intercepting a conveyor belt
tunnel.
The three different cases are differentiated for the ore handling system, so that it is capable
of designing the appropiate connections between sublevels in each situation.

6-3

Optimisation

The rudimentary ore hauling system will be optimised using the so-called hill climbing technique. This is done by slightly changing the location of each node in a random direction.
After a node has been slightly moved, the total cost of the ore handling system is calculated,
and the calculated cost is compared with the cost of the old design. In the case where the
new design is cheaper than the old design, the old design is discarded. Then the next node in
the ore hauling system will be slightly moved. Depending on the kind of node the movement
can be restricted to a certain direction. For example, the node connected to the bottom of
the shaft can only be moved upwards or downwards. Also for the ore passes and the conveyor
belt tunnels, certain constraints can be set, like the maximum grade for the conveyor system,
Master of Science Thesis

J.J.Sens

30

OHSO

and the minimum grade for the ore passes. Depending of the type of infrastructure, the costs
per metre development can be defined. In general the shaft will be the most expensive development per metre. Therefore, the algorithm will generally try to make the shaft as shallow
as possible. The nodes in the system will be moved until a better result can no longer be
found or until the maximum number of optimisations set by the user has been reached. In
Figure 6-4, an example of an optimised ore hauling system can be seen. In this figure, the
ore hauling system can be seen in green, and the drives connecting the stopes can be seen in
blue, the drives connecting the stopes to the drop-of points can be seen in red. In Figure 6-5,
the flowchart describing the process can be seen.

Figure 6-4: example of an optimised ore hauling system

6-4

Dewatering restrictions

Due to the ground water that will flow into the mine, pumps have to be installed to pump this
back out of the mine. These pumps are normally located at the bottom of the shaft, meaning
that all the water needs to be able to flow to this lowest point. Therefore the infrastructure
containing the conveyor belts need to be constructed downwards towards the bottom of the
shaft. The OHSO will generate a solution conforming to this constraint. It is possible to
have the OHSO ignore the flow of water during optimisation, which can result in a shorter
and cheaper ore handling system. However, due to the higher risk of flooding, this option is
normally discarded.

6-5

Disadvantages

The main disadvantage of using hill climbing optimisations is that they can produce nonoptimal results because of local maximums. In Figure 6-6, a figure can be seen which has
a true maximum and a local maximum. In case the starting location of the optimisation is
J.J.Sens

Master of Science Thesis

6-5 Disadvantages

31

Figure 6-5: Flowchart of the ore hauling system optimisation

Master of Science Thesis

J.J.Sens

32

OHSO

in the bottom left corner in Figure 6-6 and the optimisation works in a straight line to the
true maximum. When using a hill climb optimisation, the optimisation algorithm could end
up at the local maximum and not the global maximum which is the true optimum. This
results from the fact that, in this example, the hill climbing optimisation always tries to
find a neighbouring location which is higher than the current location. When at the local
maximum, all neighbouring locations are located lower, which means that the location is
unable to change anymore. Therefore, in hill climbing optimisations it is important to choose
the starting location carefully. In this case, it is the rudimentary ore hauling system design
from which the optimisation will start. If this rudimentary design is set up wrongly, the
optimum design might not be found.

Figure 6-6: Local maximum

J.J.Sens

Master of Science Thesis

Chapter 7
Stope boundary optimisation

7-1

Existing stope optimisation techniques

Several techniques have been developed to optimise the stope boundaries. However all of
these have certain shortcomings limiting their use and reliability (Topal and Sens, 2010). In
the following sections several of these existing stope optimisation techniques will be discussed,
which are;
Floating Stope Algorithm.
Multiple Pass Floating Stope Algorithm (MPFSA)
Maximum Neighbourhood Value (MNV)

7-1-1

Floating stope algorithm

Datamine has a built-in stope optimisation algorithm called the floating stope algorithm (Alford et al., 2007). It is described as being a stope optimisation algorithm. However, it does
not produce any stopes or stope boundaries. The floating stope algorithm floats a stope, the
size of which has been set, through the orebody/blockmodel. It then calculates the average
ore content in the stope, and using the cut-off grade, decides if the stope passes or fails. The
coordinates are then saved. After the stopes have been floated through the whole ore body,
an envelope is created spanning the area in which passing stopes are located. This envelope
gives the border in which the mine planner can plan the stopes. This method has two main
shortcomings as a stope optimisation tool, which are:
1. The algorithm does not produce any stope layout. It only indicates the area in which
stopes could be placed containing a grade higher than the cut off grade.
Master of Science Thesis

J.J.Sens

34

Stope boundary optimisation

2. The algorithm does not take overlapping stopes into account. This meas that the area in
which stopes with a high enough grade can be placed is smaller than the area indicated
by the envelope. A simple example can be seen in Figure 7-1, where the green border is
the created envelope, the red border indicates the stope which is 2 by 2 blocks, and the
blue borders are the blockmodel blocks. As can be seen in the figure, only one stope
fits in the envelope, meaning that the minable area using this stope size is smaller than
the area indicated by the envelope.

Figure 7-1: Example of floating stope

7-1-2

Multiple Pass Floating Stope Algorithm

The MPFSA was developed to help overcome some of the shortcomings of the floating stope
algorithm. This algorithm is based on the same principles as the floating stope algorithm.
However, it also delineates economic ore zones using multiple sets of input parameters, like
the head grade and the cut of grade. The algorithm generates several different envelopes
based on the input parameters, which can be used for selecting and designing stopes. Like
the floating stope algorithm, the MPFSA does not design the stopes itself (Cawrse, 2001).

7-1-3

Maximum Neighbourhood Value

(Ataee-Pour, 2004) introduced a heuristic approach called the MNV, which is fairly similar
to the floating stope algorithm. However in the MNV algorithm, a block value is introduced.
The block value is the economic value of each block calculated using the commodity grade and
the commodity price. A stope is placed in one corner of the blockmodel, and the economic
value of the stope is calculated. If the economic value of the stope is positive, the stope is
maintained and the blocks used by the stope are tagged so that they are not used again. If
the economic value of the stope is negative, the stope is discarded. Then the procedure is
repeated one set of blocks to the right. This way, the whole blockmodel is systematically
evaluated (Ataee-Pour, 2004). This algorithm has two main disadvantages, which are:
J.J.Sens

Master of Science Thesis

7-2 Stope boundary optimiser

35

1. Although all the stopes selected by the algorithm have a positive economic value, the
combination of stopes is not likely to be the optimum combination of stopes possible.
2. The solution of the algorithm varies based on its set starting point.

7-2
7-2-1

Stope boundary optimiser


Block converter

In order to be able to work with the blockmodel, it needs to contain uniform sized stopes. As
most blockmodels contain blocks with different sizes, a block converter was built that creates
a blockmodel with uniform block sizes. The block converter does this by setting a grid with
a size set by the user, it then checks which blocks of the original blockmodel are inside a
block in the grid. After the block converter has found these blocks, it calculates how much
of the block of the blockmodel is inside it. Using this the new values of the new block are
calculated. Building a blockmodel with uniform block sizes can also be done in the software
package Surpac, which is generally quicker.

7-2-2

Stope optimiser

The stope optimiser that was developed by Sens (this project) is a combinatorial optimisation
algorithm that tries to determine the best set of stopes containing either uniform sized stopes
or variable sized stopes, which can be set by the user. The stope optimisation can be based
on several different criteria. These are:
Stope profit.
Stope profit per square metre.
Stope profit divided by its total mining time (in order to do this an extra calculation is
carried out that estimates the mining time of the stope).
Basing the optimisation on the stope profit will result in a mine design that gives maximum
possible overall profit. Basing the optimisation on stope profit per square metre will result
in more selective mining. Smaller stopes will be selected in the higher grade areas which
will have a high profit per square metre. These optimisations will generally result in a mine
design having a higher Net Present Value (NPV) then the mines designed on stope profit.
Optimising the mine based on profit divided by its total mine time will give a mine design
with optimised NPV. Essentially, the highest revenue is achieved by first processing the stope
that can be mined out the quickest. This will automatically result in the highest NPV because
the highest revenues are made while having the lowest discount rate. The optimiser starts
off by calculating the economic block value for each block in the blockmodel. It does this
by calculating the volume, multiplying this by the grade and then calculating the amount
of revenue using the commodity price that can be made by selling off the commodity. The
advantage of using an economic block value block model is that the optimisation process is
Master of Science Thesis

J.J.Sens

36

Stope boundary optimisation

simplified. It also cuts back on processing time because the economic value of the commodity
only has to be calculated once.
The economic block value blockmodel is created using the following formula:

[V ALU EM ] = ([OREM A] comprice) (mincost (width depth height)...


specwght) bckf illcost (width depth height)

(7-1)

OREMA is the table containing the ore percentages for each block in the blockmodel
VALUEM is the table containing the economic block value of each block in the blockmodel
comprice is the commodity price in $ /tonne (commodity)
mincost is the mining and processing cost in $ /tonne (ore)
bckfilcost is the backfill cost in $ per square metre
width depth and height are the dimensions of the block
Formula 7-1 calculates the economic block value. It does this by first calculating the revenue
that can be made by selling the commodity present in the block. This calculation involves
multiplying the [OREMA] matrix, which contains the amount of ore in the block, with the
commodity price. After this, the costs are subtracted from the revenue and then divided into
two parts. The first part is the mining cost in the block, which is calculated by multiplying
the block volume times the block specific weight times the mining cost per tonne. The second
part is the backfill cost, which is calculated by multiplying the block volume times the backfill
cost per volume unit.
After the economic block value matrix has been calculated, a table is created containing all
the different stopes. These stopes are of different sizes possible, as set by the user, and on all
locations within the blockmodel. After this table is created, all the stopes having negative
revenue are discarded. Thus the table ends up containing all the possible positive stopes from
which the algorithm can choose. The economic values of the stopes are calculated by adding
up the economic block values of the blocks inside the stopes.
The optimiser can take a crownpillar into account, which is placed in the top part of the
stope. This lowers the economic value of the stope by a certain fraction, which is calculated
using the following two formulas:

Crownpillossf act = (blockwidth stopewidth) (blockdepth stopedepth)...


crownpillarheight)/((blockwidth stopewidth) (blockdepth stopedepth)...
(blcokheight stopeheight))

(7-2)

Crownpillossfact factor to decrease the stope value


J.J.Sens

Master of Science Thesis

7-3 Economic block value manipulation

37

Crownpillarheight height of the crownpillar set by the user


blockwidth, blockdepth, and blockheight are the dimensions of the blocks in the blockmodel
stopewidth, stopedepth and stopeheight are the number of blocks in each direction in the
stope
In formula 7-2, a crownpillar factor is determined by dividing the crownpillar volume by the
stope volume.
V ALU E = V ALU E (1 crownpillossf act)

(7-3)

crownpillossfact factor to decrease the stope value


VALUE economic value of the stope
In formula 7-3, the crown pillar loss factor is multiplied with the VALUE matrix to take the
decrease of minable ore into account.
After the table is created, the stope having the highest revenue is selected. Within a certain
radius from this stope, which is selected by the user, all the different possible combinations
that can surround this stope are assessed. In addition, all the other possible combinations in
this area are assessed, where one of the other possible stopes that have overlapping area was
chosen instead of the highest revenue stope. From all these combinations, the combination
with the highest revenue is selected. This stope is then transferred to the final stope design
table. The blocks of the blockmodel inside this stope get tagged so they are not available for
selection anymore. However, these stopes are taken into account when combinations of stopes
are being assessed. In the available stope table, all the stopes that contain one or more tagged
stopes are removed from the table. Repeating the above procedure, all stopes are assessed
until the positive stope table no longer contains any stopes. The resulting design contains a
number of localised optimisations. The larger the optimisation radius that is set, the larger
these optimisation regions are and the closer the result is to the true optimum. When the
radius is set to match the size of the whole ore body, in theory the true optimum could be
found. However in most cases, the calculation time for this would be too long to be practical.
In Figure 7-2, a flowsheet of the stope optimisation process can be found.
The outcome of the optimisation can be seen in Table 7-1, where the first column is the stope
number, which is used to identify the stope. The next three columns give the coordinates of
the bottom edge of the stope, and the dimension of the stope is given in each direction. The
ninth column states the revenue that can be made by mining this stope taking only mining
costs and the commodity price into account.

7-3

Economic block value manipulation

Before starting any optimisation, the economic block value matrix can be manipulated to
take certain factors into account, like the overall efficiency, decrease of efficiency with depth
Master of Science Thesis

J.J.Sens

38

Stope boundary optimisation

Figure 7-2: flowchart of the stope optimation process

J.J.Sens

Master of Science Thesis

7-3 Economic block value manipulation

39

Table 7-1: Example of a stopes table

stope numbre
482
537
536
385
446
534
501
519
533
363
532
531
530
529
130
254
528
520
236
442
168
402
257
147
527
444
421
265
526
524
523

X
786225
786390
786450
786165
786195
786285
786330
786420
786180
786255
786210
786180
786420
786420
786225
786270
786480
786390
786300
786285
786390
786195
786285
786375
786525
786270
786195
786135
786210
786495
786480

Master of Science Thesis

Y
344310
343560
344805
344025
344070
344310
344640
343635
343740
344175
343470
343950
344805
344580
344025
343755
344610
344745
343665
343890
343455
343995
344295
344325
344220
343305
344115
343935
343665
344190
344265

Z
5547.5
5562.5
5532.5
5427.5
5487.5
5622.5
5472.5
5487.5
5337.5
5577.5
5352.5
5187.5
5532.5
5442.5
5247.5
5367.5
5442.5
5502.5
5442.5
5412.5
5562.5
5217.5
5697.5
5397.5
5817.5
5382.5
5322.5
5397.5
5232.5
5367.5
5787.5

dim X
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30

dim Y
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30
30

dim Z
60
60
60
60
60
60
60
60
60
60
60
60
60
60
75
60
60
60
60
75
60
60
60
60
60
60
75
60
60
60
75

revenue
225.25
3364
4255
12446.13
12658.75
14805.25
14957.13
15058.38
18399.63
19189.38
24211.38
26479.38
26935
26935
29746.38
31825.38
32605
38275
46000.38
47151.25
50657.88
55295.13
58454.13
61937.13
67030
68427.25
69395.88
71707.75
71768.5
81670.75
82092.63

used
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1

J.J.Sens

40

Stope boundary optimisation

and the processing recovery rate. These manipulations can simply be done by multiplying the
economic block value matrix with the efficiency. To change the efficiency according to depth,
a matrix is generated with the same size as the economic block value matrix containing the
efficiency for each location or level. To calculate this depth dependant matrix, first a matrix
is generated which contains the depth at each location. Using the boundary conditions of
100% efficiency at 0 depth and an efficiency at a certain depth set by the user. The efficiencies
are calculated using interpolation and extrapolation. It is also possible to use an exponential
function. In this case, the user also has to supply the power of the function. An example
of this can be seen in Figure 7-3, which shows both the linear and exponential efficiency
manipulation, as well as how the lines intersect the efficiency and depth set by the user.

Figure 7-3: Schematic view of economic block value manipulation by depth

7-3-1

Scheduler and NPV optimisation

In order to calculate and optimise the mine design based on the total NPV a mining schedule has to be created. For achieving maximum total NPV, the stopes that have the highest
revenue per time unit have to be produced first. Therefore these stopes are targeted first.
However due to the maximum span that is allowed for openings underground, it is impossible
to have stopes in production next to each other. This means that when a stope is in production, the neighbouring stopes cannot be produced during a certain period. These stopes are
tagged for a certain period in a seperate table. The scheduler will then select the stope with
the highest benefit to the total NPV if untagged.
The scheduler will also select several stopes to be developed at the same time, to ensure the
total production reaches the desired monthly production rate. The development of a stope,
occurs in three different stages. The first stage is stope preparation, where the chute and
the sublevels are constructed. In this period, there is little production. In the next stage,
the stope is produced, this is when most of the production takes plac. In the last period,
the stope is closed off and backfilled, and the backfill is given time to harden. During the
last stage, no more production happens. In none of the three stages it is allowable to have a
neighbouring stope in production. The scheduler will produce a time schedule containing the
following information:
Stope number.
Daily production from the stopes.
J.J.Sens

Master of Science Thesis

7-3 Economic block value manipulation

41

Figure 7-4: accumulated revenue and accumulated NPV

Stage of production of the stope.


Cashflow from the stope (this will be negative during preparation and backfilling, and
positive during production).
After optimisation and scheduling, graphs are produced showing when each stope should be
production, the accumulated cash flow, and the total NPV is calculated. In Figure 7-4, an
example of a cash flow can be seen together with the accumulated NPV. When a stope
is in production, the infrastructure connecting this stope needs to be constructed together
with the ore handling system. For the optimisation algortihm it is assumed that the main
infrastructure, like the shaft and the decline, need to be put in place before any mining
can commence, otherwise no material can be moved away. Due to this, infrastructure will
be available to the deepest point of the mine from the start, which means that it is not
economically beneficial to start mining at the highest level. Because of this, the optimiser
can decide to start mining at any given level.

7-3-2

Visualiser

For visualising and validating the optimisation outcome, a visualiser was developed which
displays the results in three dimensions. Each stope is assigned a colour which depends on its
revenue, and the revenue of each stope can be looked up in the legend. The visualiser is built
in Matlab, and the image is automatically produced after the optimisation is completed. The
visualiser uses the patch function in Matlab which can build patches by assigning the corner
points. Using these patches, for each side of the stope, the plane is visualised. The colour of
the patch changes with the value of the stope, and the value for each colour can be seen in
Master of Science Thesis

J.J.Sens

42

Stope boundary optimisation

Figure 7-5: Stope design view shown by the visualiser

the legend next to the figure. These colours can help the user with identifying the high grade
areas.
In Figure 7-5, an example of a visualisation of an example mine can be seen together with a
legend.

J.J.Sens

Master of Science Thesis

Chapter 8
Supporting logarithms

Several scripts had to be written to support the optimisation algorithms. In this chapter, the
workings and the reason for developing these supporting scripts are described.

8-1

Orientation changer

One of the shortcomings of the current algorithm is that stopes can only have a north-south
orientation. When the blocks in the blockmodel do not have this same orientation, the mine
design and optimisation will not be correct. Therefore, the orientations of the blockmodel
have to be changed to match the orientation used by the optimiser. In order to do this
an orientation tool was created. The tool determines the midpoint of the blockmodel data,
which is then stored for later use. The orientation tool then rotates all the points using the
midpoint as the turning axis to a new orientation. After the mine design has been made the
same tool can be used to rotate the whole design back to its original location. To calculate
the new position of a point, first the distance from the midpoint needs to be calculated, which
is the radius. This is done using the abc-formula. Then the angle in respect to the northing
is calculated. The angle of the requested rotation is added to this angle. By reversing the
calculation the new location is calculated. This is done using the formulas which can be seen
in Eq. (8-1) to Eq. (8-4)

distance =

(abs(xpoint xmidpoint)2 + abs(ypoint ymidpoint)2 )

newangle = sin1 (

ypoint ymidpoint
) + rotationangle
distance

(8-1)
(8-2)

ypointnew = sin(newangle) distance + ymidpoint

(8-3)

xpointnew = cos(newangle) distance + xmidpoint

(8-4)

Master of Science Thesis

J.J.Sens

44

8-2

Supporting logarithms

Surpac exporter

An exporter was built for exporting the stopes and infrastructure to Surpac. Surpac uses
solids to visualise structures, and in order to create solids in surpac, strings have to be create
which connect the corner points of the stopes. These strings are saved as a csv format in a
file with a .str extension. Each cornerpoint has a separate row which contains the colour and
the x,y and z coordinates. After eight rows, containing the information for each cornerpoint
of a stope, a row of zeros is inserted to indicate the end and start of the string cornerpoints
for a new stope.
After this another file has to be created containing a list of the patches that make up the
solids. This file also has a csv format but has a .dtm extension. The first row contains the
name of the .str file it references to. The patches used in surpac have three cornerpoints. In
the .dtm file for each cornerpoint in a patch a reference is made to the row in the .str file
in which its location is described. the first column of the table contains the stope number,
the next three columns contain the three numbers that point to the coordinates which are
written down in the .str file. The last three numbers are used by Surpac to close the solid so
volumes can be calculated. As Surpac can calculate this automatically these values are set to
zero in the string file. In Table 8-1 and Table 8-2 respectively, an example of a .str file and a
.dtm file can be seen.

8-3

Position and profit cut off

Due to the overlying open pit mine, the underground mine has to be limited to a certain
depth. The position cut of script will remove any planned stopes above a certain depth.
The profit cut of script will remove stopes which do not meet a minimum profit set by the
user. Due to possible errors in the blockmodel, a stope might not turn out to be profitable
when production of the stope has finished. Therefore removing stopes which do not meet
the minimum profit can be removed, lowering the risk of not making money on the selected
stopes.

8-4

Basic infrastructure generation

A large part of the infrastructure is determined by the location of the stopes. These infrastructure elements, which are the drives connecting the stopes, the crosscuts and the slot
raises can automatically be generated by the drives connector. The drives are connected to
the hauling level and the sublevels. The drive connector can be set to link drives together.
If the stopes are not generated in a straight line next to eachother small straight sections of
infrastructure are inserted to connect the stopes. The crosscuts and slot raises are put into
the stopes using a set pattern. In Figure 8-1, a schematic view of this can be seen. It shows
a horizontal crosscut with the stopes in black, the infrastructure inside the stopes in red and
the drives connecting the stopes in green.

J.J.Sens

Master of Science Thesis

8-4 Basic infrastructure generation

45

Figure 8-1: Basic infrastructure seen from above as generated by the basic infrastructure generator

3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
3
0

7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
7.86E+05
0

3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
3.44E+05
0

5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
5187.5
0

Table 8-1: Example .str file containing the position of each corerpoint in the string (line)

Master of Science Thesis

J.J.Sens

46

stopes.str
0
OBJECT
TRISOLATION
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

Supporting logarithms

0
1
1
1
1
1
4
3
3
2
2
1
1
5
5
10
10
10
13
12
12
11
11
10
10
14
14
19
19
19
22
21

END

neighbours=yes
2
3
4
5
4
8
3
6
2
5
6
7
11
12
13
14
13
17
12
15
11
14
15
16
20
21
22
23
22

validated=FALSE
3
4
5
8
8
7
7
7
6
6
7
8
12
13
14
17
17
16
16
16
15
15
16
17
21
22
23
26
26

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

Table 8-2: Example .dtm file

J.J.Sens

Master of Science Thesis

Chapter 9
Randgold Kibali underground mine
design

The example chosen to demonstrate the functionality of the algortihms was the Kibali project,
this project was chosen because detailed infromation is available for this project and because
it fits the mine profile for which the optimisation algorithm was created. The Randgold mine
design as in October 2011 can be seen in Figure 9-1 to Figure 9-4. In these designs the stopes
can be seen which follow the shape of the orebody with a minimum gold content. Also one
can see the double access that is planned for accessing the mine. This access will be used
for allowing access to the mine for personel and supplies. Also will it be used to produce the
top level stopes. In Figure 9-1 to Figure 9-4 one can also see the drives and infrastructure
connecting the stopes. The production shaft and haul levels can also be seen in the picture.

Figure 9-1: Randgold Kibali underground mine design, topview

Master of Science Thesis

J.J.Sens

48

Randgold Kibali underground mine design

Figure 9-2: Randgold Kibali underground mine design, sideview

In Figure 9-5 to Figure 9-8 the stopes which were generated by the stope optimiser can be
seen. these stopes have surface dimension of 25 meter by 25 meter, the height of the stope
can vary between 25 and 100 meters. The stopes were generated using a gold price of 50.000
$/kg.
When comparing both the stope design made by Randgold and the stope optimisation algorithm one can see that the mining locations match well. Both designs have separate sections
above each other on the south-west side and a massive block of stopes on the north-east side.
Both designs develop the same areas and leave the same areas in the orebody undeveloped in
the centre part of the mine it can be seen that both designs leave certain spots undeveloped.
When looking at the design made by the stope optimisation algorithm one can see that the
stopes are designed so the minimal number of stopes is needed to produce the whole orebody.
The small differences that are present are probably due to different variables (gold price,
mining cost, backfill cost) chosen compared to those chosen by Randgold.
Also the stopes designed by Randgold were designed by follow the shape of the area with
minimum gold content. The stope optimisation algorithm made for this thesis can only
generate square shaped stopes, which is the basic shape for a stope. The mine design generated
by the stope optimisation algorithm will have higher amounts of dilution resulting in a lower
revenue. When the mine starts producing the shape will likely turn out to closer match
the shapes designed by the algorithm. Also, due the uncertainties in the orebody it is very
unlikely that the high grade area exactly follows the shape used for the Randgold design,
therefore while producing the stopes their shapes will most likely be changed. Comparing the
total tonnage in the stopes of the design generated by the optimisation algorithm it can be
seen that the total tonnage is higher than the tonnage of the Randgold design. This difference
is caused by the square shape of the stopes which the optimisation algorithm is limited to,
causing extra dilution to be located inside the stopes. When looking at the grade in the stopes
it shows that the grades approximately match the grades of the Randgold design. The main
advantage of the stope optimisation algorithm is that the design is generated in a couple of
J.J.Sens

Master of Science Thesis

49

Figure 9-3: Randgold Kibali underground mine design, sideview

hours, therefore it is a useful tool for quickly assessing the basic design. For the optimisation
algorithm to generate a more profitable layout extra features should be added to match the
shape of the stopes more exactly with the shape of the orebody. this could include tilting the
stopes or cutting off corners of which it is known that they contain dilution.
In terms of infrastructure, it can be seen that the design approximately matches the design
made by Randgold. The biggest difference that can be seen is that in the Randgold design
the infrastructure is a better fit and follows the contours of the orebody more. In the current
form the drives generation algorithm can only design drives on the south side of the model,
an improvement could be made by allowing the drives to have more than one orientation.

Master of Science Thesis

J.J.Sens

50

Randgold Kibali underground mine design

Figure 9-4: Randgold Kibali underground mine design, sideview

Figure 9-5: Optimisation algorithm underground mine design, topview

J.J.Sens

Master of Science Thesis

51

Figure 9-6: Optimisation algorithm underground mine design, sideview

Figure 9-7: Optimisation algorithm underground mine design, sideview

Master of Science Thesis

J.J.Sens

52

Randgold Kibali underground mine design

Figure 9-8: Optimisation algorithm underground mine design, sideview

J.J.Sens

Master of Science Thesis

Chapter 10
Conclusions and recommendations

10-1

Conclusions

For this thesis, several algorithms were successfully developed. These optimisation algorithms
are capable of defining optimised stope boundaries, infrastructure and ore hauling systems
(however, it is difficult to prove that the true optimum is found). Tests on very simple
examples have shown that the optimisation algorithm finds the optimal layout within its
restrictions. The stope boundary optimisation algorithm works for massive stope mines in
which the shape of the stope is not dictated by the shape of the orebody. The infrastructure
optimisation algorithms can be used in all mining methods where large sections of infrastructure need to be generated. The ore hauling optimisation algorithm can be used in all methods
were Load Haul Deliver (LHD) trucks, conveyors and a shaft are being used.
In the case study that was done for Randgold it is shown that the algorithms are successful at
generating an initial design. Also, for certain cases, a more beneficial design is found compared
to a design made using traditional designing methods. Since the optimisation algorithm takes
the stope shape into account and acknowledges the dilution that will occur because of this,
it could be argued that a more realistic estimation is made.

10-2

Recomendations

For increasing the efficiency of the program, the structure of the program could be changed.
Instead of working in Matlab, the program could be written in a language such as C. This
could decrease the processing time to perform optimisations. Also, the visualisation of three
dimensional shapes in Matlab can be very slow, making it difficult to properly view the results.
A program should be found that better handles and visualises three dimensional shapes. An
important advantage of using a computer language such as C is that an executive file can be
made, so an installed version of Matlab is no longer needed.
For the infrastructure optimisation algorithm, several structures could be added to increase
the variety of possible solutions and the efficiency of the algorithm. In the current phase,
Master of Science Thesis

J.J.Sens

54

Conclusions and recommendations

only n*90 degree corners can be generated and straight infrastructure is always orientated
North-South or East-West. Ideally, the angle, the corners and the direction of the straight
section should be variable. However, it should be investigated how to generate these kind of
random routes, also it should be investigated how to put the nodes in place that connect the
random routes.
In the current Ore Hauling System optimisation algorithm, the drop-off locations have to be
set by the user. An improvement would be to have an algorithm developed which places the
drop-off points at the most efficient location by analysing the total distance the LHD trucks
need to drive and the costs involved versus the costs for building the ore passes. The drive
design connecting the stopes should be extended to more closely follow the shape of the stope
design. In order to accomplish this, the coordinate system should be changed to spherical
system to make all orientations are possible.

J.J.Sens

Master of Science Thesis

References

Adams, P. R., Hansen, T. T., Klerk Q. D., Leonard, R., Kock, F., Kerr. P., 2009,
Kibali Gold Project in the Democratic Republic of Congo (NI 43-101) Technical Report..
Alfords, C. 1995, Optimisation in underground mine design. 25th APCOM AusIMM, p
213-218
Alfords, C., Brazi, M., Lee, D. H., 2007 ,Optimisation in underground mining Handbook
of Operations Research, Natural Resources, Chapter 30, p. 561-577.
Angus, D., 2007, Crowding populraion-based ant colony optimisation for the multiobjective traveling salesman problem, Proceedings of the 2007 IEEE Symposium on Computational Intelligence in Multicriteria Decision Making, p. 333-340.
Ataee-Pour, M., 2004, Optimisation of stope limits using a heuristic approach, Institution
of Mining and Metallurgy. Transactions. Section A: Mining Technology p. A123-A128.
Brazil, M., Lee, D. Rubinstein, J., Thomas, D.A., Weng, J., Wormald, N., 2007,
Optimisation in the design of underground mine access, Journal of Australasian Institute of
Mining and Metallurgy, p. 141-144.
Cahen, L., 1954, Geologie du Congo Belge, Impremerie H. Vaillant-Carmanne, S.A., pp.
577.
Cawrse, I., 2001, Multiple Pass Floating Stope Process, Journal of Australasian Institute
of Mining and Metallurgy, p. 87-94.
Choi, J.S., 2006, Rock Mass Classification Using Electrical Resistivity - an Analytical Study,
journal of Key Engineering Materials p. 1411-1414.
Dorigo, M. Stutzle, T., 2004, Ant Colony Optimisation MIT Press, pp. 301
Dro, J., 2006, Shortest path found by an ant colony, accessed 30 August 2011, <http:
//www.wikipedia.org/wiki/Ant_colony_optimisation>
Garey, M., 1979, Computers and intractability: a guide to the theory of NP completeness,
Freeman, pp. 338.
Hartman, H. L., 1992, SME mining engineering handbook, Society for Mining, Metallurgy,
and Exploration (U.S.), pp. 988.
Master of Science Thesis

J.J.Sens

56

References

Hoek, E., Kaiser, P. Bawden, W., 1995, Support of Underground Excavations in Hard
Rock, Taylor and Francis, pp. 215.
Lavreau, J. J., 1973, New Data about the Kilo-Moto Deposits (Zaire), Mineral. Deposita
p. 1-6.
Lavreau, J. J., 1984, Vein and Stratabound Gold Deposits of Northern Zaire, Mineral.
Deposita p. 158-165.
Leinart, J.B., 2011, Mining cost sercvice handbook, Infomine USA, Washington, p. 655.
Robertson, p., Mining rules of Thumb accessed 15 September 2011, <http://www.
infomine.com/SearchMiningRule.asp>
Straaten, P. V. 2000, Rocks for crops, Fidelity National Information Solutions Canada, p.
115-119.
Topal, E, and Sens, J., 2010, A new algorithm for stope boundary optimization. Journal
of Coal Science and Engineering (China), p 113-119.

J.J.Sens

Master of Science Thesis

Glossary

List of Acronyms
ALIO

Ant Logic Infrastructure Optimiser

ACO

Ant Colony Optimisation

BGC

Barrick Gold Corporation

OKIMO

Offices des Mines d Or de Kilo-Moto

LHD

Load Haul Deliver

OHSO

Ore Hauling System Optimisation

MNV

Maximum Neighbourhood Value

CIL

Carbon in Leach

NPV

Net Present Value

PhV

Pheromone Value

MPFSA

Multiple Pass Floating Stope Algorithm

Master of Science Thesis

J.J.Sens

58

J.J.Sens

Glossary

Master of Science Thesis

Matlab scripts

10-3
1
2

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Graphic user interfacer

function GUI ( SE2 )


global optfact g infrastrdata firstplot pointsloaded pointsdata OREMA
fact bh p8 SOREMA MNV5 drivecost profit p7 dr1 dr2 wfile spiralcost XS
YS ZS spiral2 inputdata t1 drives
clear all
clc
firstplot =1;
pointsloaded =0;
spiralcost =0;
spiral2 =0;
opengl hardware
f = figure ( Position , [ 3 1 0 50 1100 8 0 0 ] , menubar , none , NumberTitle ,
off , resize , off , Name , GUI , renderer , opengl , visible , off ) ;
bh = axes ( Parent , f , Units , pixels , . . .
Position , [ 3 3 5 75 630 6 2 0 ] ) ;
t1 = uicontrol ( f , Style , Text , String , status , Position , [ 5 0 0 20 300
2 0 ] , BackgroundColor , white ) ;
t2 = uicontrol ( f , Style , Text , String , Revenue from Stopes , Position
, [ 8 7 0 770 200 2 0 ] , BackgroundColor , white ) ;
t3 = uicontrol ( f , Style , Text , String , Additional costs , Position
, [ 8 7 0 745 200 2 0 ] , BackgroundColor , white ) ;
t4 = uicontrol ( f , Style , Text , String , Total profit , Position , [ 8 7 0
720 200 2 0 ] , BackgroundColor , white ) ;
w1 = uicontrol ( f , Style , edit , String , Workfile , Position , [ 6 7 0 770
150 2 0 ] , callback , @workfile ) ;
ylabel ( north south )
xlabel ( east west )
% ---------------top buttons ---------------------------------h8 = uicontrol ( f , Style , PushButton , . . .
String , route , Position , [ 3 0 740 100 5 0 ] , Callback , @pushbutton8 ) ;
h9 = uicontrol ( f , Style , PushButton , . . .
String , block converter , Position , [ 1 5 0 740 100 5 0 ] , Callback ,
@pushbutton9 ) ;
h10 = uicontrol ( f , Style , PushButton , . . .
Master of Science Thesis

J.J.Sens

60

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

Matlab scripts

String , input values , Position , [ 2 7 0 740 100 5 0 ] , Callback ,


@pushbutton12 ) ;
%h11 = uicontrol (f,Style , PushButton ,...
%
String , input data ,Position ,[390 740 100 50], Callback ,
@pushbutton13 );
h12 = uicontrol ( f , Style , PushButton , . . .
String , stope optimiser , Position , [ 5 1 0 740 100 5 0 ] , Callback ,
@pushbutton14 ) ;
% --------------------panels ---------------------------------------pn1 = uipanel ( f , Position , [ . 0 1 2 5 . 0 1 2 5 . 2 3 5 . 9 0 ] , visible , on ) ;
pn2 = uipanel ( f , Position , [ . 0 1 2 5 . 0 1 2 5 . 9 7 5 . 9 0 ] , visible , off ) ;
pn3 = uipanel ( f , Position , [ . 0 1 2 5 . 0 1 2 5 . 9 7 5 . 9 0 ] , visible , off ) ;
%pn4 = uipanel (f,Position ,[.0125 .0125 .975 .90] , visible ,off );
pn5 = uipanel ( f , Position , [ . 0 1 2 5 . 0 1 2 5 . 2 3 5 . 9 0 ] , visible , off ) ;
% ------------------menu ---------------------------u1 = uimenu ( f , label , file ) ;
uimenu ( u1 , label , Save project , callback , @uimenu1 ) ;
uimenu ( u1 , parent , u1 , label , Open project , callback , @uimenu3 ) ;
uimenu ( u1 , label , Save drives , callback , @uimenu5 ) ;
uimenu ( u1 , label , Load drives , callback , @uimenu6 ) ;
uimenu ( u1 , label , Save infrastructure , callback , @uimenu17 ) ;
uimenu ( u1 , label , Load infrastructure , callback , @uimenu18 ) ;
uimenu ( u1 , label , Save stope boundaries , callback , @uimenu7 ) ;
uimenu ( u1 , label , Load stope boundaries , callback , @uimenu8 ) ;
uimenu ( u1 , label , load rockmechdata , callback , @uimenu10 ) ;
uimenu ( u1 , label , Exit , callback , @pushbutton3 , Separator , on ) ;
u2 = uimenu ( f , label , Report ) ;
uimenu ( u2 , label , Report , callback , @uimenu14 ) ;
uimenu ( u2 , label , Export to excel , callback , @uimenu9 ) ;
uimenu ( u2 , label , Export to surpac , callback , @uimenu11 ) ;
uimenu ( u2 , label , Export eps , callback , @uimenu12 ) ;
uimenu ( u2 , label , Export figure , callback , @uimenu92 ) ;
u3 = uimenu ( f , label , Edit ) ;
uimenu ( u3 , label , Clear plot , callback , @uimenu13 ) ;
uimenu ( u3 , label , Edit stopes , callback , @uimenu15 ) ;
uimenu ( u3 , label , Set min Stope revenue , callback , @uimenu115 ) ;
uimenu ( u3 , label , Rotate back to original orientation , callback ,
@uimenu16 ) ;
u4 = uimenu ( f , label , Help ) ;
uimenu ( u4 , label , About , callback , @uimenu2 ) ;
uimenu ( u4 , label , Help , callback , @uimenu4 ) ;
% ---------------- buttons panel1 ----------------------------h1 = uicontrol ( pn1 , Style , PushButton , . . .
String , Start , Position , [ 3 0 280 100 5 0 ] , Callback , @pushbutton1 ) ;
h3 = uicontrol ( pn1 , Style , PushButton , . . .
String , Close , Position , [ 3 0 220 100 5 0 ] , Callback , @pushbutton3 ) ;
h4 = uicontrol ( pn1 , Style , PushButton , . . .
String , Rotate 3d , Position , [ 3 0 160 100 5 0 ] , Callback ,
@pushbutton4 ) ;
h5 = uicontrol ( pn1 , Style , PushButton , . . .
String , Zoom , Position , [ 3 0 100 100 5 0 ] , Callback , @pushbutton5 ) ;
h6 = uicontrol ( pn1 , Style , PushButton , . . .
String , Pan , Position , [ 3 0 40 100 5 0 ] , Callback , @pushbutton6 ) ;
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117

61

h7 = uicontrol ( pn1 , Style , PushButton , . . .


String , load , Position , [ 3 0 540 100 5 0 ] , Callback , @pushbutton7 ) ;
h8 = uicontrol ( pn1 , Style , PushButton , . . .
String , spiral , Position , [ 3 0 600 100 5 0 ] , Callback , @pushbutton20
);
h9 = uicontrol ( pn1 , Style , PushButton , . . .
String , add orehand . , Position , [ 3 0 660 100 5 0 ] , Callback ,
@pushbutton21 ) ;
c1 = uicontrol ( pn1 , Style , Checkbox , String , rand routes , Position
, [ 3 0 480 80 2 0 ] , . . .
Callback , @checkbox1 ) ;
c2 = uicontrol ( pn1 , Style , Checkbox , String , nodes , Position , [ 3 0 440
80 2 0 ] , . . .
Callback , @checkbox2 ) ;
c3 = uicontrol ( pn1 , Style , Checkbox , String , direct line , Position
, [ 3 0 400 80 2 0 ] , . . .
Callback , @checkbox3 ) ;
c4 = uicontrol ( pn1 , Style , Checkbox , String , Ant solution , Position
, [ 3 0 360 80 2 0 ] , . . .
Callback , @checkbox4 ) ;
c5 = uicontrol ( pn1 , Style , Checkbox , String , stope solution , Position
, [ 1 3 0 480 120 2 0 ] , . . .
Callback , @checkbox5 ) ;
h33 = uicontrol ( pn1 , Style , PushButton , . . .
String , show val , Position , [ 3 0 480 100 5 0 ] , Callback , @pb33 ) ;
axis equal
grid on
% --------------------- buttons panel2 -----------------------------% --------------- setting standard values -----------------------fc =20; gc =20; hc =20; Xc =40; Yc =40; Zc =40; fact =0;
h10 = uicontrol ( pn2 , Style , PushButton , . . .
String , get CSV , Position , [ 3 0 280 100 5 0 ] , Callback ,
@pushbutton10 ) ;
h11 = uicontrol ( pn2 , Style , pushbutton , . . .
String , convert blockmodel , Position , [ 3 0 220 100 5 0 ] , Callback , {
@pushbutton11 } ) ;
uicontrol ( pn2 , Style , edit , String , fc , . . .
Position , [ 1 5 0 , 2 9 0 , 9 0 , 2 5 ] , . . .
Callback , { @edit1 } ) ;
uicontrol ( pn2 , Style , edit , String , gc , . . .
Position , [ 1 5 0 , 2 6 0 , 9 0 , 2 5 ] , . . .
Callback , { @edit2 } ) ;
uicontrol ( pn2 , Style , edit , String , hc , . . .
Position , [ 1 5 0 , 2 3 0 , 9 0 , 2 5 ] , . . .
Callback , { @edit3 } ) ;
uicontrol ( pn2 , Style , edit , String , Xc , . . .
Position , [ 1 5 0 , 2 0 0 , 9 0 , 2 5 ] , . . .
Callback , { @edit4 } ) ;
uicontrol ( pn2 , Style , edit , String , Yc , . . .
Position , [ 1 5 0 , 1 7 0 , 9 0 , 2 5 ] , . . .
Callback , { @edit5 } ) ;
uicontrol ( pn2 , Style , edit , String , Zc , . . .
Position , [ 1 5 0 , 1 4 0 , 9 0 , 2 5 ] , . . .
Master of Science Thesis

J.J.Sens

62

118
119
120
121
122
123

124
125
126

127

128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157

Matlab scripts

Callback , { @edit6 } ) ;
% ---------------------- buttons panel3 -----------------------------load ( inputdata )
h101 = uicontrol ( pn3 , Style , PushButton , . . .
String , Save variables , Position , [ 3 0 20 100 5 0 ] , Callback ,
@pushbutton301 ) ;
rowname1 = { comodity price ($/..) , mining cost ($/ tonne ) , stope
startup cost ($) , stope backfill cost ($/ tonne ) , efficiency (%) ,
Min stope revenue } ;
rowname2 = { desired total production , Stope mining rate , Backfill rate
, Stope Startup time } ;
rowname3 = { max grade (%) , Infrastr , radius (m) , strght sect. cost($/m)
, crnr sect. cost($/m) , rockbolt cost($/m) , meshcost ($/m) , . . .
no of ants , no. of rand. routes gen. , max stght sections , max
crnr sections , max no. of sect. in infrastr . , grid size , max no
. drives in sequence , rockstr . bolts , rockstr mesh , sublevel
dist } ;
rowname5 = { min no stopes X ( blocks ) , min no stopes Y( blocks ) , min no
stopes Z( blocks ) , max no stopes X( blocks ) , max no stopes Y( blocks ) ,
max no stopes Z( blocks ) , . . .
stepsize X , stepsize Y , stepsize Z , crownpillar } ;
rowname6 = { pheromone mult. , add mult. } ;
rowname7 = { Northing , Easting , shaft cost/m } ;
columnname3 = { values , available } ;
columnformat = { numeric } ;
columnformat7 = { numeric } ;
columnformat3 = { numeric , logical } ;
columneditable1 = true ; columneditable2 = false ;
tb11= uicontrol ( Parent , pn3 , style , Text , position , [ 1 , 6 0 0 , 2 0 0 , 5 0 ] ,
string , Cost and prices ) ;
tb12= uicontrol ( Parent , pn3 , style , Text , position , [ 1 , 4 1 0 , 2 0 0 , 5 0 ] ,
string , Scheduling ) ;
tb13= uicontrol ( Parent , pn3 , style , Text , position , [ 1 , 2 2 0 , 2 0 0 , 5 0 ] ,
string , infrastructure values ) ;
tb1 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 0 1 0 . 6 6 0 . 4 0 . 2 ] , Data , inputdata . dat , . . .
RowName , rowname1 , . . .
ColumnFormat , columnformat , . . .
ColumnEditable , columneditable1 , . . .
CellEditCallback , { @table1 } ) ;
tb2 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 0 1 0 . 4 0 . 4 0 . 2 ] , Data , inputdata . schedule , . . .
RowName , rowname2 , . . .
ColumnFormat , columnformat , . . .
ColumnEditable , true , . . .
CellEditCallback , { @table2 } ) ;
tb3 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 0 1 0 . 1 4 0 . 4 0 . 2 ] , Data , inputdata . infrastrdata , . . .
RowName , rowname3 , . . .
columnName , columnname3 , . . .
ColumnFormat , columnformat3 , . . .
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203

63

ColumnEditable , [ true true ] , . . .


CellEditCallback , { @table3 } ) ;
tb4 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 5 0 . 6 6 0 . 4 0 . 2 ] , Data , inputdata . stopedimdata , . . .
RowName , rowname5 , . . .
columnName , columnname3 , . . .
ColumnFormat , columnformat3 , . . .
ColumnEditable , columneditable1 , . . .
CellEditCallback , { @table4 } ) ;
tb5 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 5 0 . 4 0 . 4 0 . 2 ] , Data , inputdata . antingparam , . . .
RowName , rowname6 , . . .
ColumnFormat , columnformat , . . .
ColumnEditable , columneditable1 , . . .
CellEditCallback , { @table5 } ) ;
tb6 = uitable ( Parent , pn3 , Units , normalized , Position , . . .
[ 0 . 5 0 . 1 4 0 . 4 0 . 2 ] , Data , inputdata . shaftdata , . . .
RowName , rowname7 , . . .
columnName , columnname3 , . . .
ColumnFormat , columnformat7 , . . .
ColumnEditable , [ true true ] , . . .
CellEditCallback , { @table6 } ) ;
% --------------uipanel4 ----------------------h13 = uicontrol ( pn5 , Style , PushButton , . . .
String , Stope optimisation , Position , [ 3 0 640 100 5 0 ] , Callback ,
@pushbutton16 ) ;
h14 = uicontrol ( pn5 , Style , PushButton , . . .
String , load blockmodel , Position , [ 3 0 580 100 5 0 ] , Callback ,
@pushbutton15 ) ;
h15 = uicontrol ( pn5 , Style , PushButton , . . .
String , Zoom , Position , [ 3 0 520 50 5 0 ] , Callback , @pushbutton5 ) ;
h16 = uicontrol ( pn5 , Style , PushButton , . . .
String , Pan , Position , [ 3 0 460 50 5 0 ] , Callback , @pushbutton6 ) ;
h17 = uicontrol ( pn5 , Style , PushButton , . . .
String , Rotate 3d , Position , [ 3 0 400 50 5 0 ] , Callback ,
@pushbutton4 ) ;
h18 = uicontrol ( pn5 , Style , PushButton , . . .
String , add drives , Position , [ 3 0 340 100 5 0 ] , Callback ,
@pushbutton17 ) ;
h18 = uicontrol ( pn5 , Style , PushButton , . . .
String , add topografy , Position , [ 3 0 280 100 5 0 ] , Callback ,
@pushbutton18 ) ;
h19 = uicontrol ( pn5 , Style , PushButton , . . .
String , scheduler , Position , [ 3 0 220 100 5 0 ] , enable , on ,
Callback , @pushbutton19 ) ;
h20 = uicontrol ( pn5 , Style , checkbox , . . .
String , autorotate , Position , [ 4 0 10 100 5 0 ] , Callback , @checkbox6
);
h21 = uicontrol ( pn5 , Style , checkbox , . . .
String , topo visible , Position , [ 4 0 80 100 5 0 ] , Callback ,
Master of Science Thesis

J.J.Sens

64

204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231

232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

Matlab scripts

@checkbox7 ) ;
axis equal
grid on
ylabel ( north south )
xlabel ( east west )
set ( f , visible , on )
% --------------------end of GUI , start of functions
------------------------function pb33 ( ~ , ~ )
plotval ;
end
function workfile ( ~ , ~ )
wfile=get ( w1 , string ) ;
set ( t1 , string , [ workfile set to: , wfile ] ) ;
end
function uimenu16 ( ~ , ~ )
MNV5=origrotate ( MNV5 ) ;
cla
[ p5]= visualisestopes2 ( MNV5 , optfact , bh ) ;
set ( p5 , visible , on )
set ( t1 , string , done rotating )
end
function uimenu115 ( ~ , ~ )
[ removed , MNV5 ]= revenuecutoff ( MNV5 , inputdata , t1 ) ;
[ p5]= visualisestopes ( MNV5 , optfact , bh ) ;
set ( t1 , string , [ Min rev , num2str ( inputdata . dat { 6 , 1 } ) , ,
num2str ( removed ) , stopes removed ] )
end
function uimenu15 ( ~ , ~ )
k=figure ( Position , [ 3 1 0 50 400 2 0 0 ] , menubar , none ,
NumberTitle , off , resize , off , Name , GUI , renderer ,
opengl ) ;
h22 = uicontrol ( k , Style , edit , String , stope no , Position
, [ 1 0 60 200 3 0 ] ) ;
h23 = uicontrol ( k , Style , PushButton , String , remove stope ,
Position , [ 1 0 10 100 3 0 ] , Callback , @editMNV5 ) ;
function editMNV5 ( ~ , ~ )
a=get ( h22 , string ) ;
b=str2double ( a ) ;
cla ( bh )
found =0;
cont =1;
for n = 1 : 1 : size ( MNV5 , 1 ) % finding line of stope (b) in MNV5
if MNV5 ( n , 1 )==b ;
line=n ;
found =1;
end
end
if found~=1
disp ( no such stope )
cont =0;
end
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273

274
275

276
277
278
279
280
281
282
283
284
285
286
287
288

289
290
291
292
293
294
295
296

65

if cont~=0
for n = 1 : 1 : line1
MNV5b ( n , : ) =MNV5 ( n , : ) ;
end
for n=line + 1 : 1 : size ( MNV5 , 1 )
MNV5b ( n 1 , : )=MNV5 ( n , : ) ;
end
MNV5=MNV5b ;
[ p5]= visualisestopes ( MNV5 , optfact , bh ) ;
set ( p5 , visible , on )
set ( t1 , string , [ stope , num2str ( b ) , removed ] )
profit=sum ( MNV5 ( : , 8 ) ) ;
set ( t2 , string , [ Stope Revenue ; , num2str ( profit ) , $ ] )
save ( wfile , MNV5 , profit )
end
end
end
function pushbutton301 ( ~ , ~ )
save ( inputdata , inputdata )
set ( t1 , string , variables saved )
end
function uimenu14 ( ~ , ~ )
drivecost =num2cell ( drivecost ) ;
j = figure ( Position , [ 3 1 0 50 500 5 0 0 ] , menubar , none ,
NumberTitle , off , resize , off , Name , Edit stopes ,
renderer , opengl ) ;
profit=sum ( MNV5 ( : , 8 ) ) ;
tprof= uicontrol ( Parent , j , style , Text , position
, [ 1 0 , 3 0 , 2 0 0 , 2 0 ] , string , [ total profit from stopes : , num2str
( profit ) , $ ] ) ;
tb6 = uitable ( Parent , j , Units , normalized , Position , . . .
[ 0 . 0 1 0 . 6 6 0 . 4 0 . 2 ] , Data , drivecost , . . .
ColumnEditable , drive cost ) ;
end
function uimenu11 ( ~ , ~ )
surpacexport ( MNV5 , t1 )
end
function uimenu13 ( ~ , ~ )
cla
end
function uimenu12 ( ~ , ~ )
[ FileName , PathName ] = uiputfile ( .eps ) ;
i = figure ( Position , [ 2 1 0 150 700 7 0 0 ] , menubar , none ,
NumberTitle , off , resize , off , Name , save preview ,
renderer , opengl , color , white ) ;
%ch = axes(Parent ,i,Units ,pixels ,...
%Position ,[1 1 699 699]) ;
axesObject2=copyobj ( bh , i ) ;
set ( axesObject2 , Position , [ 2 0 20 660 6 6 0 ] ) ;
print ( i , -depsc , FileName ) ;
set ( i , visible , off )
end
function uimenu92 ( ~ , ~ )
Master of Science Thesis

J.J.Sens

66

Matlab scripts

[ FileName , PathName ] = uiputfile ( .jpg ) ;


i = figure ( Position , [ 2 1 0 150 700 7 0 0 ] , menubar , none ,
NumberTitle , off , resize , off , Name , save preview ,
renderer , opengl , color , white ) ;
%ch = axes(Parent ,i,Units ,pixels ,...
%Position ,[1 1 699 699]) ;
axesObject2=copyobj ( bh , i ) ;
set ( axesObject2 , Position , [ 2 0 20 660 6 6 0 ] ) ;
print ( i , -djpeg , FileName ) ;
set ( i , visible , off )

297
298

299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346

end
function checkbox7 ( hObject , ~ , ~)
axis equal
grid on
if ( get ( hObject , Value ) == get ( hObject , Max ) )
numel ( p8 )
for qr = 1 : 1 : numel ( p8 )
set ( p8{ qr } , Visible , On ) ;
end
% Checkbox is checked -take approriate action
else
for qr = 1 : 1 : numel ( p8 )
set ( p8{ qr } , Visible , Off ) ;
end
% Checkbox is not checked -take approriate action
end
end
function checkbox6 ( ~ , ~ )
spin=get ( h20 , Value ) ;
while spin==1;
camorbit ( 0 . 9 , 0 ) ;
spin=get ( h20 , Value ) ;
drawnow ;
end
end
function pushbutton21 ( ~ , ~ ) %ore pass optimisation and implementation
orepassadd ( f , t1 , inputdata . shaftdata , drives )
end
function pushbutton20 ( ~ , ~ ) % spiral creating
for rr = 1 : 1 : 2
for ss = 1 : 1 : size ( infrastrdata , 1 )
infrastrdata2 ( ss , rr )=infrastrdata {ss , rr } ;
end
end
[ X , Y , Z , cr , spiralcost , fail ]= spiralcreate ( f , t1 , SOREMA , infrastrdata2
, fact , spiralcost ) ;
if fail~=1
spiral2=spiral2 +1;
XS{ spiral2}=X ;
YS{ spiral2}=Y ;
ZS{ spiral2}=Z ;
save ( wfile , spiralcost , XS , YS , ZS )
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396

67

end
end
function pushbutton19 ( ~ , ~ ) % scheduling
scheduler ( MNV5 , fact , t1 , inputdata ) ;
end
function pushbutton18 ( ~ , ~ ) % adding of topografy
global topogr topogrfct
set ( t1 , string , adding topography )
[ x3 , y3 , z3 , m , topogr , topogrfct ]= topo ;
for n = 1 : 1 : m 1;
p8{n}=patch ( x3{n } , y3 {n } , z3 {n } , Blue ) ;
%p8= patch (x3{n},y3{n},z3{n},facecolor ,blue );
end
set ( t1 , string , topography added )
set ( h19 , enable , on )
view ( 3 ) ;
end
function pushbutton17 ( ~ , ~ )
global points pointsf X2 Y2 Z2 icost2
infrastrdata2=inputdata . infrastrdata ;
set ( t1 , string , constructing drives )
[ p7 , points , pointsf , X2 , Y2 , Z2 , icost2 , drivecost , dr1 , dr2 ]=
driveconnection ( MNV5 , infrastrdata2 , SOREMA , fact ) ;
totdrivecost=sum ( drivecost ) ;
set ( t3 , string , [ Add. Cost: , num2str ( totdrivecost ) , $ ] ) ;
totprofit=profittotdrivecost ;
set ( t4 , string , [ Tot. profit , num2str ( totprofit ) , $ ] ) ;
end
function pushbutton16 ( ~ , ~ ) % stope optimisation button
global p5
plot =1;
[ p5 , MNV5 , optfact , ending ]= stopeopt ( OREMA , fact , bh , inputdata , plot , t1
);
if ending ~=1
q=size ( MNV5 ) ;
profit=sum ( MNV5 ( : , 8 ) ) ;
set ( t2 , string , [ Stope Revenue ; , num2str ( profit ) , $ ] )
for nt = 1 : 1 : q
set ( p5 ( nt ) , visible , on ) ;
end
end
end
function pushbutton15 ( ~ , ~ ) % converting of blockmodel
[ filename , pathname ] = uigetfile ( C:\ , pick the converted block
model , *. blm ) ;
directory = fullfile ( pathname , filename ) ;
if filename ~= 0
load ( filename , -mat )
struct=open ( directory ) ;
OREMA=struct . OREMA ;
SOREMA=struct . SOREMA ;
fact=struct . fact ;
t6 = uicontrol ( pn5 , Style , text , String , filename , . . .
Master of Science Thesis

J.J.Sens

68

Matlab scripts

Position , [ 2 0 , 4 5 , 1 5 0 , 1 5 ] ) ;
end
if filename == 0
t7 = uicontrol ( Style , text , String , no file selected , . . .
Position , [ 1 0 , 1 0 , 1 0 0 , 1 5 ] ) ;
end

397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445

end
function pushbutton10 ( ~ , ~ )
[ filename , pathname ] = uigetfile ( C:\ , pick the block model , *.
csv ) ;
directory = fullfile ( pathname , filename ) ;
if filename ~= 0
a = importdata ( directory ) ;
g=figure ( Visible , on , Position , [ 1 0 0 , 2 0 0 , 4 5 0 , 3 5 0 ] , name ,
Stope optimiser ) ;
hxtext = uicontrol ( Style , text , String , filename , . . .
Position , [ 2 0 0 , 5 0 , 2 0 0 , 1 5 ] ) ;
end
if filename == 0
h=figure ( Visible , on , Position , [ 1 0 0 , 2 0 0 , 1 1 0 , 2 5 ] , name ,
Stope optimiser ) ;
hxtext = uicontrol ( Style , text , String , no file selected
,...
Position , [ 1 0 , 1 0 , 1 0 0 , 1 5 ] ) ;
end
end
function table1 ( ~ , ~ )
inputdata . dat = get ( tb1 , Data ) ;
end
function table2 ( ~ , ~ )
inputdata . schedule = get ( tb2 , Data ) ;
end
function table3 ( ~ , ~ )
inputdata . infrastrdata = get ( tb3 , Data ) ;
end
function table4 ( ~ , ~ )
inputdata . stopedimdata = get ( tb4 , Data ) ;
end
function table5 ( ~ , ~ )
inputdata . antingparam = get ( tb5 , Data ) ;
end
function table6 ( ~ , ~ )
inputdata . shaftdata = get ( tb6 , Data ) ;
end
function pushbutton8 ( ~ , ~ )
set ( pn1 , visible , on )
set ( pn2 , visible , off )
set ( pn3 , visible , off )
set ( pn5 , visible , off )
end
function pushbutton9 ( ~ , ~ )
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490

491
492

69

set ( pn1 , visible , off )


set ( pn2 , visible , on )
set ( pn3 , visible , off )
set ( pn5 , visible , off )
end
function pushbutton12 ( ~ , ~ )
set ( pn1 , visible , off )
set ( pn2 , visible , off )
set ( pn3 , visible , on )
set ( pn5 , visible , off )
end
function pushbutton14 ( ~ , ~ )
set ( pn1 , visible , off )
set ( pn2 , visible , off )
set ( pn3 , visible , off )
set ( pn5 , visible , on )
end
function uimenu2 ( ~ , ~ )
g = figure ( Position , [ 2 0 0 200 400 4 0 0 ] , menubar , none ,
NumberTitle , off , resize , off , Name , About ) ;
t1 = uicontrol ( g , Style , text , String , Created by Jeroen Sens
, Position , [ 3 0 250 200 3 0 ] ) ;
ai = axes ( Parent , g , Units , pixels , . . .
Position , [ 3 0 30 80 7 0 ] ) ;
rgb = imread ( 1. jpg ) ;
image ( rgb )
axis off
end
function uimenu3 ( ~ , ~ ) % loading of file
global p2 p3 p4 Xnp Ynp Znp antlocp
[ filename , pathname ] = uigetfile ( C:\ , file , *. mat ) ;
directory = fullfile ( pathname , filename ) ;
if filename ~= 0
file = importdata ( directory ) ;
Xnp=file { 1 } ;
Ynp=file { 2 } ;
Znp=file { 3 } ;
antlocp=file { 4 } ;
SE3=file { 5 } ;
set ( t1 , string , file loaded )
[ ~ , b]= size ( Xnp ) ;
for v = 1 : 1 : b
grid on
hold on
p2 {v}=plot3 ( SE3 {v } ( 1 , : ) , SE3 {v } ( 2 , : ) , SE3 {v } ( 3 , : ) , Marker ,
o , Linestyle , - , Color , red , visible , on ) ;
p3{v}=plot3 ( Xnp {v } , Ynp {v } , Znp {v } , Marker , * , linestyle
, none , visible , on ) ;
p4{v}=plot3 ( antlocp {v } ( : , 1 ) , antlocp {v } ( : , 2 ) , antlocp {v
} ( : , 3 ) , Marker , none , color , red , linewidth , 4 ,
visible , on ) ;
end
end
Master of Science Thesis

J.J.Sens

70

493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544

Matlab scripts

if filename == 0
set ( t1 , string , no file selected )
end
end
function uimenu5 ( ~ , ~ ) % savind drives
global X2 Y2 Z2 points pointsf icost2
file{1}=X2 ;
file{2}=Y2 ;
file{3}=Z2 ;
file{4}=points ;
file{5}=pointsf ;
file{6}=icost2 ;
file{7}=drivecost ;
[ file2 , path ] = uiputfile ( *. drv , Save drives as; ) ;
save ( file2 , file )
end
function uimenu17 ( ~ , ~ ) % saving infrastructure
global X2 Y2 Z2 points pointsf icost2
file{1}=X2 ;
file{2}=Y2 ;
file{3}=Z2 ;
file{4}=points ;
file{5}=pointsf ;
file{6}=icost2 ;
file{7}=drivecost ;
file{8}=XS ;
file{9}=YS ;
file{10}=ZS ;
file{11}= spiralcost ;
end
function uimenu18 ( ~ , ~ )
global p11
[ p11 , drivecost ]= loadinfrastr ( bh ) ;
end
function uimenu6 ( ~ , ~ )
global p11
[ p11 , drives ]= loaddrives ( bh ) ;
end
function uimenu7 ( ~ , ~ )
[ file , path ] = uiputfile ( *. stp , Save Workspace As ) ;
save ( file , MNV5 , optfact , OREMA , SOREMA , fact , profit )
end
function uimenu10 ( ~ , ~ )
[ filename , pathname ] = uigetfile ( C:\ , get rockmechfile , *. mat )
;
directory = fullfile ( pathname , filename ) ;
if filename ~= 0
[ data ]= importdata ( directory ) ;
data=struct2cell ( data ) ;
SOREMA=data { 3 , 1 } ;
fact=data { 2 , 1 } ;
end
end
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596

71

function uimenu9 ( ~ , ~ )
export ( MNV5 , t1 )
end
function uimenu8 ( ~ , ~ )
[ filename , pathname ] = uigetfile ( C:\ , file , *. stp ) ;
directory = fullfile ( pathname , filename ) ;
if filename ~= 0
[ data ]= importdata ( directory ) ;
end
MNV5=data . MNV5 ;
optfact=data . optfact ;
OREMA=data . OREMA ;
SOREMA=data . SOREMA ;
profit=data . profit ;
fact=data . fact ;
[ p5]= visualisestopes ( MNV5 , optfact , bh ) ;
set ( p5 , visible , on ) ;
end
function uimenu1 ( ~ , ~ )
global Xnp Ynp Znp antlocp SE3
file{1}=Xnp ;
file{2}=Ynp ;
file{3}=Znp ;
file{4}=antlocp ;
file{5}=SE3 ;
uisave ( { file } , project )
end
function uimenu4 ( ~ , ~ )
open ( help.pdf )
end
function pushbutton1 ( ~ , ~ )
[ SE2 ]= locsel ( t1 , f ) ;
loaded =1;
try
temp=size ( SE2 , 1 ) ;
catch ME
loaded =0;
end
if loaded==0
set ( t1 , string , NO WORKDATA PRESENT )
else
t=0;
set ( t1 , string , calculating )
drawnow
for rr = 1 : 1 : 2
for ss = 1 : 1 : size ( infrastrdata , 1 )
infrastrdata2 ( ss , rr )=infrastrdata {ss , rr } ;
end
end
pointsdata=SE2 ;
[ Xnp , Ynp , Znp , antlocp , SE3 , X1 , Y1 , Z1 , C1 , no2 , spec1 ]=
Routegenerator ( pointsdata , t1 , infrastrdata2 ) ;
Master of Science Thesis

J.J.Sens

72

Matlab scripts

[ ~ , b]= size ( Xnp ) ;


save ( finalroute .mat , X1 , Y1 , Z1 , C1 , antlocp )
for v = 1 : 1 : b
for route = 1 : 1 : no2
p1{v }{ route}=plot3 ( X1 { route } , Y1{ route } , Z1 { route } ,
visible , off ) ; % random routes
end
p2{v}=plot3 ( SE3 {v } ( 1 , : ) , SE3 {v } ( 2 , : ) , SE3 {v } ( 3 , : ) , Marker ,
o , Linestyle , - , Color , red , visible , off ) ; %
connction line
p4{v}=plot3 ( antlocp {v } ( : , 1 ) , antlocp {v } ( : , 2 ) , antlocp {v
} ( : , 3 ) , Marker , none , color , red , linewidth , 4 ,
visible , on ) ; %ant solution
p3{v}=plot3 ( Xnp {v } , Ynp {v } , Znp {v } , Marker , * , linestyle
, none , visible , off ) ; % nodes
set ( c2 , value , 1 ) ; set ( c3 , value , 1 ) ; set ( c4 , value , 1 ) ;
set ( t1 , string , done )
axis equal
end

597
598
599
600
601
602
603

604

605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643

end
end
function checkbox1 ( hObject , ~ , ~)
global p1
axis equal
grid on
if ( get ( hObject , Value ) == get ( hObject , Max ) )
for qr = 1 : 1 : numel ( p1 )
for qt = 1 : 1 : numel ( p1 {qr } )
set ( p1{ qr }{ qt } , Visible , On ) ;
end
end
% Checkbox is checked -take approriate action
else
for qr = 1 : 1 : numel ( p1 )
for qt = 1 : 1 : numel ( p1 {qr } )
set ( p1{ qr }{ qt } , Visible , Off ) ;
end
end
% Checkbox is not checked -take approriate action
end
end
function checkbox2 ( hObject , ~ , ~)
global p3
axis equal
grid on
if ( get ( hObject , Value ) == get ( hObject , Max ) )
for qr = 1 : 1 : numel ( p3 )
set ( p3{ qr } , Visible , On ) ;
end
% Checkbox is checked -take approriate action
else
for qr = 1 : 1 : numel ( p3 )
J.J.Sens

Master of Science Thesis

10-3 Graphic user interfacer

644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696

73

set ( p3{ qr } , Visible , off ) ;


end
% Checkbox is not checked -take approriate action
end
end
function checkbox3 ( hObject , ~ , ~)
global p2
axis equal
grid on
if ( get ( hObject , Value ) == get ( hObject , Max ) )
for qr = 1 : 1 : numel ( p2 )
set ( p2{ qr } , Visible , On ) ;
end
% Checkbox is checked -take approriate action
else
for qr = 1 : 1 : numel ( p2 )
set ( p2{ qr } , Visible , Off ) ;
end
% Checkbox is not checked -take approriate action
end
end
function checkbox4 ( hObject , ~ , ~)
global p4
axis equal
grid on
if ( get ( hObject , Value ) == get ( hObject , Max ) )
for qr = 1 : 1 : numel ( p4 )
set ( p4{ qr } , Visible , On ) ;
end
% Checkbox is checked -take approriate action
else
for qr = 1 : 1 : numel ( p4 )
set ( p4{ qr } , Visible , Off ) ;
end
% Checkbox is not checked -take approriate action
end
end
function checkbox5 ( hObject , ~ , ~)
global p6
axis equal
grid on
q=size ( MNV5 ) ;
if ( get ( hObject , Value ) == get ( hObject , Max ) )
for nt = 1 : 1 : q
set ( p6 ( nt ) , visible , on ) ;
end
else
for nt = 1 : 1 : q
set ( p6 ( nt ) , visible , off ) ;
end
end
end
function pushbutton4 ( ~ , ~ )
Master of Science Thesis

J.J.Sens

74

rotate3d
end
function pushbutton5 ( ~ , ~ )
zoom
end
function pushbutton6 ( ~ , ~ )
pan
end
function pushbutton7 ( ~ , ~ )
SE2=load ( workf .mat ) ;
set ( t1 , string , loaded )
pointsloaded =1;
pointsdata=struct2cell ( SE2 ) ;
pointsdata=pointsdata { 1 } ;
set ( tb4 , data , pointsdata { 1 } )
set ( sl1 , max , numel ( pointsdata ) , SliderStep , [ 1 / ( numel ( pointsdata
) 1) 0 . 2 ] )
end
function pushbutton3 ( ~ , ~ )
display Goodbye
close ( gcbf )
close all
end
function slider1 ( ~ , ~ )
if pointsloaded ~=0;
SEno=get ( sl1 , value ) ;
set ( tb4 , data , pointsdata { SEno } ) ;
end
end

697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725

Matlab scripts

end

10-4
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Drives to Surpac Exporter

function surpacexport ( MNV5 , t1 )


MNV6=MNV5 ;
MNV6 ( : , 2 )=MNV5 ( : , 3 ) ;
MNV6 ( : , 3 )=MNV5 ( : , 2 ) ;
MNV5=MNV6 ;
m=1;
load ( vis ) ;
for n = 1 : 1 : size ( x , 2 )
stp ( m , 1 ) =1; stp ( m , 2 )=x{n } ( 1 , 1 ) ; stp ( m , 3 )=y{n } ( 1 , 1 ) ; stp ( m , 4 )=z{n } ( 1 , 1 ) ;
stp ( m +1 ,1) =1; stp ( m +1 ,2)=x{n } ( 2 , 1 ) ; stp ( m +1 ,3)=y{n } ( 2 , 1 ) ; stp ( m +1 ,4)=z{n
}(1 ,1) ;
stp ( m +2 ,1) =1; stp ( m +2 ,2)=x{n } ( 3 , 1 ) ; stp ( m +2 ,3)=y{n } ( 3 , 1 ) ; stp ( m +2 ,4)=z{n
}(1 ,1) ;
stp ( m +3 ,1) =1; stp ( m +3 ,2)=x{n } ( 4 , 1 ) ; stp ( m +3 ,3)=y{n } ( 4 , 1 ) ; stp ( m +3 ,4)=z{n
}(1 ,1) ;
stp ( m +4 ,1) =1; stp ( m +4 ,2)=x{n } ( 1 , 1 ) ; stp ( m +4 ,3)=y{n } ( 1 , 1 ) ; stp ( m +4 ,4)=z{n
}(3 ,2) ;
stp ( m +5 ,1) =1; stp ( m +5 ,2)=x{n } ( 2 , 1 ) ; stp ( m +5 ,3)=y{n } ( 2 , 1 ) ; stp ( m +5 ,4)=z{n
}(3 ,2) ;
J.J.Sens

Master of Science Thesis

10-4 Drives to Surpac Exporter

15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

75

stp ( m +6 ,1) =1; stp ( m +6 ,2)=x{n } ( 3 , 1 ) ; stp ( m +6 ,3)=y{n } ( 3 , 1 ) ; stp ( m +6 ,4)=z{n


}(3 ,2) ;
stp ( m +7 ,1) =1; stp ( m +7 ,2)=x{n } ( 4 , 1 ) ; stp ( m +7 ,3)=y{n } ( 4 , 1 ) ; stp ( m +7 ,4)=z{n
}(3 ,2) ;
stp ( m +8 ,1) =0; stp ( m +8 ,2) =0; stp ( m +8 ,3) =0; stp ( m +8 ,4) =0;
m=m+9;
end
stp3=stp ;
stp ( : , 2 )=stp3 ( : , 3 ) ;
stp ( : , 3 )=stp3 ( : , 2 ) ;
fid = fopen ( stopes .str , w ) ;
string=stopes 22-jul -11 ;
fprintf ( fid , %s\r\n , string ) ;
string=0 ,1.9627864817516073 e+290 ,
0.000 ,
0.000 ,
0.000 ,
0.000 ,
0.000 ;
fprintf ( fid , %s\r\n , string ) ;
dlmwrite ( stopes .str , stp , -append , delimiter , , ) ;
dlmwrite ( stopes .str , END , -append , delimiter , ) ;
fid = fopen ( stopes .dtm , w ) ;
string=stopes .str ;
fprintf ( fid , %s\r\n , string ) ;
string=0, 0.000 , 0.000 , 0.000 , END ;
fprintf ( fid , %s\r\n , string ) ;
string=OBJECT , 1, ;
fprintf ( fid , %s\r\n , string ) ;
string=TRISOLATION , 1, neighbours =yes , validated = FALSE ;
fprintf ( fid , %s\r\n , string ) ;
m=1;
o=1;
p=1;
for n = 1 : 1 : size ( MNV5 , 1 )
tri ( p , 1 )=o ; tri ( p , 2 )=m ;
tri ( p , 3 )=m+1;
tri ( p , 4 )=m+2; tri ( p , 5 ) =0;
tri ( p , 6 ) =0; tri ( p , 7 ) =0;
fprintf ( fid , %d, , tri ( p , : ) ) ;
fprintf ( fid , %s\r\n , ) ;
tri ( p +1 ,1)=o+1; tri ( p +1 ,2)=m ;
tri ( p +1 ,3)=m+2;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+3;

tri ( p +1 ,1)=o+2; tri ( p +1 ,2)=m ;


tri ( p +1 ,3)=m+3;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+4;

tri ( p +1 ,1)=o+3; tri ( p +1 ,2)=m+3;


tri ( p +1 ,3)=m+4;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+7;

tri ( p +1 ,1)=o+4; tri ( p +1 ,2)=m+2;

tri ( p +1 ,4)=m+7;

Master of Science Thesis

tri ( p +1 ,3)=m+3;

J.J.Sens

76

61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

Matlab scripts

tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;


fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;
tri ( p +1 ,1)=o+5; tri ( p +1 ,2)=m+2;
tri ( p +1 ,3)=m+7;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+6;

tri ( p +1 ,1)=o+6; tri ( p +1 ,2)=m+1;


tri ( p +1 ,3)=m+2;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+6;

tri ( p +1 ,1)=o+7; tri ( p +1 ,2)=m+1;


tri ( p +1 ,3)=m+5;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+6;

tri ( p +1 ,1)=o+8; tri ( p +1 ,2)=m ;


tri ( p +1 ,3)=m+1;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+5;

tri ( p +1 ,1)=o+9; tri ( p +1 ,2)=m ;


tri ( p +1 ,3)=m+4;
tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m+5;

tri ( p , 1 )=o +10; tri ( p , 2 )=m+4;


tri ( p , 3 )=m+5;
, 5 ) =0; tri ( p , 6 ) =0; tri ( p , 7 ) =0;
fprintf ( fid , %d, , tri ( p , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,1)=o +11; tri ( p +1 ,2)=m+4;


tri ( p +1 ,3)=m+6;
+7; tri ( p +1 ,5) =0; tri ( p +1 ,6) =0; tri ( p +1 ,7) =0;
fprintf ( fid , %d, , tri ( p + 1 , : ) ) ;
fprintf ( fid , %s\r\n , ) ;

tri ( p +1 ,4)=m

m=m+9;
o=o +12;
p=p+1;
end
fprintf ( fid , %s\r\n , END ) ;
fclose ( fid ) ;
set ( t1 , string , done exporting )
end

10-5
1
2

tri ( p , 4 )=m+6; tri ( p

Block Model Converter

function blockconverter
[ filename , pathname ] = uigetfile ( C:\ , pick the block model , *. csv ) ;
J.J.Sens

Master of Science Thesis

10-5 Block Model Converter

3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

77

directory = fullfile ( pathname , filename ) ;


if filename ~= 0
a = importdata ( directory ) ;
end
if filename == 0
disp ( no file selected )
end
% --------------- setting standard values -----------------------f =15;
g =15;
h =15;
X =15;
Y =15;
Z =15;
fact =0;
perc2=1;
% ----------------block converter actions ------------------------------F=X ;
G=Y ;
H=Z ;
m=1;
fact ( 1 , 1 )=X ;
fact ( 1 , 2 )=Y ;
fact ( 1 , 3 )=Z ;
% ------------------------------------------------------------------minim=min ( a ) ;
maxim=max ( a ) ;
fact ( 1 , 4 )= minim ( 1 , 1 ) ;
fact ( 1 , 5 )= minim ( 1 , 2 ) ;
fact ( 1 , 6 )= minim ( 1 , 3 ) ;
dx=maxim ( 1 , 1 )minim ( 1 , 1 ) ;
dy=maxim ( 1 , 2 )minim ( 1 , 2 ) ;
dz=maxim ( 1 , 3 )minim ( 1 , 3 ) ;
i=round ( dx /X ) +1;
j=round ( dy /Y ) +1;
k=round ( dz /Z ) +1;
total=ijk ;
for I = 1 : 1 : i
x = minim ( 1 , 1 )+IX ;
for J = 1 : 1 : j
y = minim ( 1 , 2 )+JY ;
for K = 1 : 1 : k
z = minim ( 1 , 3 )+KZ ;
[ ORE , WEIGHT , PERC ] = Stopedeterminer2 ( a , x , y , z , f , g , h , F , G , H , a ) ;
OREMA ( I , J , K ) = ORE ;
TAG ( I , J , K ) = 1 ;
m=m+1;
perc=round ( ( ( m/ total ) 1 0 0 ) ) ;
if perc~=perc2
perc2=perc ;
disp ( perc2 )
end

Master of Science Thesis

J.J.Sens

78

56
57
58
59
60
61

Matlab scripts

end
end
end
SOREMA=ones ( size ( OREMA , 1 ) , size ( OREMA , 2 ) , size ( OREMA , 3 ) ) ;
uisave ( { OREMA , SOREMA , fact } , newblockmodel )
end

10-6
1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

Corner Section Creator

function [ X , Y , Z , C , spec , dirspec , n , icost ] = corner ( cornerdet , radius , xd , yd ,


grade , j , n , X , Y , Z , C , spec , dirspec , ud , icost , infrastrdata , SOREMA , fact , zdif ,
rotations )
cornercost=infrastrdata ( 4 , 1 ) ;
boltrockstrenth=infrastrdata ( 1 4 , 1 ) ;
meshrockstrenth=infrastrdata ( 1 5 , 1 ) ;
color =1;
boltcost =0;
meshcost =0;
Xn=ceil ( ( X ( n )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) ) +1;
Yn=ceil ( ( Y ( n )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) ) +1;
Zn=ceil ( ( Z ( n )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) ) +1;
if Xn<1 | | Xn>size ( SOREMA , 1 ) | | Yn<1 | | Yn>size ( SOREMA , 2 ) | | Zn<1 | | Zn>
size ( SOREMA , 3 )
rockstrength =1;
else
rockstrength=SOREMA ( Xn , Yn , Zn ) ;
end
if rockstrength<boltrockstrenth
boltcost=infrastrdata ( 5 , 1 ) ;
color =2;
end
if rockstrength<meshrockstrenth
meshcost=infrastrdata ( 6 , 1 ) ;
color =3;
end
if j==1;
% corner north to east
cp=xd radius+X ( n ) ;
for v = 1 : 1 : cornerdet
icost ( n+v ) =((( pi ( ) radius ) / 4 ) / cornerdet ) cornercost ;
X ( n+v )=X ( n )+xd ( radius / cornerdet ) v ;
Y ( n+v )=Y ( n )+yd sqrt ( abs ( radius ^2 ((cpX ( n+v ) ) . ^ 2 ) ) ) ;
Z ( n+v ) =(Z ( n ) +(ud ( zdif / rotations ) / cornerdet ) v ) ;
C ( n+1)=color ;
spec ( n+v ) =0;
dirspec ( n+v ) =0;
end
n=numel ( X ) ;
spec ( n ) =2;
end
if j==1;
% corner south to west
J.J.Sens

Master of Science Thesis

10-7 Straight Section Creator

cp=yd radius+Y ( n ) ;
for v = 1 : 1 : cornerdet
icost ( n+v ) =((( pi ( ) radius ) / 4 ) ) cornercost ;
Y ( n+v )=Y ( n )+yd ( radius / cornerdet ) v ;
X ( n+v )=X ( n )+xd sqrt ( abs ( radius ^2 ((cpY ( n+v ) ) . ^ 2 ) ) ) ;
Z ( n+v ) =(Z ( n ) +(ud ( zdif / rotations ) / cornerdet ) v ) ;
C ( n+1)=color ;
spec ( n+v ) =0;
dirspec ( n+v ) =0;
end
n=numel ( X ) ;
spec ( n ) =3;

41
42
43
44
45
46
47
48
49
50
51
52
53
54

end
end

10-7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

79

Straight Section Creator

function [ X , Y , Z , C , spec , dirspec , n , icost ]= straight ( direction , dist , grade , n , X


, Y , Z , C , spec , dirspec , ud , icost , infrastrdata , SOREMA , fact )
strcost=infrastrdata { 3 , 1 } ;
boltrockstrenth=infrastrdata { 1 4 , 1 } ;
meshrockstrenth=infrastrdata { 1 5 , 1 } ;
color =1;
boltcost =0;
meshcost =0;
Xn=ceil ( ( X ( n )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) ) +1;
Yn=ceil ( ( Y ( n )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) ) +1;
Zn=ceil ( ( Z ( n )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) ) +1;
%when outside blockmodel choose standard rockstrength
if Xn<1 | | Xn>size ( SOREMA , 1 ) | | Yn<1 | | Yn>size ( SOREMA , 2 ) | | Zn<1 | | Zn>
size ( SOREMA , 3 )
rockstrength =1;
else
rockstrength=SOREMA ( Xn , Yn , Zn ) ;
end
if rockstrength<boltrockstrenth
boltcost=infrastrdata ( 5 , 1 ) ;
color =2;
end
if rockstrength<meshrockstrenth
meshcost=infrastrdata ( 6 , 1 ) ;
color =3;
end
if direction==1
X ( n+1)=X ( n ) ;
Y ( n+1)=Y ( n )+dist ;
Z ( n+1)=Z ( n )+ud grade dist ;
C ( n+1)=color ;
spec ( n+1)=1;
icost ( n+1)=sqrt ( dist^2+(grade dist ) ^2) ( strcost+boltcost+meshcost ) ;
end
if direction==2
Master of Science Thesis

J.J.Sens

80

34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

Matlab scripts

X ( n+1)=X ( n )+dist ;
Y ( n+1)=Y ( n ) ;
Z ( n+1)=Z ( n )+ud grade dist ;
C ( n+1)=color ;
spec ( n+1)=1;
icost ( n+1)=sqrt ( dist^2+(grade dist ) ^2) ( strcost+boltcost+meshcost ) ;
end
if direction==3
X ( n+1)=X ( n ) ;
Y ( n+1)=Y ( n )dist ;
Z ( n+1)=Z ( n )+ud grade dist ;
C ( n+1)=color ;
spec ( n+1)=1;
icost ( n+1)=sqrt ( dist^2+(grade dist ) ^2) ( strcost+boltcost+meshcost ) ;
end
if direction==4
X ( n+1)=X ( n )dist ;
Y ( n+1)=Y ( n ) ;
Z ( n+1)=Z ( n )+ud grade dist ;
C ( n+1)=color ;
spec ( n+1)=1;
icost ( n+1)=sqrt ( dist^2+(grade dist ) ^2) ( strcost+boltcost+meshcost ) ;
end
dirspec ( n+1)=direction ;
n=n+1;
end

10-8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

Stope Production Scheduler

function scheduler ( MNV5 , fact , t1 , inputdata )


initialinvestment =50000000;
startupcost=inputdata . dat { 3 , 1 } ;
backfillcost=inputdata . dat { 4 , 1 } 3 0 3 0 6 0 ; % backfill cost $/m^3
load ( tags.tag , -MAT )
npvon =1;
if npvon==1
chs2 =16;
set ( t1 , string , NPV based optimisation )
drawnow
end
discountrate=inputdata . schedule { 5 , 1 } ; % discount rate
startuptime=inputdata . schedule { 4 , 1 } ; % stope startup time in days
miningrate = 0 . 0 2 5 / 1 0 0 0 ; % stope mining rate in months per 1000m^3/m^2(
surface )
minpillar =1; %min no of stopes needed between stopes in production
desprodrate=inputdata . schedule { 1 , 1 } ; % desired production rate in tonnes
per month
MNV4=MNV5 ;
MNV5 ( : , 1 6 ) =0;
MNV4 ( : , 1 6 ) =1;
set ( t1 , string , Scheduling )
J.J.Sens

Master of Science Thesis

10-8 Stope Production Scheduler

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

51
52
53

54
55
56

81

drawnow
day =1; numbre =1;n=1; Profit =0; NPVTOT =0;
q=size ( MNV4 ) ;
schedule5 ( 1 , 1 )=initialinvestment ;
while numbre < q ( 1 ) +1
estday=day+round ( startuptime ) ;
schedule1 ( 1 , estday ) =0;
estprod = sum ( schedule1 ( : , estday ) ) ;
if estprod < desprodrate
% finding all possible stopes that can be incorporated
clear list
list ( 1 , 1 6 ) =0;
q=size ( MNV4 ) ;
no =1;
tunn =0;
for r = 1 : 1 : q ( 1 )
% finding stope making possible list
tunn=tunn +1;
chk2 =1;
if MNV4 ( r , chs2 )~=0
chk2 =0;
if estprod + MNV4 ( r , 1 5 ) > desprodrate
chk2 =1;
end
% checking if Tagged blocks in area
for i1 = 1 : 1 : MNV4 ( r , 5 ) / fact ( 1 , 1 ) ;
for j1 = 1 : 1 : MNV4 ( r , 6 ) / fact ( 1 , 1 ) ;
for k1 = 1 : 1 : MNV4 ( r , 7 ) / fact ( 1 , 1 ) ;
if TAGS ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+i1
, ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1 , ( (
MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 )>= day
&& TAGS ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+
i1 , ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1 , ( (
MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 ) < day+
MNV4 ( r , 1 0 )
chk2 =1;
end
if TAGE ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+i1
, ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1 , ( (
MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 )> day
&& TAGE ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+
i1 , ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1 , ( (
MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 ) <= day
+MNV4 ( r , 1 0 )
chk2 =1;
end
if TAGE ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+i1
, ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1 , ( (
MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 )>= day+
MNV4 ( r , 1 0 ) && TAGS ( ( ( MNV4 ( r , 2 )fact ( 1 , 4 ) ) /
fact ( 1 , 1 ) )+i1 , ( ( MNV4 ( r , 3 )fact ( 1 , 5 ) ) / fact
( 1 , 2 ) )+j1 , ( ( MNV4 ( r , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 )
)+k1 ) <= day
Master of Science Thesis

J.J.Sens

82

Matlab scripts

chk2 =1;

57
58
59
60

end
end
end
end

61
62
63
64
65
66

end
% in case block is not timetagged and feasable chk2 ~=1
if chk2 ~= 1
list ( no , : ) =MNV4 ( r , : ) ;
no=no +1;
end

67
68
69
70
71
72

end
if max ( list )==0
day=day +1;
end
if max ( list ( : , 1 6 ) )~=0
% --------------------- choosing a stope
----------------------a=max ( list ( : , 8 ) ) ;
% incorporate stope
for p = 1 : 1 : q ( 1 )
if MNV4 ( p , 8 )== a
MNV5 ( n , : ) =MNV4 ( p , : ) ;
MNV4 ( p , chs2 ) =0;
Profit=Profit+MNV5 ( n , 8 ) ;
% -----------Time Tagging used blocks
----------------------for i1=1minpillar : 1 : MNV4 ( p , 5 ) / fact ( 1 , 1 )+minpillar ;
for j1=1minpillar : 1 : MNV4 ( p , 6 ) / fact ( 1 , 2 )+
minpillar ;
for k1=1minpillar : 1 : MNV4 ( p , 7 ) / fact ( 1 , 3 )+
minpillar ;
TAGS ( ( ( MNV4 ( p , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+i1
, ( ( MNV4 ( p , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1
, ( ( MNV4 ( p , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 )
=day ;
TAGE ( ( ( MNV4 ( p , 2 )fact ( 1 , 4 ) ) / fact ( 1 , 1 ) )+i1
, ( ( MNV4 ( p , 3 )fact ( 1 , 5 ) ) / fact ( 1 , 2 ) )+j1
, ( ( MNV4 ( p , 4 )fact ( 1 , 6 ) ) / fact ( 1 , 3 ) )+k1 )
=day+MNV4 ( p , 1 0 ) ;
end
end
end
% schedule1 production on day % schedule2 stope in
production on day
% schedule3 action in stope % schedule4 revenue in day
%inc startuptime
for days = 1 : 1 : MNV4 ( p , 1 2 )
schedule3 ( numbre , days+day ) =1;
schedule5 ( numbre , days+day )=startupcost / ( MNV4 ( p
,12) ) ;
end

73
74
75
76
77
78
79
80
81
82
83
84
85
86

87

88
89
90
91
92
93
94
95
96
97

J.J.Sens

Master of Science Thesis

10-9 Stope Visualiser

83

%incl prod time


for days=MNV4 ( p , 1 2 ) : 1 : MNV4 ( p , 1 2 )+MNV4 ( p , 1 3 )
schedule3 ( numbre , days+day ) =2;
schedule1 ( numbre , days+day )=MNV4 ( p , 1 5 ) ;
schedule4 ( numbre , days+day )=MNV4 ( p , 8 ) / MNV4 ( p , 1 3 ) ;
schedule5 ( numbre , days+day )=MNV4 ( p , 8 ) / MNV4 ( p , 1 3 )+
startupcost / ( MNV4 ( p , 1 2 ) )+backfillcost / ( MNV4 ( p
,14) ) ;
end
%incl backfill time
for days=MNV4 ( p , 1 2 )+MNV4 ( p , 1 3 ) : 1 : MNV4 ( p , 1 2 )+MNV4 ( p
, 1 3 )+MNV4 ( p , 1 4 )
schedule3 ( numbre , days+day ) =3;
schedule5 ( numbre , days+day )=backfillcost / ( MNV4 ( p
,14) ) ;
end
for days = 1 : 1 : MNV4 ( p , 1 2 )+MNV4 ( p , 1 3 )+MNV4 ( p , 1 4 )
schedule2 ( numbre , days+day )=MNV4 ( p , 1 ) ;

98
99
100
101
102
103

104
105
106
107
108
109
110
111
112
113
114

end
numbre=numbre +1;
NPVTOT=NPVTOT+(MNV5 ( n , 8 ) /((1+ discountrate ) ^ ( ( size (
schedule3 , 2 ) / 3 1 ) / 1 2 ) ) ) ;
n=n+1;
set ( t1 , string , num2str ( n ) )
drawnow

115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

end
end
end
end
end
save ( Schedule .sch , schedule1 , schedule2 , schedule3 , schedule4 ,
schedule5 )
load ( schedule .sch , -MAT )
NPV1 ( schedule4 ) ;
NPV2 ( schedule5 ) ;
end

10-9
1
2
3
4
5
6
7
8
9

Stope Visualiser

function [ p5]= visualisestopes ( MNV5 , optfact , bh )


% -------------VISUALISER ---------------------------accdir =1;
angle=optfact ( 1 , 1 ) ; crownpillarheight=optfact ( 1 , 2 ) ; Profit=optfact ( 1 , 3 ) ;
nostopes =0;
light
grid on
colorbar
q=size ( MNV5 ) ;
Master of Science Thesis

J.J.Sens

84

10
11
12
13
14
15
16
17
18

19

20

21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

Matlab scripts

if angle ~=0
% visualising with undercut dir 1
if accdir==1
for n = 1 : 1 : q ( 1 )
if MNV5 ( n , 9 )==1
a=MNV5 ( n , : ) ;
c ( n )=MNV5 ( n , 8 ) ;
x ( n ) =[a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 )+a
( 5 ) a ( 2 )+a ( 5 ) ; a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 )
a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 )+a ( 5 ) ; a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a
( 2 ) a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 )+ a ( 5 ) a ( 2 ) a ( 2 )+a ( 5 ) ; a
( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 )
a ( 2 )+a ( 5 ) ] ;
y ( n ) =[a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) a ( 3 ) a ( 3 )+a
( 6 ) a ( 3 )+a ( 6 ) ; a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) a ( 3 )
+a ( 6 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 ) ; a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a
( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5
a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) ; a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a
( 3 )+a ( 6 ) a ( 3 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+a ( 6 )
];
z ( n ) =[a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 (
a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+a ( 7 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a
( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 )
) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) ; a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand (
angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+
a ( 7 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand (
angle ) ( . 5 ( a ( 5 ) ) ) ; a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )
+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) ; a ( 4 )+a ( 7 ) a ( 4 )+a
( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 ) a ( 4 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) ] ;
p5 ( n )=patch ( x ( n ) , y ( n ) , z ( n ) , c ( n ) , visible , off ) ;
Profit=Profit+MNV5 ( n , 8 ) ;
nostopes=nostopes +1;
end
end
end
end
% function visualise
if angle ~=0
% visualising with undercut dir 2
if accdir==2
for n = 1 : 1 : q ( 1 )
if MNV5 ( n , 9 )==1
a=MNV5 ( n , : ) ;
c ( n )=MNV5 ( n , 8 ) ;
x=[a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 )
a ( 2 )+a ( 5 ) ; a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 ) a
( 2 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 )+a ( 5 ) ; a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 )
a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 )+ a ( 5 ) a ( 2 ) a ( 2 )+a ( 5 ) ; a ( 2 )
J.J.Sens

Master of Science Thesis

10-9 Stope Visualiser

a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 ) a


( 2 )+a ( 5 ) ] ;
y=[a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 )
a ( 3 )+a ( 6 ) ; a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) a ( 3 )+a
( 6 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 ) ; a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 )
a ( 3 )+a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5 a
( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) ; a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 )
+a ( 6 ) a ( 3 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+ 0 . 5 a ( 6 ) a ( 3 )+a ( 6 ) ] ;
z=[a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a
( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+a ( 7 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a
( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 )
) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) ; a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand (
angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+
a ( 7 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) a ( 4 )+tand (
angle ) ( . 5 ( a ( 5 ) ) ) ; a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )
+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) ; a ( 4 )+a ( 7 ) a ( 4 )+a
( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+a ( 7 ) a ( 4 )+tand ( angle )
( . 5 ( a ( 5 ) ) ) a ( 4 ) a ( 4 ) a ( 4 )+tand ( angle ) ( . 5 ( a ( 5 ) ) ) ] ;
p5 ( n )=patch ( x ( n ) , y ( n ) , z ( n ) , c ( n ) , visible , off ) ;
Profit=Profit+MNV5 ( n , 8 ) ;
nostopes=nostopes +1;

37

38

39
40
41
42
43
44
45
46
47
48
49
50
51

52

53

54
55
56

85

end
end
end
end
if angle ==0
for n = 1 : 1 : q ( 1 )
if MNV5 ( n , 9 )==1
a=MNV5 ( n , : ) ;
c ( n )=MNV5 ( n , 8 ) ;
x{n}=[a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 ) ; a ( 2 )+a ( 5 ) a ( 2 )
+a ( 5 ) a ( 2 ) a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) ; a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a
( 2 ) a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) ; a ( 2 ) a ( 2 )+a ( 5 ) a ( 2 )+a ( 5 ) a
(2) a(2) a(2) ] ;
y{n}=[a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) ; a ( 3 ) a ( 3 )+a ( 6 )
a ( 3 )+a ( 6 ) a ( 3 ) a ( 3 ) a ( 3 ) ; a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 ) a
( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) ; a ( 3 ) a ( 3 ) a ( 3 )+a ( 6 ) a ( 3 )+a ( 6 ) a ( 3 )+a
( 6 ) a ( 3 )+a ( 6 ) ] ;
z{n}=[a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 )+a ( 7 )crownpillarheight ; a
( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 ) a ( 4 )+a ( 7 )crownpillarheight ; a ( 4 )+
a ( 7 )crownpillarheight a ( 4 )+a ( 7 )crownpillarheight a ( 4 )+a
( 7 )crownpillarheight a ( 4 )+a ( 7 )crownpillarheight a ( 4 ) a
( 4 )+a ( 7 )crownpillarheight ; a ( 4 )+a ( 7 )crownpillarheight a
( 4 )+a ( 7 )crownpillarheight a ( 4 )+a ( 7 )crownpillarheight a
( 4 )+a ( 7 )crownpillarheight a ( 4 ) a ( 4 )+a ( 7 )
crownpillarheight ] ;
pt ( n )=text ( a ( 2 ) +(0.5 a ( 5 ) ) , a ( 3 ) +(0.5 a ( 6 ) ) , a ( 4 )+a ( 7 )
crownpillarheight +4, num2str ( a ( 1 ) ) , parent , bh ) ;
p5 ( n )=patch ( x{n } , y{n } , z{n } , c ( n ) , visible , off , parent , bh ) ;
nostopes=nostopes +1;
Master of Science Thesis

J.J.Sens

86

57
58
59
60

Matlab scripts

end
end
end
end

J.J.Sens

Master of Science Thesis

You might also like