算法与Python 知识量:10 - 40 - 100
A*(A-star)算法是一种在图中寻找最短路径的算法,它是迪克斯特拉(Dijkstra)算法的改进版。
A算法使用了启发式函数来估计从一个节点到目标节点的代价。这个启发式函数可以基于实际距离、方向、障碍物等信息。A算法在搜索过程中会优先选择那些预计代价最小的节点,这样可以更快速地找到最短路径。
在A算法中,每个节点都有一个实际代价(从起点到该节点的实际距离)和一个估计代价(从该节点到目标节点的估计距离)。A算法会根据实际代价和估计代价的组合来决定搜索的优先级。
A*算法适用于那些可以估算到达目标节点代价的情况,比如在已知地图上寻找路径,或者在游戏中寻找角色移动的路径。
以下是一个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。
Copyright © 2017-Now pnotes.cn. All Rights Reserved.
编程学习笔记 保留所有权利
MARK:3.0.0.20240214.P35
From 2017.2.6