DEPARTMENT OF
COMPUTER SCIENCE & ENGINEERING
Experiment-1.1
Student Name: Preet Kumar UID: 21BCS2931
Branch: CSE Section/Group:21BCS-627/A
Semester: 5th Date of Performance: 17/08/23
Subject Name: AIML Subject Code: 21CSH-316
1. Aim: Implement A* algorithm in python.
2. Objective: Implement the A* algorithm to efficiently find the shortest
path in a graph while considering both the cost to reach a node and a
heuristic estimate of its potential to reach the goal.
3. Algorithm Loop:
1. While the open_set is not empty:
Find the node n in the open_set with the lowest value of f(n) = g(n) + h(n),
where g(n) is the cost to reach node n from the start node and h(n) is the
heuristic estimate of the cost to reach the goal from node n.
2. If n is the goal node, the shortest path has been found. Reconstruct the
path using the parents dictionary and return it.
3. Move n from the open_set to the closed_set to mark it as evaluated.
4. Source Code:
def aStarAlgo(start_node, stop_node):
open_set = set([start_node]) closed_set
= set()
g = {} # store distance from starting node
parents = {} # parents contains an adjacency map of all nodes
# distance of starting node from itself is zero g[start_node]
=0
DEPARTMENT OF
COMPUTER SCIENCE & ENGINEERING
# start_node is root node i.e it has no parent nodes
# so start_node is set to its own parent node
parents[start_node] = start_node
while len(open_set) > 0:
n = None
# node with lowest f() is found for
v in open_set:
if n is None or g[v] + heuristic(v) < g[n] + heuristic(n):
n=v
if n == stop_node or Graph_nodes[n] is None: pass
else:
for (m, weight) in get_neighbors(n):
# nodes 'm' not in first and last set are added to first
# n is set its parent if m not in open_set and
m not in closed_set:
open_set.add(m)
parents[m] = n g[m]
= g[n] + weight
# for each node m, compare its distance from start i.e g(m) to the
# from start through n node else:
if g[m] > g[n] + weight: #
update g(m) g[m] = g[n]
+ weight # change parent
of m to n parents[m] = n
# if m in closed set, remove and add to
open if m in closed_set:
closed_set.remove(m) open_set.add(m)
# if n is still None, then path does not exist
if n is None: print('Path does not exist!')
return None
# if the current node is the stop_node
# then we begin reconstruction the path from it to the start_node
if n == stop_node:
path = [] while
parents[n] != n:
DEPARTMENT OF
COMPUTER SCIENCE & ENGINEERING
path.append(n) n =
parents[n]
path.append(start_node)
path.reverse()
print('Path found: {}'.format(path)) return
path
# remove n from the open_set, and add it to closed_set #
because all of its neighbors were inspected
open_set.remove(n)
closed_set.add(n)
print('Path does not exist!') return
None
# define function to return neighbor and its distance
# from the passed node def
get_neighbors(v):
if v in Graph_nodes:
return Graph_nodes[v] else:
return None
# for simplicity, we'll consider heuristic distances given
# and this function returns heuristic distance for all
nodes def heuristic(n):
H_dist = {
'A': 11,
'B': 6,
'C': 99,
'D': 1,
'E': 7,
'G': 0,
}
return H_dist[n]
# Describe your graph here Graph_nodes
={
'A': [('B', 2), ('E', 3)],
'B': [('C', 1), ('G', 9)],
'C': None,
DEPARTMENT OF
COMPUTER SCIENCE & ENGINEERING
'E': [('D', 6)],
'D': [('G', 1)],
}
print('Name – Preet
Kumar')
print('UID - 21BCS2931')
aStarAlgo('A', 'G')
5. Output: