Professional Documents
Culture Documents
Project Report
cs-23-dat-1-p1-05
Aalborg University
Institute for Computer Science
Computer Science
Aalborg University
http://www.aau.dk
Title: Abstract:
P1 - Optimizing pathfinding
and terrain maneuverability Through an analysis of the problem of mine-
through minefields fields, the study concludes that the cost-
effectiveness of landmines for military use
Theme: presents a global challenge. This paper
Optimizing clearance and presents a proposal for a software solution in-
moveability in minefields tended to reduce the efficiency of landmines
by using Dijkstra’s pathfinding algorithm to
Project Period: find the optimal path through a minefield,
Fall Semester 2023 given certain conditions. The program devel-
oped includes dynamic world data in the form
Project Group: of bitmaps, such as mine probabilities, water
cs-23-dat-1-p1-05 depth and vegetation densities among other
factors, and produces a layered and config-
Participant(s): ured matrix to be used by the pathfinding al-
Andreas Lynnerup gorithm. The accuracy and reliability of our
Jesper Dahl Andersen proposed solution in the real world depend
Lukas Saltenis on the quantity and quality of data available.
Patrick Kaas Reiffenstein, Based on the assumption that a computer pro-
Rasmus Hende Svenson gram is more capable of consistently analyzing
Thomas Høy Bowman multiple data sources and thereby can predict
the location of mines and improve pathfinding
Supervisor(s):
faster than humans, we posit that our solution
Dennis Juhl Østergaard
mitigates the effectiveness of landmines, thus
Copies: 1 decreasing the consequences of their use.
Page Numbers: 75
Date of Completion:
December 20, 2023
The content of this report is freely available, but publication (with reference) may only be pursued due to
agreement with the author.
Contents
1 Introduction 1
2 Problem Analysis 2
2.1 Mines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2.1.1 Types of Mines . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1.2 The Purpose of Mines . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Consequences of landmine usage . . . . . . . . . . . . . . . . . . . . . 5
2.2.1 Environmental consequences . . . . . . . . . . . . . . . . . . . 5
2.2.2 Humanitarian consequences . . . . . . . . . . . . . . . . . . . 7
2.2.3 Military consequences . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.4 Ethics and priorities . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Possible solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.1 Demining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.3.2 Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.3 Maneuvering . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.4 Problem Formulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3 Terrain Analysis 16
4 Technology Analysis 20
4.1 Data Collection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2 Compilation of Accumulated Data . . . . . . . . . . . . . . . . . . . . 21
4.2.1 The problematic low reliability of detection methods . . . . . 22
4.2.2 Combining data to increase accuracy . . . . . . . . . . . . . . 22
4.2.3 The design of Matrices . . . . . . . . . . . . . . . . . . . . . . . 23
4.3 Pathfinding Algorithms . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.1 BFS and DFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.2 Dijkstra’s algorithm and A* . . . . . . . . . . . . . . . . . . . . 25
5 Program design 28
5.1 Matrix Initialization Overview . . . . . . . . . . . . . . . . . . . . . . 30
5.1.1 Specification of expected format . . . . . . . . . . . . . . . . . 30
5.1.2 Import of Expected Format into C Matrix . . . . . . . . . . . . 30
5.2 Data Pre-processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5.2.1 User Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
iii
iv Contents
6 Implementation 41
6.1 User Settings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.2 Import of Mock Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
6.3 Matrix Configurations . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
6.4 Data Processing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
6.5 Dijkstra’s algorithm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.6 Visualization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
8 Conclusion 66
9 Discussion 67
9.1 Regarding the use of mock data . . . . . . . . . . . . . . . . . . . . . 68
9.2 Regarding lack of functionality . . . . . . . . . . . . . . . . . . . . . . 69
9.3 Regarding reliability and usefulness . . . . . . . . . . . . . . . . . . . 69
Bibliography 71
Chapter 1
Introduction
Warfare has been commonplace throughout history. Efforts to prevent and stop
wars have been made continuously, yet wars are still being fought. Currently,
wars are being waged between Russia and Ukraine, who both have seen a signif-
icant loss of lives, similar to the conflict between Hamas and Israel in the Gaza
strip[40][30]. In turn countries have tried to discourage the conflict.
Apart from the obvious safety risk for civilians vulnerable to being caught in
the crossfire during confrontations, other weapons, such as landmines, present
a passive but equally dangerous situation for both military personnel and civil-
ians. The use of such weapons has seen a surge since the invasion by Russia in
Ukraine[53], which is a tragic occurrence since landmines annually claim thou-
sands of casualties including the lives of civilians and children. Furthermore,
landmines result in the desertion of otherwise habitable areas and can cause the
permanent migration of refugees unable or unwilling to return to their homelands.
While the attempt to prevent the use of firearms during wars is difficult, this
report investigates the possibility of decreasing the use of landmines, to reduce
their negative consequences both during and after conflicts. Efforts to ban and de-
crease the use of landmines are prevalent, including international agreements such
as the Ottawa convention, which has been signed by the majority of states globally,
even though not all have ratified it[36]. Organisations such as the ICBL (Interna-
tional Campaign to Ban Landmines), also fight to mitigate the consequences of
landmines. Still, the cost-effectiveness of landmines result in little to no incentive
for major military powers to withhold from utilizing landmines.
This project will examine the potential for a software solution to contribute to
a reduction in the prevalence of landmines. Through an assessment of landmines
in a global context, as well as the efforts made by international agreements and
organizations like the ICBL, the aim is to objectively evaluate the role of technol-
ogy, specifically a software solution, in mitigating the adverse consequences of
landmines during and after conflicts.
1
Chapter 2
Problem Analysis
2.1 Mines
The term ’mine’ stems from the latin word ’mina’, which originally meant ’vein of
ore’. Essentially, it stems from the act of digging ores and minerals up from the
ground. Later, mines were adopted by the military branch as a tool and strategy to
aid in sieges of strongholds and fortresses, where armies would mine underneath
buildings and fortresses to make them collapse[39]. Our modern and current
understanding of mines, however, are of hidden stationary devices with explosive
capabilities, and the implications of this technology has resulted in further uses
for mines, outside merely the collapsing of buildings [14].
An important distinction to make is that mines are stationary explosive devices
that are positioned and thereafter await a signal to explode, compared to bombs
which are containers for explosive charges that often detonate upon contact, such
as when it hits the surface after being dropped from an airplane[13]. Grenades are
a hybrid of the two, whereby a soldier activates a fuse thus awaiting explosion,
but it can still be thrown and is therefore not stationary.
’Mine’ is a general term for a variety of stationary explosives There are, how-
ever, several subcategories of mines each with their own purpose and function
and each with their own intended targets.
2
2.1. Mines 3
With more than 110 million active landmines worldwide [28], the global issue
of landmines becomes apparent. The most affected countries are especially Middle
Eastern countries. Egypt has an estimated 23 million active mines mostly leading
up to its borders [28]. Furthermore, Angola has 15 million active mines, Iran has
16 million mines, Afghanistan, Iraq and China have 10 million active landmines
respectively. These are the countries that have the largest estimated amount of
mines.[28] Some of these mines only target vehicles or tanks crossing a terrain
and these are called anti-tank mines, while other mines are intended to harm
individual military soldiers when stepped on - anti-personnel. The threshold for
activation is obviously different for each of these mines, as well as the impact of
the explosion.
Anti-personnel mines were used significantly during guerilla wars, such as the
Vietnam war and the war in Afghanistan, especially by the guerilla and uncon-
ventional military forces forces[14]. Unfortunately, a large amount of these mines
that were placed during the wars are still stationed and hidden in the ground in
the affected areas. Although efforts have been made to clear these mines, several
thousand civilians die each year from mines left behind from conflicts and wars.
More detailed information on this under the section 2.2.2
In 1997, an international agreement named "The 1997 Convention on the Prohibi-
tion of the Use, Stockpiling, Production and Transfer of Anti-Personnel Mines and on their
Destruction"[36] was an international complete ban on the production and use of
anti-personnel mines, also known as the Ottawa Convention. All but 31 countries
have signed and ratified this agreement in their respective legislation, however
countries such as Iran, Russia, Syria, Vietnam, Israel, Saudi Arabia, China, and
4 Chapter 2. Problem Analysis
even the United States have not yet signed or ratified the agreement[33]. The rea-
son for banning anti-personnel landmines is due to the large amounts of areas
that are both restricted due to conflicts of the past, as well as being a danger zone
for civilians who may risk activating these mines. Anti-tank mines, however, are
not targeted towards individual civilians, thus they do not pose as significant a
danger for these persons, and these are and have been produced in much smaller
numbers due to the amount of explosives within them and the cost of producing
them.
With the ongoing conflicts between Ukraine and Russia, as well Hamas and Is-
rael at the time of this reports writing, the discussion on the use of anti-personnel
landmines is very much relevant, since both Russia and Israel have yet to agree
to the Ottawa convention. Safe to say the use and application of anti-personnel
mines is a controversial issue even in the world today.
means that soldiers will more often be severely injured as opposed to dead, thus
requiring more resources trying to save said soldier. But of course, from a hu-
mane perspective, it is preferable to make enemy soldiers functionally incapable
of fighting, instead of killing them, hence the existence of the Hague convention.
Landmines do not only target military but also civilians, both unintentionally
and intentionally. Unintentionally because civilians have the possibility to find
themselves in the middle of a minefield stemming from warfare, either present or
past, and as a consequence can step on such mines. Intentionally they are used to
limit access to farmland or in general terrorize populations[29]. Removing mines is
time consuming and costly, as removing a mine drains the rival nation’s resources,
costing about 100 to 333 times as much as is spent on producing a mine[11].
A significant problem caused by the use of mines is that said military and
country in a given war tend to stop marking and mapping minefields during long
conflicts. Combatants even stop laying mines in specific patterns leaving leftover
mines after the war, with no method of efficiently locating these weapons[29]. This
has consequences for the generations to come, consequences that are explored in
the next section.
Another issue of minefields are the substantial areas made functionally un-
inhabitable for years, depending on the budget available to clear said areas. In
countries like Bosnia, mines from the Yugoslav Wars in the 90’s continue to be
found to this day, forming a minefield totalling 956.36 km²[5] across the country’s
three sub-republics 30 years after the end of hostilities. These mines result in ca-
sualties every year even after the end of the conflict, a situation mirrored in other
former war-zones like Afghanistan and Kosovo.
In 2021 a report on anti-personnel mine clearance has shown that 132,5km2 of
land has been cleared from anti-personnel mines out of a total 280km2 of land.
This means less than 50 percent of the examined land for investigation has been
6 Chapter 2. Problem Analysis
While the lives lost are a tragedy on their own, one should also not under-
estimate the long-lasting damage this can do to the host nation as a whole. In
a report made by the United States Institute of Peace, property destruction is an
important factor refraining refugees from returning home[16]. While the obvious
way to cause property destruction is the direct demolition of property, via bom-
bardment or such, other means such as a minefield placed in the vicinity of a rural
dwelling can make it risky to move back into the area, and countrysides can be
rendered uninhabitable by said minefields, due to the difficulty of getting the old
inhabitants to move back into such risky territory from their relative comfort in
other countries. This is explored further in 2.2.2 on Human Costs.
Landmines therefore present the issue of long-term desertion of affected areas
after the end of the conflict, making it vulnerable to future instability. In addition,
they also increase the burden on neighbouring countries, whose capacity for hu-
manitarian action become occupied for years more than the duration of hostilities.
2.2. Consequences of landmine usage 7
Mines negatively impact the safety and prosperity of affected regions. A report
from The Landmine and Cluster Munition Monitor states that, in 2021, casualties
resulting from abandoned mines were recorded in 47 different countries, and a
total of 2.182 people were killed. Another 3.355 people were injured as a result of
ERW’ (Explosive Remnants of War) [33]. This number is only related to landmines
specifically. Around 80 percent of all landmine casualties are civilians, and some
of these casualties also include children. It is estimated that 15,000 - 20,000 injuries
occur each year due to all types of landmines combined.[33] These injuries often
have lifelong ramifications, including both physical and psychological disabilities
and traumas.
the the most casualties, accounting for over a quarter of the global mine and ERW
casualties between 2011 and 2021.[33]
Table 2.1: The 5 states with the most ERW-related casualties in 2011-2021[33]
Table 2.2 displays the total casualties for different groups of people in 2021,
which include civilians, military personnel, ’deminers’ (people tasked with re-
moving mines, NGO’ ect.), and individuals with unknown status. In 2021, Civil-
ian casualties of 4.200 accounted for 76 percent of all casualties. Notably, 1.696 of
the civilian casualties were children. Afghanistan was recorded with the highest
number of civilian casualties at 1073, whereby 40 percent of their civilian casual-
ties were children. Specifically, mines and ERW’ caused the death of 636 children
and injured 1.057 children, in Afghanistan. With regards to military personnel
casualties, Syria had the highest number of casualties, namely 465 people.
The data suggests that mines and minefields continue to pose significant chal-
lenges for the affected countries, several years after a conflict has ended. Civilians
remain the most vulnerable group of victims and children account for a significant
amount of these unnecessary deaths.
Similarly, the value of a civilian life also increases as the war-torn country it-
self worsens in terms of quality of life. This becomes apparent through a scarcity
analysis, as millions flee nations like Ukraine[38], leaving whichever experts re-
maining in higher demand than otherwise. When the war ends, attracting these
experts back from their new homes in Western Europe, to their old homeland,
which is affected by the existence of landmines, will likely be met with at least
some degree of difficulty based on prior experiences with refugee crises. [6].
quality of life in entire countries both during warfare but also after it. However,
while the irreplaceable loss of lives and the environmental costs and concerns are
tragic consequences of minefields, there are also other consequences, such as the
economic cost of military units, equipment and vehicles.
While mine flails are separate vehicles, in today’s age both rollers and plows
10 Chapter 2. Problem Analysis
exist as attachments and can be equipped onto the fronts of modern tanks. These
attachments however, are both expensive and far from optimal, as the rollers can
only detonate a limited amount of landmines before they need to be replaced
and generally the attachments reduce the mobility of the tank and increase its
fuel consumption. Due to the disadvantages of these attachments, specialized
equipment is more commonly used. This includes the Assault Breacher Vehicles
(ABV) such as M1150 used by the United States, which is equipped with a plow
as well as an M58 Mine Clearing Line Charge (M58 MICLIC), which can clear an
8 ∗ 100m2
path per launch. Due to the cost of around $85.000 USD per system, the M58
MICLIC is only used when absolutely necessary[42]. As with other alternative
mine-clearing vehicles, the M11150 can cost up to $3.7 million USD per vehicle
[35].
It is worth noting that situations with no alternative to expensive clearing
methods regularly occur. The French equivalent of the MICLIC is the only uti-
lized tool during live combat operations, due to the speed required to maintain
offensive momentum[3].
The process of removing a single mine is estimated to cost around 300 dollars
to 1000 dollars.[33] This covers the necessary equipment and specialized personnel
required to remove the mine. The variation of the cost can be attributed to factors
such as what type of mine is stationed, the location and what techniques are
required for removing the mine. The comprehensive task of removing all existing
mines would require a large financial commitment ranging from between 50-100
billion dollars. [28]
From a military standpoint, the loss of a soldier is also significant. Aside
from the value of the equipment granted to them, a soldier can have anywhere
from a few months, to decades of training. In a high-casualty war-zone like
Ukraine[17] for example, the life expectancy of a front line soldier can be as low
as four hours[27]. The value of a veteran therefore increases as their experience
becomes scarce.
Ultimately, the relatively high cost of purchase and maintenance of military
equipment used for mine breaching in warfare is a problem with no definitive
solution. For this reason, minefields are only breached or demined if other options,
such as bypassing, are too risky or simply unattainable. The problems associated
with bypassing minefields will be examined in section 3.3.3.
From the data presented in the previous section on military costs, it is also
made clear that pragmatic military powers will go to great economic lengths to
spare human resources. It is therefore clear that human lives are a significant
factor regarding the nature of mine discussions internationally.
This report, however, would like the reader to observe the international com-
munity’s attention to the inherent relationship between the military costs and hu-
man costs respectively.
Returning to the section on military expenditures, the cost of clearing a square
kilometre minefield was set at approximately $1,000,000 USD. While the problems
this causes have already been highlighted, it is also relevant to focus on the ratio-
nale behind stationing mines in the first place. The cost of a single anti-personnel
mine can be as low as $ 3 USD[10], while training and equipping a single Ameri-
can Marine can range upwards of $ 45.000 USD[43]. That is a significant potential
return on investment from a material perspective, and with mines being expen-
sive and difficult to clear, the cost-effectiveness of laying mines is attractive in a
military sense. The $ 45.000 USD do not include the productive value of a human
being in a society, thus the long-term effect of disabling an opponent using mines
is worth much more than $ 45.000 USD. A probable salary for an ordinary Amer-
ican soldier with a couple of years of experience is about $ 30.000 USD annually
[2], thus depriving a society of such yearly productivity due to the death of said
soldier following a landmine detonation is upwards of $ 1.8 million USD given a
40 year working life, taking inflation and salary raises into account.
Attempts at outlawing mines are therefore going to be troublesome to enforce,
simply due to their effectiveness from a military standpoint. Such international
law is the primary preventative weapon against the use of land-mines, for exam-
ple the Ottawa Treaty. Landmines are effective and viable, and therefore remain in
use despite the international opposition to them. 164 states have agreed to follow
the principles of the treaty, but the major military powers globally are less inter-
ested in abandoning the use of mines and have not signed the treaty. The United
States particularly has had a difficult time deciding which position to hold on the
matter. In 2014, under the Obama administration, the White House announced a
new policy declaring the intent to uphold and follow the contents and philosophy
of the Ottawa Treaty[23], while never actually signing it. When Trump won the
election in 2016, he reversed the policy change from 2014 in 2020[54]. After Joe
Biden won the election in 2020, he has since introduced a new policy reminis-
cent of Obama’ policy in 2014, reestablishing the US’ intent to follow the Ottawa
Treaty’ commandments. [21]. Yet still, the United States has not signed the Ottawa
treaty officially. While the US outwardly would like to show their responsibility
on the matter, they clearly do not wish to give up control of their production and
use of landmines, apparent in their choice to introduce a ’policy change’ instead
of signing and ratifying the treaty. [21][44]. Other countries with less implica-
tions in military affairs and conflicts have little to no reason to use landmines, say
countries like Japan, Spain or Denmark. For such countries, there is virtually no
incentive to use landmines in the first place, compared to countries like Russia,
United States and China, who must have significant military power.
12 Chapter 2. Problem Analysis
2.3.2 Detection
The standard way of detecting mines is by scanning with metal detectors by hand
to find the metal in the ground and then poke at the metal at a 30 degree angle
in order to figure out whether or not the metal object is a landmine[7]. This is a
problematic way of detection given that modern mines can be made without the
use of metal, which makes it dangerous. Furthermore, there exists anti-tampering
devices that will explode upon being met with the frequencies used by common
metal detectors[3]. This method also takes a lot of time, given you need people to
manually scan an entire area plus it puts these people at risk.
There are also other more modern approaches to the detection of landmines.
There are methods such as passive millimeter wave detection, which revolves
around analyzing the small amount of radiation difference in the ground due to
the effect metal has in this regard. This method works most ideally if the ground
is not moist and is not that great if the objects buried are buried deeper than a
couple of centimeters. Another method is using infrared imaging, analyzing the
temperature difference between the mine and the surrounding ground.[7]
The technology for detecting landmines is generally viable, meaning it is pos-
sible to somewhat generate a map of where mines are located in a given area.
However, there are certain problems that can make the use of these methods less
effective, such as mines stationed within forests or vegetation, or mines specifically
designed to evade such analytical instruments. More information on the available
methods for detection in 4.1 on data collection.
2.3.3 Maneuvering
In regards to different ways of solving the problems related to landmines, the re-
port has so far analysed the process of demining and mine detection, as well as
the underlying challenges and limitations of both procedures. Although the de-
tection and clearance of landmines are possible options for handling hazardous
minefields, the utility of these methods is susceptible to multiple factors. In other
words, depending on factors such as time, economics, terrain and purpose, one
method of dealing with minefields might be superior to other solutions. As men-
tioned in section 2.3.1, human lives are highly prioritized in humanitarian demi-
ning, while time plays a crucial role in military demining. Thus, during warfare,
rather than breaching through mines, which is both costly and time-consuming,
finding safe paths through minefields might be a better solution in some instances.
Besides helping to maintain the momentum, minefields are also bypassed to
conserve critical counter-mobility assets[1]. Therefore, when possible, bypassing is
generally the preferred method to advance through minefields[46]. The planning
and execution of such maneuvers, however, comes with its own set of problems.
As mentioned previously, landmines have various purposes, one of which is to
control the movement of opponent forces by tricking them into following a specific
bypass. Hence, when making the decision to bypass rather than breach, it is
important to consider the likelihood of friendly units being channelized into kill
zones or traps[1].
14 Chapter 2. Problem Analysis
Another aspect affecting the mobility of a military unit is the terrain within
and around minefields. Defensively, when planning the emplacement of tactical
minefields, terrain visualization plays a vital role[1]. Due to natural elevations,
slopes and terrain features such as lakes, streams and valleys, the topography in
a given area naturally restricts the mobility of an attacking force. For this reason,
an IPB process is executed, in which the terrain in a specific geographic area is
analyzed to predict the manoeuvrability of enemy forces[9]. This way, landmines
can be placed on land areas of strategic importance and so-called AAs (avenues of
approach).
Contrary, an attacking force intending to pass through minefields must also
have insight into the terrain as well as different types of minefields in order to
estimate the likelihood of landmines in a given area.
Minefields are usually categorised into 4 groups, namely protective, tactic, nu-
ance and phony minefields, each of which has its own purpose and emplacement
method. The purpose of phony minefields is to deceive the enemy about the exact
location of real minefields by employing fake mines[1]. In connection to bypass-
ing possibilities, minefields of such type are particularly relevant, as these might
be exploited with sophisticated detection methods or if the opponent force acci-
dentally reveals the deception of the field, for example by driving through the
minefield[1].
Besides topography and different types of landmines, there are numerous
other factors to be analyzed when planning bypassing manoeuvres. On the one
hand, it is risky to bypass a minefield through seemingly mine-free and clear
routes, as these most likely lead into kill zones, but on the other hand, it might be
too challenging to cross through rough terrain with minimal probability of placed
landmines. Thus, the aim is to find an optimal bypass where both the terrain is
cross-able and the probability of landmines is as minimal as possible.
2.4. Problem Formulation 15
We have found through thorough analysis that the main problem with land-
mines lie in the effectiveness of their use. One way of minimizing the deployment
and impact of landmines globally is to reduce the reliance on landmines in military
conflicts. If landmines were not effective at harming and affecting the maneuver-
ability of military units, they would be less attractive. Our proposed solution has
the potential to decrease the use of landmines and, consequently, the unnecessary
casualties stemming from abandoned landmines in the future.
For the reasons above, the following problem statement has been formed:
How can a software solution efficiently analyze terrain and optimize pathfinding through
a minefield, to enhance and improve the maneuverability, safety and efficiency of traversal
operations, thereby decreasing the effectiveness of landmines
Chapter 3
Terrain Analysis
For this reason, terrain can both be understood in regards to the difficulty of
maneuvering through a specific type of terrain, but also from a perspective of
optimal mine placement. These two factors are in a relation with one another, and
the optimal route through a minefield relies on a balanced understanding of the
risks and opportunities associated with a given terrain. The best path through a
minefield is thus a path that not only takes the probable location of mines into
account, but also the friction and difficulty associated with maneuvering through
a certain terrain.
This section will both investigate the likelihood and probability for a given
mine to be placed as well as the effect a given terrain has on maneuvering, as
these two factors are two sides of the same coin.
16
17
The steepness of the terrain is an important factor. If given a route has a slope
that is too steep, then it is no longer possible to cross it. If the angle is more than
30 degrees, then we can assume that we won’t be able to pass it.[49] Although you
probably could walk on some steeper terrain than 30 degrees, it would require a
favorable ground type in order to keep the possibility of slipping low. Even if a
sloped terrain is walkable, the slope will also make it more energy consuming to
traverse, which then will lower the speed of which you can move through.[32].
When discussing roads and similar infrastructure, it is important to mention
the concept of ’Avenues of Approach’, abbreviated AA’s. Avenues of approach
are certain routes a given military unit can follow, in order to reach an objective
or a key terrain[49]. When searching for the optimal path through a minefield, it
is essential to have viable AA’s present. The most obvious example of an AA is a
simple road leading straight to the desired objective, however in real situations it
is often not desirable to use such an obvious AA, since the enemy is also aware of
the possible entries to their territory. Thus, the best AA is one that is sufficiently
fast and direct in relation to the unit’s mission, while not being obvious or vulner-
able to enemy attacks. Roads, clearings and similar pathways are usually faster
and more comfortable to traverse compared to irregular traversal over rough ter-
rain without any roads. For tank and vehicle maneuverability, roads are indeed
essential if the surrounding terrain is difficult to navigate.
For a certain area, it may be the case that roads are not viable to be used, since
their usage will obviously be useful, thus countermeasures are sure to have been
established to prevent such usage. This could either be in the form of entering
line of sight and fire of enemy positions, encountering landmines or an enemy
blockade awaiting the arrival of their victims. In other occasions, the use of a
road may be fully or partly desirable in relation to the optimal path through a
minefield, given the probable safety of travellers.
Furthermore, it may also be the case that natural clearings and paths through,
for example, dense vegetation, forests or cliffs, can be considered AA’s. For this
reason, the use of such clearings and natural pathways become desirable to use,
as the surrounding alternative terrain is generally undesirable. Because of such
a natural clearing being an AA, it must also be important for the enemy to deal
with such an opening, by taking countermeasures.
In conclusion, roads, pathways and clearings provide a more direct, clear and
faster approach to a military units objective, however this also makes them prime
targets for the enemy to lead into traps, minefields or blockades. Thus, depending
on the other factors of the terrain, roads can be useful for traversal, but must be
used cautiously.
Water levels in the terrain will slow the speed of which it is possible to move
through. The deeper the water is, the slower you will move through it.[25] At some
point the depth will no longer be possible to simply walk through, and you would
then need to start swimming in order to keep moving. The process of swimming is
quite slow and requires a greater amount of effort, than if you could simply walk
past. [56] This would also probably increase even further if you were a military
18 Chapter 3. Terrain Analysis
troop with a lot of gear that needs to be dragged with through the water, not to
mention making sure the gear does not get soaked in the journey.
Water is generally something to steer away from when maneuvering, unless
you have a lot of time. Although, if you do have the time to move through water,
it will probably reduce the risk of getting into contact with any mines, given mines
do not do well with extensive water damage.[1] This does however not keep you
safe from contact with enemy forces.
The ability of opposing forces to detect mines is affected by the type of soil
covering them. In loose soil for example, mines may be more challenging to detect
visually, hence loose soil is generally more attractive for mine placement. On rocky
terrain, mines are more visible. In rocky terrain, mines can more easily disrupt the
natural appearance of the surface, which will gather attention when passing. Due
to the reflective nature metal, if the soil is too hard to bury the mines properly,
the metallic components of the mine will reflect more clearly and distinctly than
its surroundings , making it more likely to be detected. However, in the case
that a landmine contains very little metal, it can be harder to detect. Thus, an
analysis of the opponents available resources and equipment could be valuable.
The concealment aspect of burying mines in rough terrain is more challenging
and it can result in noticeable disturbances in the surrounding terrain compared
to loose soil for example sand, that will leave no noticeable disturbances and tracks
19
Technology Analysis
Ground-penetrating Radar
Ground-penetrating radar, GPR for short, this type of radar can detect non metal
casings, but it is prone to bounce of small plastics, making it ideal to spot clutter,
and wet soil makes it difficult to find mines bellow 4 centimetres.[31][26] In terms
of efficiency, depending on the frequency, environmental conditions and the types
of mines, we can expect ground penetrating radar to have a higher success rate
when conditions are homogeneous, and penetrate deeper in dry conditions (at
most 20 cm).[12]
20
4.2. Compilation of Accumulated Data 21
Infrared Imaging
Infrared imaging is again a technique which has trouble when the area is non-
homogeneous and even if there is vegetation growing, such as grass. This type
of method for finding mines is rarely used as it only has some pretty specific
conditions in which the data is reliable and will not be assumed as available data,
as determining the false positive and false negative rates is especially difficult.[26]
Metal Detectors
Metal detectors are one of the most commonly used methods, the best detectors
had an efficiency at 91% though less if the area was iron rich.[31] Metal detectors
have a hard time knowing when something is clutter or when it is a mine, and
they are therefore often used together with another technique.
Electromagnetic Induction
When using electromagnetic induction you induct an electric field on the object
in order to have it create its own magnetic field, which in turn can be analysed to
define the object. This detection method can penetrate sufficiently deep, at most
7 - 12.5 centimetres depending on the metal contents, but when an object contains
little metal it can be really hard to identify, meaning it has a lot of false alarms.[26]
Artificial Intelligence
AI has become a part of almost everything we do and has also become an impor-
tant part of mine detection. AI can compliment an observational drone by aid-
ing in the analysis of data from large areas with multiple techniques all at once,
namely computer vision (imaging), metal detection, GPR and many more. Some
drones claim to have an efficiency at around 90% when utilizing AI technology.[55]
methods presented in said section is that none of them have complete reliability.
From the soil type to the experience of the operator, different factors can affect the
reliability of the final set of data.
Modern militaries already expend considerable effort regarding the predictable
location of enemy minefields[3], something that is done by experts behind enemy
lines based on doctrine made from careful study of prior minefields in other the-
atres of war[3]. The doctrines that form the basis of these conclusions are classified
and therefore inaccessible to the writers of this report unless a military contract can
be acquired. However, it is worth noting that especially in high-mobility theatres
of operation, where the front-lines move rapidly and unpredictably, it is worth
questioning the capabilities of a human-based team in regards to their ability to
perform the analytical work required to increase the odds of evading landmines.
Assistance from an algorithm, one that can run on a computer, would all else
equal be beneficial in helping this personnel in making significant decisions that
could end up saving lives. As such an algorithm would be immune to the faults
of typical combat issues like fatigue and tiredness, as well as have the advantage
of computing capabilities in regards to handling significant amounts of data.
only able to effectively do so when we have enough data. We believe that in the
case that we are lacking information, the probability of humans making wrong
decisions increase, since there are factors affecting reality that are not taken into
account. In the same way a detective or police investigation attempts to draw a
conclusion by accumulating relevant data and evidence, our solution will take rel-
evant data into account, analyze the data and provide a more probable conclusion
regarding landmine placement, than otherwise would have been. In essence, we
do not assume that our tool is a 100% accurate, but we do believe that it has to
potential to be more accurate than the conclusions drawn by humans, due to the
programs ability to utilize and compute much more data than humans are able to.
For this to work it is necessary to first compile said data into a format that can
be interfaced with by our software. The data we collect have the shared attribute
of being relative to a physical location, hence it is possible to project the data onto
a grid or grid-like structure. In other words, the data we collect can be assimilated
into the data-form known as a matrix; in this case, a 2D matrix.
The difficult part lies in how these matrices interact with one another, espe-
cially when it comes to the soft data sets such as those presented in mine-laying
doctrines. The calculations between them would have to be made based off of
trial-and-error experience, potentially AI-assisted as well, but several reasonable
assumptions can be made from the sources laid out in section 3. An example of
such an assumption is the fact that mines are rarely laid in rocky terrain, so even
if one of our data collection devices gets a result from such a place, we can, with
less certainty, assume that it is true unless corroborated by another source. In any
case, it is less likely for a mine to be deployed in such a location, compared to a
detection device indicating mines located in dense vegetation, as explained in the
Terrain Analysis.
g(n) denotes the currently best path to node n, and h(n) is a heuristic function that
estimates the cost of the cheapest path from node n to the goal [48]. Furthermore,
to ensure that A* finds the optimal path, the heuristic function h(n) must satisfy
two criteria, namely admissibility and consistency. h(n) is admissible if it never
26 Chapter 4. Technology Analysis
(∞) (∞)
x5 x5
4 11 4 11
5 5
(∞) (∞) (∞) (9,x1 ) (7,x1 ) (3,x1 )
2 2
x2 x3 x4 x2 x3 x4
1 1
7 7
9 3 9 3
x1 x1
(a) (b)
(14,x4 ) (9,x3 )
x5 x5
4 11 4 11
5 5
(9,x1 ) (4,x4 ) (3,x1 ) (6,x3 ) (4,x4 ) (3,x1 )
2 2
x2 x3 x4 x2 x3 x4
1 1
7 7
9 3 9 3
x1 x1
(c) (d)
(9,x3 ) (9,x3 )
x5 x5
4 11 4 11
5 5
(6,x3 ) (4,x4 ) (3,x1 ) (6,x3 ) (4,x4 ) (3,x1 )
2 2
x2 x3 x4 x2 x3 x4
1 1
7 7
9 3 9 3
x1 x1
(e) (f)
overestimates the cost of reaching the end node, while consistency implies that
h(n) satisfies the triangle inequality[48].
Chapter 5
Program design
The following chapter will provide an examination of our program design in order
of execution. The chapter is split into four sections, each focusing on a separate
component of our program.
1. Matrix Initialization
2. Data Pre-processing
3. Pathfinding Algorithm
4. Visualization
The first two sections explain the process of importing and normalizing input
data as well as how this data is configured with regards to user-defined settings
and lastly processed into a single matrix. The last two sections delve deeper into
the application of the pathfinding algorithm and the visualization of our found
path. To help with the mediation of the design, we have created a diagram to
explain the flow of the program, see figure 5.1.
28
29
to import the bitmap file type. This datatype will allow us to make mock data
for our program with external paint software, which allows us to have a visual
overview of the mock terrain. Even though we only import this one data type,
there is however space for scaling the program further with more file types. The
bitmaps that we draw as mock data will be in black and white, so we will be able
to get the values from each pixel as a scale from zero to one that we then can use
for further processing of the data.
1. Slope map
2. Water map
3. Mine map
4. Soil map
5. Vegetation map
All maps have been min-max normalized when imported, meaning that values
are in the range of 0-1. The slope maps depict the slope of the terrain, where a
slope of 1 is equivalent to 90 degrees. This can occur if the terrain has a cliff
side. Mines are less likely to be laid at cliff faces or on mountainous terrain,
see section Terrain Analysis, so this data is relevant. The water map indicates
the water depth, 0 meaning no water and 1 indicating that the entity will have
to either swim or be submerged. The mine map is constructed based on output
from detection equipment and has values depicting the probability of a mine in
a certain location. The soil map depicts how easily a mine can be laid in the
terrain in terms of the hardness of the soil. Vegetation maps indicate how much
vegetation has grown at a certain spot. This might be relevant data, as mines tend
to be laid in vegetation in order to conceal them. Road quality maps depict the
quality of the road, also an important factor when choosing where to go, since
higher quality roads make traversal easier and faster, as well as allowing vehicle
advancement.
such that the sum of all weights adds up to 1. Mathematically, every entry of the
processed matrix can be expressed the following way:
k
Pij = ∑ an ∗ ( Mn )ij (5.1)
n =1
Given a set of k available map types, ( Mn )ij is the i, jth element of the nth
map type, while an is the corresponding weight of the map. Lastly, Pij is the i, jth
element in the processed matrix.
If weighted equally, every map type is assigned a weight of an = 1/k. This
is only the case if the user chooses the "high risk" setting when asked to pick an
acceptable risk level. Otherwise, if "medium" or "low" risk has been chosen, the
modified weight of the mine map is a1 = 0.5 and a1 = 0.75, respectively. There
is no particular reason why these exact values have been chosen. Depending on
the number of available input matrices and their importance, an alternative set
of weights might work better. More precisely, values must be chosen such that
decreasing the risk level increases the weight of the mine map. This means that
even if a path designed for a given troop type is allowed to pass an area where
the mine probability is less than the maximum threshold, the likelihood of this is
decreased when selecting a lower risk level. Furthermore, by choosing a "medium"
or "low" risk level, the weights of the remaining map must be adjusted accordingly
in order to maintain a total weight of 1. Hence, given that the remaining factors
are equally weighted, the modified weight is an = 1k−−a11 , where a1 denotes the
weight of the mine map and k is the number of available map types.
algorithm utilizes the cost of a geographical area and hence, does not return the
optimal path.
One drawback of Dijkstra’s algorithm is its relatively high time complexity for
large graphs. More precisely, Dijkstra’s algorithm uses O(n2 ) operations to find
the length of the shortest path between two vertices in an undirected weighted
graph with n vertices [47]. It is difficult to precisely determine the time complexity
of A*, as it depends on the quality of the heuristic function. Although its worst-
case complexity is the same as Dijkstra’s algorithm, in practice A* will be faster
on larger graphs [45].
Despite being slower than A*, Dijkstra’s algorithm will always find the opti-
mal path if such exists. However, the same is only true for A* if the heuristic
function h(n) is both admissible and consistent [48]. As the optimal route in our
pathfinding problem is found by optimizing a weighted sum of multiple variables,
the admissibility condition would be difficult to satisfy. In other words, there is
no specific method of finding a lower bound for estimating h(n), so that it would
never overestimate the real cost. Even if an admissible heuristic is found, such a
heuristic would most likely be poor and result in a slower algorithm.
Because we prioritize the optimality of the found path rather than the time
taken to find such a path, we have chosen Dijkstra’s algorithm as our pathfinding
algorithm.
c0 c1
x0 c1 x1 c2 x2
c3 c0 c4 c1 c5 c2
c3 c4
x3 c4 x4 c5 x5
c6 c3 c7 c4 c8 c5
c6 c7
x6 c7 x7 c8 x8
Due to the sparse and uniform nature of the graph, it makes sense to model
it as a 2D array of structs, where each item of the array contains, among other
variables, the coordinates of the vertex and its "cost", i.e. the identical weight of
every edge directed at the vertex.
Although both an adjacency list and an adjacency matrix can be used to depict
the same graph type, the implementation of either data structure would require a
substantial conversion of the input data. On the other hand, a 2D array is better
suited for this problem type as the value in an entry of the input matrix can be
directly copied to the struct of the same index in the 2D array.
Having found an appropriate data structure to represent the graph, the next
step is to select a data structure for the implementation of a priority queue. A
priority queue is a container of elements, each having an associated key by which
the elements are ordered [20]. In this case, the purpose of the queue is to keep
track of unexplored nodes and the currently cheapest path to each such node.
Because the algorithm uses the queue to find the currently cheapest path, every
unexplored node is prioritized based on the currently cheapest path to the node.
This property makes it a minimum priority queue. In addition to this, a queue
of such type supports two fundamental operations: insert(k, e) and remove_min().
Insert(k, e) inserts an element e with key k into the queue, while remove_min()
returns and removes the element with the highest priority from the queue. Addi-
tionally, in our design, a third operation decrease_entry(k, e) is necessary in order
to update the priority queue whenever the algorithm finds an alternative path
with a cheaper cost k to a given node e. An examination of decrease_entry(k, e)
and remove_min() is provided in section 6.5 where the implementations of both
functions are exemplified.
There are several ways of implementing a priority queue. Naively, one could
use a sorted or unsorted array. However, in such implementation, the two fun-
damental operations will have time complexities O(n) and O(1) or vice versa.
Alternatively, one might use a min binary heap for the same purpose. In this case,
both insert(k, e) and remove_min() have the same complexity, namely O(log(n))
36 Chapter 5. Program design
[20], which is preferable when working with larger queues. For this reason, we
use a min binary heap to implement our priority queue.
A min binary heap satisfies two criteria. Firstly, it must be complete, that is,
every level of the tree except the last must contain the maximum number of nodes
possible, and nodes in the last level are as far left as possible [20]. Secondly, it
must satisfy the Heap-Order Property, which states that for every node v other
than the root, the key stored at v is greater than or equal to the key stored at v′ s
parent [20].
In our design, we have modelled the binary heap as an array A. The root of the
tree is stored in A[0], and the left child and right child of a node A[i ] are stored
in A[2i + 1] and A[2(i + 1)], respectively. From this follows that the parent of a
node A[i ] is located in A[⌊ i−2 1 ⌋]. Because a binary heap is a complete binary tree,
the array implementation is more space-efficient as opposed to a linked structure
implementation [24].
In conclusion, the algorithm uses the input data to initialize a 2D-array of node
structs. A min priority queue is implemented using a min binary heap and every
node of the graph is added to the queue. The algorithm explores the first node
in the priority in the queue, visits its adjacent nodes and updates their position in
the priority queue. The algorithm keeps exploring new nodes until the destination
has been explored. The path is then backtracked and returned as an array of
coordinates.
5.3. Pathfinding Algortihm 37
Start
Stop
For each adjacent entry
of the explored entry
update its path cost
5.4 Visualization
5.4.1 Understanding the rationale for visualization
The solution for our software program is the determining of the optimal route
based on the conditions given to the program, for a certain area. Thus the solution
does not directly relate to a visualization. Instead, the route is the solution/result.
The format of the optimal route in our program is a 2D array, containing the co-
ordinates in specific order, such as [ [1,0], [1,1], [1,2], (...)]. This format, however,
is difficult to interpret and understand. Therefore, visualizing the outcome of our
program is helpful insofar as understanding the outcome and the result. Yet, it is
not necessary or integral to the solving of the underlying problem, that is, maneu-
vering through a minefield.
5.4.2 Method
In order to visualize an area, we must first understand how terrain is viewed.
When looking at an area from a two dimensional perspective, we look from above,
towards the ground. This means that what we see is the last element not obscured
by anything else. In a given terrain we may have water, rocks, soil, grass, bushes,
trees and so on. Looking from above, we only see water if there is no land covering
it. We only see land, soil and grass if there are no bushes or trees covering it.
This can be seen in the satelite image below. In order to visualize the area being
analyzed in our program, the same concept of layering is applied.
Figure 5.4: Example of terrain from two dimensional perspective, Google Maps ©
5.4. Visualization 39
This entails that when coloring and visualizing, a decision has to be made re-
garding the overlapping of different data sources. For example, any forest, water
or road cells should be prioritized more than the underlying soil type, thus replac-
ing the individual cell. Similarly, in a cell with both water and vegetation present,
a blended color of blue and green would be teal, presenting a swampy area. Fi-
nally, for all cells in the optimal route, their color will overwrite all else, thereby
making the optimal route clear in relation to the area. This pre-processing func-
tionality will still be programmed in C, and the final matrix ready to be visualized
will be exported to an external file, ready to be visualized.
Regarding the pre-processing of the matrix before it is ready for initialization,
the following hierarchy can be used:
Priority Terrain
1 Optimal route
2 Mines
3 Roads
4 Vegetation
5 Water
6 Soil
In the structure above, the soil matrix will be the baseline matrix to be visual-
ized, which means that it will be ’drawn’ first across the entire matrix. Then, the
water matrix, more precisely the cells containing water, will overwrite said cells
previously holding soil. Afterwards, the cells containing vegetation will overwrite
cells containing soil but merge with cells containing water, creating a swamp.
Next, cells with roads will overwrite any other cell. After that, mines will be plot-
ted on top of any other terrain previously occupying the cells containing mine
data. Lastly, all the cells in the optimal route will be plotted and the optimal route
thus becomes visible.
The resulting matrix contains cells with values between 0 to 1. However, the
meaning of these values is not regarding the cost/weight of the individual cell in
relation to the optimal route, but solely signifies the color to be drawn. For exam-
ple, the cells containing soil will have a value of either 0.0 or 0.1, depending on
the hardness of the soil and the cells containing water will have a value of 0.2 or
0.3 depending on the water depth. Lastly, the cells contained in the optimal route
will have a value of 1. The tool used for visualization will match each value to a
color.The complete color-map can be viewed on the next page.
with the programming language Python, a high level and interpreted, general
purpose language. A lot of tools and libraries related to data formatting, data
science and visualization are created in the programming language Python, due
to its effectiveness and capabilities within data science and statistics.
We must emphasize that the pre-processing functions and calculations being
made to create the matrix to be visualized are written in C, as well as the exporting
of the matrix to a txt. file. Essentially, the purpose of using Matplotlib is to read
the values from the txt. file, and paint a color corresponding to said value. We do
not use Python or any Python library to perform calculations or affect values in
any way. The Python script is solely used for drawing a color in a cell, based on
the values we have calculated and exported in C.
Since our program is written in C, we are working with two-dimensional arrays
of type double when we work with matrices. However, the Python visualization
tool known as ’Matplotlib’ does not accept C matrices as input, hence a conver-
sion is necessary before visualization is possible. In order to pass a 2D array into
Matplotlib, we will have need to convert it into a Python array or a ’NumPy’ two-
dimensional array. NumPy is a tool for working with arrays, introducing features
and functionality that extend the capabilities of ordinary Python code. Thus, we
can use NumPy collaboratively with Matplotlib, to aid in the visualization of the
terrain and the optimal route.
Below is an example of how a given colormap can help visualize the terrain
as well as the optimal route determined by Dijkstra’s algorithm, see table 5.2 and
figure 6.1. In the example, the optimal route from the bottom left corner to the
upper right corner is found, and revolves around crossing the river by using the
bridge, while simultaneously avoiding landmine hotspots. The route is clearly
utilizing the roads for faster maneuvering, but taking the dangerous landmine
zones into account. A thorough explanation on the pre-processing functions as
well as the settings used when determining the optimal route below will be given
in the implementation section for our project.
Table 5.2: Colormap used for visu- Figure 5.5: Visualized terrain and opti-
alization mal route
Chapter 6
Implementation
41
42 Chapter 6. Implementation
11 int size;
12 } additional_settings;
13
14 typedef struct {
15 // risk road_weight;
16 risk mineRisk;
17 // risk vegetation_weight;
18 } priorities;
The troop_settings struct consists of 5 different double values that will be used
when configuring the matrices. They are defined as double values, since their
values will be used comparatively when deciding whether or not to manipulate
or change individuals cells in the configuration process of our program, so they
ought to be the same data type as individual cells of the matrices.
The additional_settings struct consists of only an integer value, named size,
which will be used when creating the size of the matrix to be analyzed.
The priorities reflect the risk level or priorities associated with differing factors,
such as the use of roads, the acceptable mine risk and the desire to avoid dense
vegetation, to name a few examples that we have given. The only risk factor cur-
rently used by our software is the mine risk, but further implementations would
make sense given more time. The risk/priority type used is an enum shown be-
low:
1 typedef enum {
2 Low,
3 Medium,
4 High
5 } risk;
The last data structure created is the enum for troop type selected by the user:
1 typedef enum {
2 SquadUnit, // 7−14 soldiers
3 CompanyUnit, // 100−250 soldiers
4 LogisticUnit, // Vehicles transporting troops, supplies and equipment
5 ArmorUnit, // Armored vehicles such as tanks
6 } troop;
The troop enum is used when setting the troop_settings during the initial-
ization phase of the program. Our program works in such a way that there are
predefined settings for the specific troop types, such that the settings used when
running the program are already decided, depending on the choice of troops by
the user. The settings are initialized in the main function of the program in the
following line:
1 int main() {
2
3 // Initialize user settings
6.1. User Settings 43
The header file also contains all of the offsets of data in the file type, the values
we support, a mask value and the libraries that bmp_import.c uses.
• It is indeed a BMP
The import_bmp() is in a way the primary function of the script, since it is the
one which gets called by other scripts and uses the other to functions of the script.
Which can be seen in the code:
1 //The specific locations of values in the bitmap can be found at: (https://en.
wikipedia.org/wiki/BMP_file_format)
2 double** import_bmp(char* path) {
3 //Opens the file, with read binary parameter
4 FILE* filePointer = fopen(path, "rb");
5
6 //Exit with failure if the file opening failed
7 if (filePointer == NULL) {
8 exit(EXIT_FAILURE);
9 }
10
11 //Get the size of the file
12 int fileSize = get_file_size(filePointer);
13
14 //Make char(size of 1 byte) array to store the file and write the file into the
array
15 char bmp[fileSize];
16 fread(&bmp, fileSize, 1, filePointer);
6.2. Import of Mock Data 47
17
18 //Checks that the bitmap is supported for the function
19 check_bmp_supported(bmp);
The import_bmp() function starts by getting a file pointer from the path and
reads with binary mode since we are reading a bitmap. Then it makes sure that the
path is correct and then uses get_file_size() in order to get the size of the bitmap so
it can make a char array containing the bytes of the bitmap. When it then have the
whole file in the array, it then calls the check_bmp_supported() function to ensure
that the bitmap is correctly formatted.
20 //Get the pixel data offset from the 10−14 bytes in the bmp and the width,
height and bits per pixel from the different locations in the bmp
21 int pixelDataOffset = (int)bmp[OFFSET_OF_PIXEL_DATA];
22 int width = (int)bmp[OFFSET_OF_WIDTH];
23 int height = (int)bmp[OFFSET_OF_HEIGHT];
24 int bitsPerPixel = (short)bmp[OFFSET_OF_BITS_PER_PIXEL];
25 int colorTableSize = (int)bmp[OFFSET_OF_COLOR_TABLE_SIZE];
26
27 //Uses other function to create a matrix that follows the standard for this
project, which will store the 0−1 values
28 //given the strength of the color for each pixel in the bitmap
29 double** pixelColorStrengthNormalizedArray = create_dynamic_matrix(
width);
30
31 //Calculates the size of the rows in the pixel storage part of the bitmap,
there is often padding at the end of rows
32 int rowSize = (int)ceil(((double)(bitsPerPixel * width) / 32)) * 4;
33
34 //Get color table
35 unsigned char colorTable[colorTableSize]; //16 times 4 bytes for RGBA
36 for (int i = 0; i < colorTableSize; ++i) {
37 colorTable[i] = bmp[OFFSET_OF_COLOR_TABLE + i]; //Byte 54 is the
start of color table
38 }
After that it gets some different values from different places in the bitmap file
and then uses the CreateDynamicMatrix() function, which comes from another
script in the project called RelationshipMethods, in order to create a matrix in a
standardized way throughout the project. The specific locations of different values
such as the width and height of the pixel array in the bitmap and other specific
things about the bitmap can be found in the sources.[4] The pixels of the bitmap
is stored so padding gets added so each row is a multiple of 4. And we then use
some math to get the correct row size. Then another byte array gets declared and
filled in order for us to be able to easily access the color table of the bitmap.
39 //Loop over each pixel
48 Chapter 6. Implementation
The color table and row size is then used in some for loops in order to iterate
over the pixel array and then save a normalized 0 to 1 value from each pixel in
the standardized matrix that was made at line 30. It does this by firstly getting
the index of the current pixel, which is calculated by using the offset of the pixel
array, the size of the row and the current column and row it has gotten to. But
since the bitmaps we support are 4 bits per pixel, the index byte(char) we have has
other values that we don’t want. Therefore we mask it with 0x0F(NIBBLE_MASK),
which just gives us the 4 bits of the byte that we need. We can then use this index
to the the color of the pixel from the color table. This value then directly gets
normalized and saved and then get put in the final array that, when the whole
pixel array have been run through, gets returned.
1 //Checks whether the bitmap is supported or not
2 void check_bmp_supported(const char* bmp) {
3 //Exit with failure if not a bitmap file
4 if ((short)bmp[OFFSET_OF_FILETYPE_VALUE] ==
SUPPORTED_FILETYPE_VALUE) {
5 printf("\nUnsupported filetype");
6 exit(EXIT_FAILURE);
7 }
8
9 //Exit with failure if bitmap header is not 40 bytes and therefore a bmp we
6.2. Import of Mock Data 49
don't support
10 if (bmp[OFFSET_OF_HEADER_SIZE] != SUPPORTED_HEADER_SIZE) {
11 printf("\nUnsupported header size");
12 exit(EXIT_FAILURE);
13 }
14
15 //Exit with failure if bitmap is not stored with 4 bits per pixel, because we
don't support that
16 if ((short)bmp[OFFSET_OF_BITS_PER_PIXEL] !=
SUPPORTED_BITS_PER_PIXEL) {
17 printf("\nUnsupported bpp");
18 exit(EXIT_FAILURE);
19 }
20
21 //Exit with failure if bitmap is not uncompressed, because we don't support
that
22 if (bmp[OFFSET_OF_COMPRESSION] !=
SUPPORTED_COMPRESSION_TYPE) {
23 printf("\nUnsupported compression");
24 exit(EXIT_FAILURE);
25 }
26 }
In the code above you can see the check_bmp_supported() function. It starts
by checking the 2 first bytes of the file in order to see whether or not the have
the "magic numbers" which shows it is indeed a bitmap. Then it makes sure
that the header size is correct, that the bitmap is stored with 4 bits per pixel and
uncompressed. If any of these checks fail then it runs the exit function with the
exit code EXIT_FAILURE, which stops the program.
1 //Get the size of a file and reset the file pointer to the beginning of the file
2 int get_file_size(FILE* file_pointer) {
3 //Sets the positions to the end of the file
4 fseek(file_pointer, 0, SEEK_END);
5
6 //Gets the position of the end of the file, which also is the total size
7 int size = ftell(file_pointer);
8
9 //Sets the reading position back to the beginning of the file
10 fseek(file_pointer, 0, SEEK_SET);
11
12 //Returns the size of the file
13 return size;
14 }
And lastly in the code above the get_file_size() function is. Which starts by
moving the position of the file pointer to the end of the file with the fseek function.
50 Chapter 6. Implementation
Then it uses the ftell to get the position of the file pointer, which when at the end
of the file is equal to the size of the file, and saves it. Then it moves the position
of the file pointer back to the beginning of the file and returns the size of the file
which were saved earlier. It does this in order to not interfere with the reading of
the file, which would fail if you tried to read, but was at the end of the file.
All the function share commonalities, they take their own double** map and
userSettings *settings as an input. This is because the configuration takes into
account the settings that have something to do with the matrix in question, namely
the troop settings:
10 typedef struct {
11 troop_settings troop_settings;
12 priorities priority_level;
13 additional_settings additional_settings;
14 } userSettings;
15
16 typedef struct {
17 double max_water_depth;
18 double max_mine_risk;
19 double max_slope;
20 double max_road;
21 double max_terrain_difficulty;
22 }troop_settings;
that the troop cannot pass that cell, it is then given a value of -1 to signify that it
is impassable to the path finding algorithm, here are two examples:
23 void ConfigureVegetationMap(double** vegetationMap, userSettings *settings){
24 for (int i = 0; i < settings−>additional_settings.size; ++i) {
25 for (int j = 0; j < settings−>additional_settings.size; ++j) {
26 if (vegetationMap[i][j] > settings−>troop_settings.
max_terrain_difficulty){
27 vegetationMap[i][j] = −1;
28 }
29 }
30 }
31 }
32
33 void ConfigureRoadQualityMap(double** roadQualityMap, userSettings *
settings){
34 for (int i = 0; i < settings−>additional_settings.size; ++i) {
35 for (int j = 0; j < settings−>additional_settings.size; ++j) {
36 if (roadQualityMap[i][j] > settings−>troop_settings.max_road){
37 roadQualityMap[i][j] = −1;
38 }
39 }
40 }
41 }
They use a double for-loop to iterate through all the cells in the 2-dimensional
array, which is the terrain map, then an if-statement checks whether the cell is
impassable in regards to the settings. Like having too much vegetation, or having
too bad quality in the roads. There is a certain map that involves a little more than
the rest and that is the water map.
42 void ConfigureDepthMap(double** waterMap, double** road_map, userSettings
*settings){
43 for (int i = 0; i < settings−>additional_settings.size; ++i) {
44 for (int j = 0; j < settings−>additional_settings.size; ++j) {
45 if (road_map[i][j] != −1 && road_map[i][j] < 1){
46 waterMap[i][j] = 0;
47 } else if (waterMap[i][j] > settings−>troop_settings.max_water_depth)
{
48 waterMap[i][j] = −1;
49 } else {
50 waterMap[i][j] = waterMap[i][j] / settings−>troop_settings.
max_water_depth ;
51 }
52 }
53 }
54 }
52 Chapter 6. Implementation
This map takes into account whether a road exists as impassable water does
not matter if a bridge exists.
When selecting the settings the user is prompted to enter the acceptable risk
level of the path. This setting is used by the function determine_weights() when
assigning a weight to the mine map. As mentioned in section 5.2.4, a lower risk
implies a higher weight. A switch statement is used to handle the three cases, after
which the base_weight is modified in case medium or low risk has been chosen.
The base_weight is modified to ensure that the overall weight remains 1.
For the function to work as intended, the mine map must be stored at index 0
in the matrix_array when passed to the function. Otherwise, every element in the
matrix array will be assigned the same weight.
Subsequently, the function process_matrix() is called. The purpose of the func-
tion is to allocate and return a 2D array that stores the weighted sum of the con-
figured matrices.
1 double **process_matrix(weightedMatrix matrix_array[], int array_length, int
matrixSize){
6.5. Dijkstra’s algorithm 53
The first for-loop runs through every configured matrix while the following
double for-loop is used to iterate through every entry of a given matrix. For
every entry of a matrix, there are three cases to handle. These are handled using
an if-else ladder. Essentially, the control statements ensure that a given entry in
processed_matrix stores the weighted sum unless at least one configured matrix
stores the value -1 in the same entry. In this case, -1 is stored in proccesed_matrix.
This way, impassable areas remain impassable.
2. Main loop - nodes are visited, updated and explored until the optimal path
to the destination is found
3. Backtracking path
which contains the found path and its length. If no path is found NULL is re-
turned.
Before the path can be found a graph and a min priority queue must be de-
clared. The graph is implemented as a 2D-array of entry structs. An entry can be
though off as a node with a set of proterties. The declaration of the entry struct is
shown below:
7 typedef struct{
8 int pos[2]; // position in matrix
9 double weight; // weight of edges directed to node
10 double current_cost; // cost of currently cheapest path to node
11 struct entry *previous; // Every node keeps track of the previous node in
the path. This makes it possible to backtrack the final path
12 int priority_status; // Keeps track of index in priority queue
13 }entry;
Having declared the graph and the priority queue, both are passed as argu-
ments to the initialization() where they are initialized. In this connection, it is
worth noting that the member current_cost of every entry is assigned INFINITY
(a macro constant from the library math.h) and that NULL is assigned to the (en-
try*)previous member.
The only node that initially differs from the rest is the starting node, declared
as root_entry in line 12. Since the cost of the shortest path to this node is simply
its weight, the node is prioritized above every other node. This is handled by the
function decrease_entry(), by updating the node whose current index, is passed as
an argument to the function.
14 result *dijkstra(double **input, int size, const int start_pos[], const int end_pos[]){
15 entry **matrix = declare_graph(size); // remember to free memory
16 int queue_size = size*size;
17 entry *priority_queue[queue_size]; // Declaration of priority queue
18 entry *root_entry = &matrix[start_pos[0]][start_pos[1]];
19 entry *goal = &matrix[end_pos[0]][end_pos[1]];
20
21 //Initialization of graph and priority queue
22 initialization(size, priority_queue, matrix, input);
23
24 // The starting node is initialized separately, as it differs from the rest
25 root_entry−>current_cost = root_entry−>weight;
26 decrease_entry(priority_queue, root_entry−>priority_status);
At this point, the program proceeds to traverse the graph using a while-loop.
At the beginning of every iteration, the function extract_min() is called to extract,
remove and return the first entry of the priority queue. To maintain the structure
of the binary heap, the last element in the priority queue temporally becomes the
root node and the queue length shrinks by one. Lastly, the index of the root node
is updated by swapping the node with its highest prioritized child. This process
is repeated until the min-heap property is restored.
1 entry *extract_min(entry *queue[], int *queue_size){
2 entry *entry_to_return = queue[0];
3 entry_to_return −> priority_status = −1; // −1 signifies that the entry is no
longer in the queue
4 queue[0] = queue[*queue_size−1]; // last element becomes first element
5 queue[0] −> priority_status = 0; // status for the currently new first element
is updated.
6 *queue_size −= 1;
7
8 int index = 0;
9 int left_index = left_child_index(index, queue, queue_size);
10 int right_index = right_child_index(index, queue, queue_size);
11
12 while (left_index != −1 || right_index != −1){ // −1 indicates that child does
not exist or that it is correctly located
13 int min_index;
14
15 if (left_index != −1 && right_index != −1) {
16 min_index = (queue[left_index]−>current_cost < queue[right_index
]−>current_cost) ? left_index : right_index;
17 } else if (left_index != −1){
18 min_index = left_index;
19 } else{
20 min_index = right_index;
56 Chapter 6. Implementation
21 }
22 swap_entries(&queue[index], &queue[min_index]);
23 index = min_index;
24
25 left_index = left_child_index(index, queue, queue_size);
26 right_index = right_child_index(index, queue, queue_size);
27 }
28
29 return entry_to_return;
30 }
When a node has been explored its adjacent unexplored nodes are visited by
the function visit_valid_neighbors(). For every unexplored neighbor the function
checks if a cheaper alternative path passing through current_entry has been found.
If this is the case, the new path and its cost are updated as well as the index in the
priority queue of the visited node.
46 void visit_valid_neighbors(int neighbor_index, entry *current_entry, entry *
neighbors[4], entry **priority_queue){
47 // Loops through every neighbor
48 for (int i = 0; i < neighbor_index; i++){
49 double path_cost = current_entry−>current_cost + neighbors[i]−>weight;
50 if(path_cost < neighbors[i]−>current_cost){ // Checks if a better
6.6. Visualization 57
In case a path exists between the starting and ending nodes, the program exits
the main loop and the function backtrace_path() is called. The essence of the
function is a while loop which backtracks the path.
57 while (path_section−>previous != NULL) {
58 add_to_path(path_array,current_index,path_section);
59 path_section = path_section−>previous;
60 current_index++;
61 }
Starting at the end node, the consecutive node of the path is backtracked by
accessing the member entry previous and storing it in an array. The process is
repeated for every consecutive node of the path until the starting node has been
reached. At this point the program exits the loop, adds the starting node to the
path and returns the path along with the size of the array in which it is stored.
6.6 Visualization
The process of visualizing the terrain as well as the optimal route is split into 3
parts:
Any individual terrain matrix only contains values with relation to the specific
terrain, so it is insufficient for providing an understanding of the entire area being
analyzed. The processed matrix contains values that do not relate to the specific
terrain but instead the cost/weight associated with passing through a given cell.
For this reason, another matrix must be created containing information for the
entire area, as well as the optimal route. Creating this matrix is the pre-processing
aspect of visualizing the area. As explained earlier, we layer the individual terrains
based on their priority. We have written the function create_matrix_painting() in
our program to accomplish this, taking the size and list of matrices generated by
generate_list_of_matrices() as input :
58 Chapter 6. Implementation
27 }
28 }
29 }
The two functions responsible for the actual changing of the cell in the matrix
painting can be seen below. the function add_swamp_to_matrix() checks if the
last cell with water and vegetation was painted as a swamp cell, and changes the
value of the matrix painting thereafter. The function add_vegetation_to_matrix()
checks the value of the cell in the vegetation matrix in the same way as with the
soil matrix, and inserts the correct color values thereafter.
Once the optimal route has been added to the matrix painting, the matrix has to
be exported to be used by a Python script generating the visualization. For this to
work, the matrix is exported to a txt. file with the function export_matrix_to_file():
1 void export_matrix_to_file(int rows, int cols, double** matrix) {
2
3 FILE *file = fopen("../OutputMatrices/outputMatrix.txt", "w");
4
5 if (file == NULL) {
6 printf("Error opening file for writing. Aborting...\n");
7 exit(0);
8 }
9
10 for (int i = 0; i < rows; ++i) {
11 for (int j = 0; j < cols; ++j) {
12 fprintf(file, "%lf ", matrix[i][j]);
13 }
14 fprintf(file, "\n");
15 }
16
17 fclose(file);
18
62 Chapter 6. Implementation
19 }
To more easily mediate how the program behaves, we have prepared an example
showing the input and output when using the program.
The only input required by this software are bitmaps. These bitmaps have
to represent some specific real world data, namely a slope-, water-, mine-, soil-,
vegetation- and road quality map, see figure 7.1.
These bitmaps are then configured based on settings chosen when running the
program and it will then produce the output, being the optimal path in regards
to the settings and data. The color scale goes from 0 to 1, from black to white. A
higher value signifies a high intensity of the given terrain, meaning that a white
color in the water bitmap refers to deep water levels, and black colors reflect no
water being present. Similarly, with the mine matrix, the white dots refer to an
intense/high probability of mines, and the white areas for the vegetation matrix
refers to dense vegetation. The higher the value of a given cell, the more weight is
associated with passing through the given cell.
Upon running the program you will be prompted with deciding on three dif-
ferent settings, which kind of troop that is maneuvering and how much risk you
allow, the size of the area. In this example run we choose 0 (Squad) for troop type,
0 (Low risk) for the risk factor and 100 (100x100) for the size of the area.
The program then finds the optimal path, paints the terrain and paints the path
on top of the terrain. Figure 7.2 depicts the found path from coordinates (0; 0) to
(99; 99).
63
64 Chapter 7. Example of a Full Program Run
(a) Bitmap of the steepness of the given (b) Bitmap of the water depth of the
terrain. given terrain.
(c) Bitmap of areas with possibilities of (d) Bitmap of the soils ability to have
mines. mines planted.
(e) Bitmap of the amount of vegetation (f) Bitmap of the road layout and road
of the given terrain. quality of the given terrain.
Conclusion
66
Chapter 9
Discussion
Our solution is intended to collect data from various existing technologies and
combine their value when predicting landmine locations and optimize pathfind-
ing. Advanced drones capable of detecting the location of certain mines combined
with satellite imagery and internal correspondence of military forces create a more
sophisticated and refined understanding of the real world. Utilizing all the avail-
able data can be difficult for a single person to do, and while large teams are
utilized to compute this data in real-world settings[3], such teams are expensive
and can be hard-pressed to perform difficult calculations on multiple front lines
thus delaying offensive operations;
A software program, that can compute all of the available data, would be
capable of hastening decision-making, and would even be able to make decent
decisions independently of aforementioned experts. This is the core argument for
why our software program is useful and valuable in a finished version, and it is
the foundation for the conclusions we draw.
While our program does analyze terrain and optimize pathfinding under the
conditions given, there are a few considerations and points to reflect upon regard-
ing the accuracy and effectiveness of our software program.
1. The input data for our test run consists of only 6 bitmaps. The program thus
has limited data available on which to generate an optimal route.
2. The input data may not be in the form of a bitmap in the real world, and our
program does not accept other inputs.
67
68 Chapter 9. Discussion
4. Currently, the program configures matrices based on both user settings and
predefined settings. There is however a lack of relational analyses comparing
several data sources to find patterns and conditions relevant in the prediction
of minefield locations.
5. The weights used when configuring and creating our matrices are subjec-
tively decided upon, based on our own understanding of landmine place-
ment, and a more thorough examination in collaboration with military in-
telligence is necessary for optimal accuracy when calculating the optimal
route.
6. Testing and verifying the accuracy and effectiveness of our proposed solution
presents substantial challenges. (mangler en lille sektion)
7. The role of our proposed solution may be assistive rather than dictating in
real life situations (mangler en lille sektion)
Due to time constraints and the scope of this project, there is naturally a lack
of the functionality required for the program to be useful and reliable in real life
situations, especially considering the nature of the problem the group is trying
to solve, involving sending soldiers and troops into a possibly hazardous and
dangerous location. However, while there are issues as mentioned above, our
software program functionally works and analyzes the data available correctly as
it is programmed to do.
wherein our proposed solution would partake the role of an assistive technology
instead of a stand-alone, dictating tool would likely be the most suitable use of
our program.
Furthermore, although we speculate and presume that our program could be
effective in a finalized version, it is nearly impossible to verify and test our solu-
tion in the current scope for several reasons. Firstly, virtually no traversal through
a real life minefield can be replicated or simulated accurately. For this reason,
there is a lack of comparison when using our program. Secondly, a lot of data is
lacking, specifically classified data, regarding the specific challenges for individ-
ual traversals by military groups through minefields, that could’ve been evaluated
with regards to the usefulness of our program in said operation. The group be-
hind the project simply has no access to such information, unless access to military
intelligence was permitted. Consequentially, this means that the usefulness and
value of program is subject to individual interpretation and assumptions, since its
efficacy is untested in real-life minefield scenarios, and the unavailable essential
data further complicates the drawing of any definitive conclusion. However, if
one is to assume that militaries deploy landmines in a relatively rational context,
it ought to be be assumed that their location is dependant on factors and data
attainable by our program. The accuracy of our program thus depends on the cor-
rect interpretation of said data, to accurately predict the opposing forces intention
regarding their landmine placement.
The focus for this project was to build a functioning software solution capa-
ble of analyzing terrain and optimizing pathfinding through a given area. In
general, the program lacks functionality, however, the functionality that is im-
plemented works correctly. This is in accordance with our problem statement,
wherein we ask how a software solution could effectively analyze terrain and op-
timize pathfinding. We believe that it has been sufficiently showcased how such
a software solution can be developed, and a functioning, albeit unfinished version
of the software solution, has been created.
Bibliography
71
72 Bibliography
[24] Sam Itskin. CSI 3334, Data Structures. 2012. url: https : / / piazza . com /
class_profile/get_resource/h63tokvn98219n/h7btvlhumtn6gc.
[25] Kaneda et al. “Walking and running kinesiology in water: A review of the
literature”. In: Journal of Fitness Research 1.1 (2012), pp. 1–11.
[26] H. Kasban et al. “A Comparative Study of Landmine Detection Techniques”.
In: Sensing and Imaging (2010). url: https : / / www . researchgate . net /
profile/Fathi- Abd- El- Samie/publication/225752842_A_Comparative_
Study_of_Landmine_Detection_Techniques/links/0f3175361dfa5911f0000000/
A-Comparative-Study-of-Landmine-Detection-Techniques.pdf.
[27] Isabel Keane. “Frontline Ukrainian soldiers’ life expectancy just ‘four hours,’
US Marine claims”. In: New York Post (2023). url: https : / / nypost . com /
2023 / 02 / 23 / life - expectancy - on - frontline - in - ukraine - 4 - hours -
soldier/.
[28] Landminefree. “Facts About Landmines”. In: (2013). url: https://landminefree.
org / facts - about - landmines / # : ~ : text = Mines % 20kill % 20or % 20maim %
20more,15%2C000%20%E2%80%93%2020%2C000%20injuries%20each%20year.
[29] The International Compaign to ban Landmines. “A History of Landmines”.
In: (2023). url: http://www.icbl.org/en- gb/problem/a- history- of-
landmines.aspx.
[30] Ephrat Livni and Gaya Gupta. “What We Know About the War Between
Israel and Hamas”. In: New York Times (2023). url: https://www.nytimes.
com/article/israel-gaza-hamas-what-we-know.html.
[31] Jacqueline MacDonald et al. “Alternatives for Landmine Detection”. In: (2022).
url: https://web.archive.org/web/20220720001303/https://www.rand.
org/content/dam/rand/pubs/monograph_reports/MR1608/RAND_MR1608.
pdf.
[32] Minetti et al. “Energy cost of walking and running at extreme uphill and
downhill slopes”. In: Journal of Applied Physiology 93.3 (2002). PMID: 12183501,
pp. 1039–1046. doi: 10.1152/japplphysiol.01177.2001. url: https://doi.
org/10.1152/japplphysiol.01177.2001.
[33] The Landmine Monitor. Landmine Monitor 2022. 2022. url: http://www.the-
monitor.org/media/3352351/2022_Landmine_Monitor_web.pdf.
[34] Nachon and Claudio Torres. “The environmental impacts of landmines”.
In: Landmines and human security: International politics and war’s hidden legacy
(2004), pp. 191–207. url: https://www.researchgate.net/profile/Claudio-
Torres - Nachon / publication / 292482972 _ The _ environmental _ impacts _
of _ landmines / links / 626c3ac6dc014b4379738740 / The - environmental -
impacts-of-landmines.pdf.
[35] Mark Nash. “M1150 Assault Breacher Vehicle (ABV)”. In: (2018). url: https:
/ / tanks - encyclopedia . com / modern - us - m1150 - assault - breacher -
vehicle-abv/.
74 Bibliography
[50] Andrew Vian Smith. “Ground-engaging machines”. In: (2021). url: https:
//nolandmines.com/machinespart2.html.
[51] Sam Tabahriti. “Ukraine has taken delivery of its first mine-clearing ma-
chine, which was made by a British company and cost almost $500,000”.
In: (2022). url: https://www.businessinsider.com/ukraine-got-first-
armtrac-400-mine-clearing-machine-british-made-2022-10?r=US&IR=T.
[52] James Trevelyan. “Research Challenges”. In: (2022). url: https : / / web .
archive.org/web/20220920163254/https://cdn.intechopen.com/pdfs/
806/InTech-Humanitarian_demining_research_challenges.pdf.
[53] Human Rights Watch. “Landmine Use in Ukraine”. In: (2023). url: https:
//www.hrw.org/news/2023/06/13/landmine-use-ukraine.
[54] Human Rights Watch. “Questions and Answers on the New US Landmine
Policy”. In: (2020). url: https : / / www . hrw . org / news / 2020 / 02 / 27 /
questions-and-answers-new-us-landmine-policy.
[55] Emma Woollacott. “Data-Mining For The Land Mines”. In: (2023). url: https:
//ssir.org/articles/entry/data_mining_for_the_land_mines.
[56] Paola Zamparo, Matteo Cortesi, and Giorgio Gatta. “The energy cost of
swimming and its determinants”. In: European journal of applied physiology
120 (2020), pp. 41–66.