- 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
-
- #ditance of starting node from itself is zero
- g[start_node] = 0
- #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 == None or g[v] + heuristic(v) < g[n] + heuristic(n):
- n = v
-
-
- if n == stop_node or Graph_nodes[n] == 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 == None:
- print('Path does not exist!')
- return None
-
- # if the current node is the stop_node
- # then we begin reconstructin the path from it to the start_node
- if n == stop_node:
- path = []
-
- while parents[n] != n:
- path.append(n)
- n = parents[n]
-
- path.append(start_node)
-
- path.reverse()
-
- print('Path found: {}'.format(path))
- return path
-
-
- # remove n from the open_list, and add it to closed_list
- # because all of his neighbors were inspected
- open_set.remove(n)
- closed_set.add(n)
-
- print('Path does not exist!')
- return None
-
- #define fuction 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 = {
- 'START': 550,
- 'A': 550,
- 'B': 450,
- 'C': 510,
- 'D': 325,
- 'E': 415,
- 'F': 235,
- 'G': 455,
- 'H': 400,
- 'I': 325,
- 'J': 240,
- 'K': 170,
- 'L': 205,
- 'GOAL': 0,
-
- }
-
- return H_dist[n]
-
- #Input goes here
- Graph_nodes = {
- 'START': [('A', 120), ('I', 142), ('G', 77)],
- 'A': [('B', 113)],
- 'B': [('C', 72)],
- 'C': [('D', 77)],
- 'D': [('E', 122)],
- 'E': [('F', 126)],
- 'F': [('L', 148), ('K', 140)],
- 'G': [('H', 71)],
- 'H': [('I', 122)],
- 'I': [('J', 111), ('L', 99)],
- 'J': [('GOAL', 213)],
- 'K': [('GOAL', 105)],
- 'L': [('K', 99)],
-
- }
- aStarAlgo('START', 'GOAL')