Lecture 7
This commit is contained in:
parent
82a6d35942
commit
4bad896096
@ -2,7 +2,7 @@ import math
|
|||||||
from typing import Callable
|
from typing import Callable
|
||||||
import re
|
import re
|
||||||
from graph import Graph, AdjacencyListGraph, AdjacencyMatrixGraph, NodeColor, Vertex
|
from graph import Graph, AdjacencyListGraph, AdjacencyMatrixGraph, NodeColor, Vertex
|
||||||
|
import heapq
|
||||||
|
|
||||||
def a_star(self, start_name: str, end_name: str, heuristic: Callable[[Vertex], float]):
|
def a_star(self, start_name: str, end_name: str, heuristic: Callable[[Vertex], float]):
|
||||||
color_map = {} # maps vertices to their color
|
color_map = {} # maps vertices to their color
|
||||||
@ -15,6 +15,8 @@ def a_star(self, start_name: str, end_name: str, heuristic: Callable[[Vertex], f
|
|||||||
return math.inf
|
return math.inf
|
||||||
return distance_map[vertex] + heuristic(vertex)
|
return distance_map[vertex] + heuristic(vertex)
|
||||||
|
|
||||||
|
Vertex.__lt__ = lambda self, other: cost(self) < cost(other)
|
||||||
|
|
||||||
# Initialize the maps
|
# Initialize the maps
|
||||||
for vertex in self.all_vertices():
|
for vertex in self.all_vertices():
|
||||||
color_map[vertex] = NodeColor.WHITE
|
color_map[vertex] = NodeColor.WHITE
|
||||||
@ -27,12 +29,15 @@ def a_star(self, start_name: str, end_name: str, heuristic: Callable[[Vertex], f
|
|||||||
distance_map[start_node] = 0
|
distance_map[start_node] = 0
|
||||||
|
|
||||||
# Initialize the queue with the start vertex
|
# Initialize the queue with the start vertex
|
||||||
queue = [start_node]
|
queue = [] # Use a list instead of a deque, because we need to sort it with
|
||||||
|
heapq.heappush(queue, start_node)
|
||||||
|
|
||||||
# Process the queue
|
# Process the queue
|
||||||
while len(queue) > 0:
|
while len(queue) > 0:
|
||||||
queue.sort(key=cost)
|
vertex = heapq.heappop(queue)
|
||||||
vertex = queue.pop(0)
|
if color_map[vertex] == NodeColor.BLACK:
|
||||||
|
# Skip already processed vertices (possibly with a higher cost)
|
||||||
|
continue
|
||||||
if vertex.value == end_name:
|
if vertex.value == end_name:
|
||||||
# Return the distance and predecessor maps
|
# Return the distance and predecessor maps
|
||||||
return distance_map, predecessor_map
|
return distance_map, predecessor_map
|
||||||
@ -44,8 +49,8 @@ def a_star(self, start_name: str, end_name: str, heuristic: Callable[[Vertex], f
|
|||||||
continue
|
continue
|
||||||
predecessor_map[dest] = vertex
|
predecessor_map[dest] = vertex
|
||||||
distance_map[dest] = distance_map[vertex] + weight
|
distance_map[dest] = distance_map[vertex] + weight
|
||||||
|
heapq.heappush(queue, dest)
|
||||||
if color_map[dest] == NodeColor.WHITE:
|
if color_map[dest] == NodeColor.WHITE:
|
||||||
queue.append(dest)
|
|
||||||
color_map[dest] = NodeColor.GRAY
|
color_map[dest] = NodeColor.GRAY
|
||||||
color_map[vertex] = NodeColor.BLACK
|
color_map[vertex] = NodeColor.BLACK
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user