A* Algorithm: the GPS of Computer Science
A* algorithm is one of the most popular pathfinding algorithms in computer science and AI. A* is an intelligent search algorithm that uses heuristic data to find the shortest way between two points on a graph.
In this article, we will explore the basics of A* and give you a detailed Python implementation.
1. Introduction
Invented in 1968, the A* algorithm is a fundamental element in the solution of pathfinding issues. It is employed in various applications, including video games, robotics, GPS navigation, and network routing. The name "A*" translates to "A star," indicating its capacity to efficiently locate the most suitable path.
2. Basic Concepts
2.1 Graphs and Nodes
At the core of the A* algorithm is a graph. A graph is a data structure that consists of nodes and edges. In the context of pathfinding, nodes represent points in a map or a network, and edges represent the connections or paths between those points.
2.2 Heuristics
Heuristics are rules of thumb or estimates used to guide the search for the optimal path. In A*, a heuristic function, denoted as h(n), provides an estimate of the cost from a given node to the goal node. The quality of the heuristic is crucial, as it greatly influences the algorithm's performance. A perfect heuristic would give the exact cost, but this is not always possible.
3. A* Algorithm
3.1 Algorithm Description
A* is a bestfirst search algorithm that considers both the cost to reach a node from the start node (g(n)) and the heuristic estimate of the cost from that node to the goal (h(n)). The algorithm maintains two sets, the open set, and the closed set, to explore the graph efficiently.
3.2 Open and Closed Sets
The open set contains nodes to be evaluated. Initially, it contains only the start node.
The closed set contains nodes that have already been evaluated.
The algorithm repeatedly selects the node in the open set with the lowest fscore (f(n) = g(n) + h(n)), evaluates it, and adds it to the closed set. It then expands the node by considering its neighbors and calculates their fscores.
3.3 Calculating the fscore
The fscore for a node n is calculated as follows:
“ f(n) = g(n) + h(n) ”
where,
 g(n) is the cost of the path from the start node to node n.
 h(n) is the heuristic cost estimate from node n to the goal.
3.4 Pseudocode
Here's a highlevel pseudocode for the A* algorithm (in Python):
function A_Star(start, goal):
open_set = {start}
closed_set = {}
g_score = {} # Cost from start to node
f_score = {} # Estimated total cost from start to goal through node
g_score[start] = 0
f_score[start] = h(start)
while open_set is not empty:
current = node in open_set with the lowest f_score
if current == goal:
return reconstruct_path()
open_set.remove(current)
closed_set.add(current)
for neighbor in neighbors(current):
if neighbor in closed_set:
continue
tentative_g_score = g_score[current] + dist(current, neighbor)
if neighbor not in open_set or tentative_g_score <>
g_score[neighbor] = tentative_g_score
f_score[neighbor] = g_score[neighbor] + h(neighbor)
if neighbor not in open_set:
open_set.add(neighbor)
neighbor.parent = current
return failure

4. Implementation in Python
Now, let’s implement the A* algorithm in Python:
import heapq
def a_star(graph, start, goal):
open_set = []
heapq.heappush(open_set, (0, start))
came_from = {}
g_score = {node: float('inf') for node in graph}
g_score[start] = 0
while open_set:
current_g, current = heapq.heappop(open_set)
if current == goal:
return reconstruct_path(came_from, current)
for neighbor in graph[current]:
tentative_g = g_score[current] + graph[current][neighbor]
if tentative_g <>
came_from[neighbor] = current
g_score[neighbor] = tentative_g
f_score = tentative_g + heuristic(neighbor, goal)
heapq.heappush(open_set, (f_score, neighbor))
return None
def reconstruct_path(came_from, current):
path = [current]
while current in came_from:
current = came_from[current]
path.append(current)
path.reverse()
return path

5. Applications and Variables
The A* algorithm has numerous applications, including:
 Pathfinding in video games
 GPS navigation
 Network routing
 Robotics for motion planning
 Maze solving
 Natural language processing
Several variations of A* have been developed to address specific requirements and challenges, such as Dijkstra's A* (which ignores the heuristic), Jump Point Search (optimized for gridbased maps), and Weighted A* (which balances heuristic and actual cost).
6. Conclusion
The A* algorithm provides an efficient solution to pathfinding problems by finding the shortest path on a graph. It combines the actual cost of achieving a goal with a standard estimation of the cost to achieve that goal.
An understanding of the fundamental concepts and how to implement A* can be beneficial in a variety of contexts, making it a fundamental algorithm to be familiar with for those interested in computational and artificial intelligence.