示例:创建一个5x5的栅格地图

扩展邻域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星路径规划算法 基于珊格地图的路径规划 因代码具有可复制性,

相关推荐
不绝1912 天前
导入3D模型时相关参数设置/Model标签页/Rig标签页/Avatar相关参数/Animation标签页/Materia标签页
unity·游戏程序
m0_641031055 天前
iOS签名是什么?为什么苹果APP需要签名
经验分享·科技·ios·游戏程序
玉梅小洋5 天前
Unity 2D游戏开发 Ruby‘s Adventure 2:主角和第一脚本
游戏·unity·游戏引擎·游戏程序·ruby·游戏开发
玉梅小洋7 天前
Unity 2D游戏开发 Ruby‘s Adventure 1:课程介绍和资源导入
游戏·unity·游戏引擎·游戏程序·ruby
软件资深者20 天前
植物大战僵尸1经典版(小游戏)+超强辅助工具 自动收取阳光
windows·游戏程序·windows11
孟无岐22 天前
【Laya】Socket 使用指南
websocket·typescript·游戏引擎·游戏程序·laya
Watermelo61722 天前
随机扣款实现赛博共产主义,《明日方舟:终末地》公测支付事故复盘
数据库·后端·游戏程序·技术美术·用户体验·游戏策划·游戏美术
晚霞的不甘22 天前
Flutter 方块迷阵游戏开发全解析:构建可扩展的关卡式益智游戏
前端·flutter·游戏·游戏引擎·游戏程序·harmonyos
孟无岐25 天前
【Laya】HttpRequest 网络请求
网络·typescript·游戏引擎·游戏程序·laya