扩展邻域A* Astar astar路径规划 A星路径规划算法 基于珊格地图的路径规划 因代码具有可复制性,

A*算法(A-Star)是一种经典的路径规划算法,在栅格地图中被广泛应用。它结合了Dijkstra算法和贪心算法的思想,通过使用启发式函数来估计到目标的代价,从而在路径规划中表现出较高的效率。
A*算法的基本原理
A*算法的核心在于使用一个优先队列(通常用最小堆实现)来选择下一步扩展的节点。每个节点的总代价F(n)由两部分组成:
- G(n):从起点到当前节点n的实际代价。
- H(n):从当前节点n到目标节点的启发式估计代价(通常使用曼哈顿距离或欧氏距离)。
算法每次从优先队列中取出F(n)最小的节点进行扩展,直到找到目标节点。
栅格地图的表示
栅格地图通常可以用一个二维数组表示,其中每个元素表示一个栅格的状态(如0表示可通过,1表示障碍物)。
python
grid = [
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0]
]
扩展邻域A*算法
传统的A算法通常使用4个方向(上下左右)或8个方向进行扩展。扩展邻域A算法通过增大扩展的范围,可以更有效地找到全局最优路径。
八邻域扩展
八邻域扩展允许从当前节点向八个方向移动,这有助于更灵活地避开障碍物。
python
# 八邻域的移动方向
directions = [
(-1, 0), # 上
(1, 0), # 下
(0, -1), # 左
(0, 1), # 右
(-1, -1), # 左上
(-1, 1), # 右上
(1, -1), # 左下
(1, 1) # 右下
]
启发式函数
使用欧氏距离作为启发式函数,可以更好地估计到目标的距离。
python
def heuristic(node, goal):
return ((node[0] - goal[0]) ** 2 + (node[1] - goal[1]) ** 2) ** 0.5
算法实现
以下是扩展邻域A*算法的一个简单实现:
python
import heapq
def astar(grid, start, goal):
open_set = []
heapq.heappush(open_set, (0, start))
came_from = {}
g_score = { (x, y): float('inf') for x in range(len(grid)) for y in range(len(grid[0])) }
g_score[start] = 0
f_score = { (x, y): float('inf') for x in range(len(grid)) for y in range(len(grid[0])) }
f_score[start] = heuristic(start, goal)
while open_set:
current = heapq.heappop(open_set)
current_node = current[1]
if current_node == goal:
break
for move in directions:
neighbor = (current_node[0] + move[0], current_node[1] + move[1])
if 0 <= neighbor[0] < len(grid) and 0 <= neighbor[1] < len(grid[0]):
if grid[neighbor[0]][neighbor[1]] == 1:
continue
tentative_g_score = g_score[current_node] + 1
if tentative_g_score < g_score[neighbor]:
came_from[neighbor] = current_node
g_score[neighbor] = tentative_g_score
f_score[neighbor] = g_score[neighbor] + heuristic(neighbor, goal)
heapq.heappush(open_set, (f_score[neighbor], neighbor))
return came_from
代码分析
- 优先队列 :使用
heapq模块实现优先队列,方便快速取出F(n)最小的节点。 - 启发式函数 :
heuristic函数使用欧氏距离,可以更快地向目标靠近。 - 扩展邻域 :通过
directions列表定义了八邻域移动,增加了算法的灵活性。
总结
扩展邻域A算法在传统A算法的基础上,通过增加扩展的方向数量,能够更有效地找到全局最优路径。上述代码实现了一个简单的八邻域扩展A*算法,适用于大多数栅格地图的路径规划问题。

扩展邻域A* Astar astar路径规划 A星路径规划算法 基于珊格地图的路径规划 因代码具有可复制性,
