算法与Python

算法与Python 知识量:10 - 40 - 100

9.3 A*算法><

什么是A*算法- 9.3.1 -

A*(A-star)算法是一种在图中寻找最短路径的算法,它是迪克斯特拉(Dijkstra)算法的改进版。

A算法使用了启发式函数来估计从一个节点到目标节点的代价。这个启发式函数可以基于实际距离、方向、障碍物等信息。A算法在搜索过程中会优先选择那些预计代价最小的节点,这样可以更快速地找到最短路径。

在A算法中,每个节点都有一个实际代价(从起点到该节点的实际距离)和一个估计代价(从该节点到目标节点的估计距离)。A算法会根据实际代价和估计代价的组合来决定搜索的优先级。

A*算法适用于那些可以估算到达目标节点代价的情况,比如在已知地图上寻找路径,或者在游戏中寻找角色移动的路径。

算法实现- 9.3.2 -

以下是一个Python实现A*算法的示例代码:

import heapq  
  
def heuristic(a, b):  
    # 启发式函数,返回a到b的估计距离  
    return abs(a[0] - b[0]) + abs(a[1] - b[1])  
  
def a_star(graph, start, goal):  
    # 初始化距离字典和优先队列  
    distances = {node: float('inf') for node in graph}  
    distances[start] = 0  
    heap = [(0, start)]  
      
    while heap:  
        # 取出当前距离最小的节点  
        current_distance, current_node = heapq.heappop(heap)  
          
        # 如果当前节点是目标节点,返回最短路径  
        if current_node == goal:  
            path = []  
            while current_node:  
                path.append(current_node)  
                current_node = distances[current_node]  
            return path[::-1]  
          
        # 遍历当前节点的相邻节点  
        for neighbor, weight in graph[current_node].items():  
            distance = current_distance + weight + heuristic(goal, neighbor)  
            # 如果通过当前节点到达相邻节点的距离更短,则更新最短距离和优先队列  
            if distance < distances[neighbor]:  
                distances[neighbor] = distance  
                heapq.heappush(heap, (distance, neighbor))  
      
    return None  # 没有找到最短路径

其中,graph是一个字典,表示图的拓扑结构。字典的键表示顶点,值表示与该顶点相邻的顶点及其权重的字典。例如,对于有向图{'A': {'B': 1, 'C': 3}, 'B': {'A': 1, 'C': 2}, 'C': {'A': 3, 'B': 2}},表示从A到B的距离为1,从A到C的距离为3,从B到A的距离为1,从B到C的距离为2,从C到A的距离为3,从C到B的距离为2。start表示起点,goal表示目标。函数返回一个列表,表示从起点到目标的最短路径。如果找不到最短路径,则返回None。