GameAI_Astar

Pathfinding
A* Algorithm and Map Representations
Pathfinding Superstar: A* Algorithm
 A* Algorithm  One of the most, if not THE most used
pathfinding algorithm in game dev today
 Appeal: Almost guaranteed to find the best path between any
starting point and ending point, assuming, that a path exists
 Efficiency: Does not require complete exploration of all
possible paths to arrive at a best path
Ultimate algorithm?
 If a clear line-of-sight with no obstacles exists, the A*
algorithm may be overkill and inefficient
 Consumption of processing can be demanding if we need to
perform simultaneous pathfinding for a large number of
game characters
 However, in many cases, A* algorithm (and its variants) is the
best choice
A* Algorithm – Define Search Area
 1st Step: Define the Search Area
 Define a way of representing the game world to allow the
search algorithm to search for and find the best path
 Game characters and objects must occupy “points” on the
map
 In TBE, tiles can be used as points
 In CE, there is a LARGE number of points that
characters/objects can occupy. So, A* is not practical UNLESS
simplification of the search area or the points can be done…
A* Algorithm – Define Search Area
 For now, we assumed a TBE (Map representations will be
discussed later)
 Nodes can be placed throughout game world, so that paths
can be build between nodes
 Not necessarily between
every possible point in world
 Think: This simplification can
also be implemented for CE!
A* Algorithm – Define Search Area
 Even this could be too many nodes. Nodes do not need to
correspond directly to every possible tank position – can be
reduced (simplify further!)
A* Algorithm – Define Search Area
 In a TBE, “points” on the world are not unreasonably large, so
each tile can be regarded as a node in a search area
 TBEs are well-suited for the A* algorithm
 No need to maintain list of links because they are already
adjacent in the game world
 Cost of moving from one node to
an adjacent node is also uniform
(unless you regard the diagonal
movements as 1.414 times the
normal moving cost )
A* Algorithm – Starting the Search
 2nd Step: Starting the Search
 Example scenario
 Starting node: Spider at centre
 Ending node: Human location
 Solid black tiles: Wall obstacles
 White tiles: Walkable areas
 Main Idea:
 Search begins at the starting node,
and branches out to surrounding nodes, Repeat this branching
until ending node is reached
 Need to keep track which tiles have been searched
A* Algorithm – Starting the Search
 Main Idea (cont’d):
 Whenever a node has been searched,
add it to the open list.
 Traverse the open list and continue
searching nodes that are adjacent to
each node on the list
 Only valid nodes (walkable) are
considered
 Also, a closed list will contain nodes
that have been checked and no longer needs to be examined. We
add a node to this list once all its adjacent tiles have been
checked
A* Algorithm – Starting the Search
 Main Idea (cont’d):
 Also, a closed list will contain
nodes that have been checked and
no longer needs to be examined
 We add a node to this list once all
its adjacent tiles have been checked
A* Algorithm – Starting the Search
 Main Idea (cont’d):
 We need to know how the adjacent
nodes are link together  Track the
parent node of each node in the
open list
 Example: Each node in the open list
is “linked” to the starting tile as its
parent node
 A TREE structure is needed…
 Ultimately, we will use the parent links to trace a path back to
the starting node once we reach the ending node.
A* Algorithm – Starting the Search
 Question: At each branching step, how do we determine
which adjacent tile (which are now nodes in the open list) to
check and “move to” ?
A* Algorithm – Scoring
 A score is applied to each tile. This “score” should give us an
idea of which tile is the “best” choice (or best path towards
destination)
 Idea: There are 2 components involve in determining a “score”
for a potential path when we are on a tile/node
Starting node
Current node
Ending node
Total path cost or Score
 Cost to move from starting node to current node
 Cost to move from current node to ending node
 Adding these two costs together to get total cost or “score”
A* Algorithm – Scoring
 Score (at a given node)
= Cost from Start + Cost to End
 Cost of moving from initial location is easy (should already be
known by summing cost taken to reach current position)
 However, how do we determine the cost of moving from a
given tile to the destination tile?? Guess??
A* Algorithm – Scoring
 Yes. Guess.
 Make a guess, use a heuristic
 Score (at a given node), f(n)
= Cost from Start , g(n)+ Heuristic, h(n)
 Heuristic is an estimate of the cost of getting from the given
tile to the destination tile
 The simplest heuristic that we can use is to estimate the
number of steps from the given tile to the destination tile
(w/o taking obstacles into consideration since we can’t see
into the future if the obstacles already exist!)
A* Algorithm – Heuristics
 2 types of heuristics:
 Pre-computed exact heuristics: Pre-compute the length of
the shortest path between every pair of points. Not feasible for
most game maps. Remedy: Fit a coarse grid on top of fine grid
 Linear exact heuristics: Assuming no obstacles, no slow
terrain, just compute shortest path from start to goal in a
straight line
 Types of heuristic functions:
 Manhattan distance (4-direction)
 Diagonal distance or Chebyshev distance (8-direction)
 Euclidean distance (any direction)
A* Algorithm – Scoring
 Now, calculated the total cost, f(n) for all adjacent (child)
nodes of the current node.
 Example: Determining total cost
(using diagonal distance as heuristic)
f=4
h=3
g=1
 Tile with the lowest total cost will
equate to a shorter path, so this tile
will be chosen first from the open list
on the next iteration
 We actually have THREE tiles with the lowest total cost of 4.
Which to choose then?
A* Algorithm – Scoring
 Simple rule: Choose any. It doesn’t matter (we will see later
how certain paths that reach a dead end have to retract back..)
 More complex: “Tie-breaking” methods (refer to Amit’s A*
notes)
 Let’s say we simply choose the
upper right tile (5,6) to move to
 Algorithm is repeated in the next
iteration, to search for adjacent tiles
that are a) not previously examined
(not in open list) and, b) not obstacles
A* Algorithm – Scoring
 In this case, only 2 tiles (5,7)
and (6,7) qualify
 Add these two tiles to the open list
g =2
h=3
f=5
 Calculate the total cost of these new
tiles
 Move node (5,6) to close list
 Repeat the process again
 Search the open list for the tile with
the lowest cost, expand that tile and so on…
g =2
h=4
f=6
A* Algorithm – Scoring
 Run through the steps again to continue the pathfinding
process…
 Note: It is good practice to keep an open and closed list nearby
when you work this out
A* Algorithm – Scoring
 When we reach the destination,
how does the algorithm determine
when we reached it?
 Iteration in algorithm ENDS when destination node/tile is
added to the open list
A* Algorithm – Scoring
 The path is found by following the
parent links back to the starting
point
 It is possible to find other paths
of equal length
A* Algorithm – Dead End
 It is possible that no valid path
exists between any two given points,
so how do we know when we have
reached a dead end?
 If there are no more members in the
open list to examine anymore, a
dead end is reached
A* Algorithm – Summary
 Pseudocode
add the starting node to the open list
while the open list is not empty
{
current node=node from open list with the lowest cost
if current node = goal node then
path complete
else
move current node to the closed list
examine each node adjacent to the current node
for each adjacent node
if it isn't on the open list and isn't on
the closed list and it isn't an obstacle
then
move it to open list and calculate cost
}
Map Representations
 Before A* Algorithm can be implemented, we need to know
what type of map representation to use
 “The map representation can make a huge difference in the
performance and path quality”, Amit Patel, Stanford
 Pathfinding algorithms are worse than linear
 Doubling distance travel, it takes more than twice as long to find
the path!
 The fewer nodes you use, the faster A* will be
 The closer the nodes match the positions that units move to, the
better the path quality
Map Representations
 Grids
 Uniform subdivision of the world into small “tiles”
 Square, triangle, isometric, hexagonal, etc.
 Within grids, you have a choice of different movements
 Tile movement
 Edge movement
 Vertex movement
Map Representations
 Polygonal Maps
 If movement cost across large areas are uniform AND if your
units can move in straight lines instead of following grid, use
this non-grid representation as alternative
 OK to use non-grid graph for pathfinding on top of grid world
 Navigation points are computed to build a visibility graph
Map Representations
 Visibility graphs can be a computational nightmare in maps
with open areas or long corridors!
Map Representations
 Navigation Meshes
 Represent walkable areas with non-overlapping polygons also
called a navigation mesh
 We can treat this much like how we treat grids  Choice of
using polygon centers, edges or vertices as points
Map Representations
 Navigation Meshes – Determining points
Polygon Movement
Polygon Edge Movement
Polygon Vertex Movement
 The pink path shows the ideal smoothened path
Map Representations
 Hierarchical
 A flat map has only one level of representation in a map, for e.g.
tiles
 Higher levels of representation can be carved out to define
larger rooms, or buildings or entire worlds
 Multiple levels of pathfinding can be combined in hierarchical
manner
 Example: An NPC finds a path from one location to another
within a cave, then exits the cave and finds a path from the cave
to another connected cave, and then exits the cave to find a path
to the forest or city. Can you see the different levels of map
representation?
Map Representations
 Hierarchical
 A hierarchical map has many levels of representation
 A heterogeneous hierarchy typically has a fixed number of
levels, each with different characteristics
 Putting many “layers” of worlds on top of one another
Map Representations
 Hierarchical
 A hierarchical graph can be constructed to accommodate
different levels
 Connections between higher level nodes need to reflect the
ability to move between lower-level grouped areas
Next lesson
 Implementing A* Pathfinding with…
 Terrain Cost
 Influence Mapping