A*算法实战:从原理到Python实现(附完整代码与可视化)

A*算法求解迷宫问题(算法讲解与证明、python实现与可视化) A*算法是一种有序搜索算法,其特点在于对估价函数的定义上。对于一般的有序搜索,总是选择f值最小的节点作为扩展节点。因此,f是根据需要找到一条最小代价路径的观点来估算节点的,所以,可考虑每个节点n的估价函数值f(n)有两个分量:从起始节点到节点n的代价g(n)以及从节点n到达目标节点的代价h(n),即f(n)=g(n)+h(n)。 迷宫问题是实验心理学中一个古典问题。迷宫从入口到出口可能有若干条通路,本实验要求求出从入口到出口的最短路径。 阅读详情

1. 从游戏到现实:A*算法到底能做什么?

如果你玩过《星际争霸》或者《魔兽世界》,一定对游戏里那些会自动寻路的单位印象深刻。它们能聪明地绕过树林、山丘和建筑,找到一条通往目的地的“最短”路径。这背后,十有八九就是A*算法在默默工作。

A*算法,读作“A-Star”,是一种在图中寻找最短路径的启发式搜索算法。它最早在1968年被三位大神提出,但直到今天,依然是游戏开发、机器人导航、地图服务等领域的核心算法之一。我刚开始接触它的时候,觉得这名字挺酷,后来发现它的思想更酷——它就像一个既务实又乐观的向导:务实在于,它会精确计算你已经走了多远(实际成本);乐观在于,它会估计你离目标还有多远(启发式估计)。两者结合,就能高效地找到终点。

简单来说,A*算法能帮你解决这类问题:在一个布满障碍物的空间里(比如一个迷宫、一张城市地图、或者一个游戏场景),如何从A点出发,找到一条最短、最合理的路径到达B点?它不只是“能走通”,而是要“走得好”。我在机器人项目中用它来做室内导航,实测下来非常稳,只要地图建模准确,它规划出的路径几乎就是人类直觉上会选的那条。

2. 拆解A*:三个核心数字与两个关键列表

A算法的核心思想,其实就围绕着三个数字和两个列表展开。理解了它们,你就掌握了A的命脉。

2.1 三个核心数字:g(n), h(n), f(n)

我们可以把每个待考察的位置(称为“节点”)想象成一个求职者,而算法是面试官,要从一堆求职者里挑出最有希望的那个。

  • g(n) - “你已经付出的代价”:这是从起点走到当前节点 n 所花费的实际成本。比如,你每走一步,g(n) 就加1。它代表了你已经付出的努力,是确凿无疑的。在代码里,g 值是通过累加每一步的移动成本计算出来的。
  • h(n) - “你离成功的估计距离”:这是从当前节点 n 到终点的估计成本。注意,这里是“估计”!我们用一个叫“启发式函数”的东西来猜这个距离。常用的猜法有直线距离(欧几里得距离)或者只走横竖的格子距离(曼哈顿距离)。h(n) 体现了算法的“眼光”和导向性,它让算法更倾向于朝终点方向探索。
  • f(n) - “你的综合得分”:这是最终的评价标准,f(n) = g(n) + h(n)。A*算法总是优先选择 f(n) 值最小的节点进行下一步探索。这很合理,因为 f(n) 小,意味着“已付出代价”加上“预计剩余代价”的总和最小,这条路看起来最有希望最快到达终点。

这里有个至关重要的原则:启发式函数 h(n) 必须“可采纳”,也就是说,它估计的距离绝对不能大于实际的真实最短距离。你可以保守估计,但不能盲目乐观。如果 h(n) 高估了,算法可能会被误导,从而找不到真正最短的路径;但只要 h(n) 从不“吹牛”,A*算法就一定能保证找到最优解。

2.2 两个关键列表:开放列表与封闭列表

算法在运行过程中,需要两个列表来管理节点,你可以把它们看作“待考察名单”和“已淘汰名单”。

  • 开放列表 (Open List):这里存放所有已被发现但还未考察的节点。它通常用一个优先队列(比如Python的heapq)来实现,确保我们总能以很低的代价(O(log n))取出其中 f(n) 值最小的那个节点。这个列表是算法探索的前沿阵地。
  • 封闭列表 (Closed List):这里存放所有已经考察完毕的节点。一旦一个节点被从开放列表中取出,并检查了它所有的邻居后,它就会被移入封闭列表。这主要是为了防止算法在原地打转,重复检查同一个节点。

算法流程的通俗比喻:

  1. 把起点放进“待考察名单”(开放列表)。
  2. 从“待考察名单”里找出那个“综合得分”(f(n))最高(实际上是最小,因为我们希望总代价小)的候选人。
  3. 面试他:看看他是不是终点?如果是,恭喜,找到路径了!如果不是,就看看他有哪些邻居(比如上下左右四个格子)。
  4. 对于每个邻居:如果它在“已淘汰名单”(封闭列表)里,或者是个障碍物,就跳过。否则,计算这个邻居的 g, h, f 值。如果这个邻居是新人,就把它加入“待考察名单”;如果它已经在名单里,但这次我们找到了一条 g 值更小的路(即更优的路径)到达它,那就更新它的信息(g值、f值和“上级领导”——父节点)。
  5. 把当前这位候选人移入“已淘汰名单”。
  6. 重复步骤2-5,直到找到终点,或者“待考察名单”空了(说明无路可通)。

这个过程就像一支训练有素的搜索队,总是派最有希望的人去探索新的区域,并且不断优化已经发现的路线。

3. 手把手实现:用Python为迷宫寻路

理论说再多,不如亲手写一遍代码来得实在。下面,我们就用一个经典的“迷宫寻路”场景,来一步步实现A*算法。我会用详细的注释带你走通每一行代码。

3.1 搭建舞台:定义节点与迷宫

首先,我们需要定义一个Node类,用来代表迷宫中的每一个格子(节点)。它需要记录自己的位置、父节点(用于最后回溯路径),以及核心的 g, h, f 值。

import heapq
import matplotlib.pyplot as plt
import numpy as np

class Node:
    """节点类,代表搜索树中的每一个位置"""
    def __init__(self, parent=None, position=None):
        self.parent = parent    # 父节点,用于回溯路径
        self.position = position  # 节点在迷宫中的坐标 (row, column)
        self.g = 0  # 从起点到本节点的实际代价
        self.h = 0  # 从本节点到终点的估计代价
        self.f = 0  # 总评估代价 f = g + h

    # 定义“相等”比较,我们只关心位置是否相同
    def __eq__(self, other):
        return self.position == other.position

    # 定义“小于”比较,用于优先队列中根据f值排序
    def __lt__(self, other):
        return self.f < other.f

接下来,我们创建一个迷宫。我们用NumPy数组来表示,0代表可通行的路,1代表障碍物。为了有点挑战性,我们创建一个100x100的大迷宫,并放上几个不规则的障碍块。

# 创建迷宫地图
maze_size = 100
maze = np.zeros((maze_size, maze_size), dtype=int) # 全部初始化为0(可通行)

# 设置几个矩形障碍物区域 (起始行, 起始列, 高度, 宽度)
obstacles = [
    (10, 10, 20, 20),
    (30, 40, 20, 30),
    (60, 20, 15, 10),
    (80, 50, 10, 45),
]

for y_start, x_start, height, width in obstacles:
    maze[y_start:y_start+height, x_start:x_start+width] = 1

# 定义起点和终点
start = (0, 0)      # 左上角
end = (92, 93)      # 右下角附近

# 确保起点和终点不是障碍物(虽然我们设置的不是,但这是个好习惯)
maze[start] = 0
maze[end] = 0

3.2 核心引擎:A*搜索函数

现在,重头戏来了——实现A*搜索函数 astar()。它会按照我们前面讲的流程,操作开放列表和封闭列表,直到找到路径或宣告失败。

def astar(maze, start, end):
    """A*算法主函数"""
    # 创建起点和终点节点
    start_node = Node(None, start)
    end_node = Node(None, end)

    # 初始化开放列表和封闭列表
    open_list = []  # 使用堆(优先队列)存储 (f值, 节点)
    closed_list = [] # 普通列表存储已处理节点

    # 将起点加入开放列表
    heapq.heappush(open_list, (start_node.f, start_node))

    # 主循环:当还有节点待考察时继续
    while open_list:
        # 取出当前f值最小的节点
        current_f, current_node = heapq.heappop(open_list)

        # 将其加入封闭列表,表示已处理
        closed_list.append(current_node)

        # 找到目标!开始回溯路径
        if current_node == end_node:
            path = []
            while current_node:
                path.append(current_node.position)
                current_node = current_node.parent
            return path[::-1]  # 反转路径,从起点到终点

        # 获取当前节点的四个邻居(上,下,左,右)
        x, y = current_node.position
        neighbors = [(x-1, y), (x+1, y), (x, y-1), (x, y+1)]

        for neighbor_pos in neighbors:
            # 检查邻居是否在地图范围内
            if (0 <= neighbor_pos[0] < maze.shape[0]) and (0 <= neighbor_pos[1] < maze.shape[1]):
                # 检查邻居是否是障碍物
                if maze[neighbor_pos[0], neighbor_pos[1]] == 1:
                    continue

                # 创建邻居节点对象
                neighbor = Node(current_node, neighbor_pos)

                # 如果邻居已在封闭列表,跳过
                if neighbor in closed_list:
                    continue

                # 计算邻居的g, h, f值
                # g值:父节点的g值 + 1(假设每步成本为1)
                neighbor.g = current_node.g + 1
                # h值:使用欧几里得距离的平方作为启发函数(避免开方计算,节省时间,且不影响比较)
                neighbor.h = (end_node.position[0] - neighbor_pos[0]) ** 2 + (end_node.position[1] - neighbor_pos[1]) ** 2
                neighbor.f = neighbor.g + neighbor.h

                # 检查是否应将邻居加入开放列表
                should_add = True
                for _, open_node in open_list:
                    if neighbor == open_node and neighbor.g >= open_node.g:
                        # 如果开放列表中已有该节点,且新路径的g值更差或相等,则不添加/更新
                        should_add = False
                        break

                if should_add:
                    heapq.heappush(open_list, (neighbor.f, neighbor))

    # 开放列表已空,未找到路径
    return None

这里有个细节值得注意:我计算 h(n) 时用了距离的平方,而不是真正的欧几里得距离。这是因为开方运算比较耗时,而我们在比较 f(n) 大小时,只需要一个单调的估计值。距离平方和欧几里得距离在大小关系上是一致的,所以不影响算法选择节点的顺序,还能提升一点速度。这是一种常见的小优化。

3.3 让结果一目了然:路径可视化

算法跑完了,给我们一串坐标。但看着一堆数字哪有直观的图像来得爽?我们用Matplotlib把迷宫和找到的路径画出来。

def visualize_path(maze, path, start, end):
    """可视化迷宫和找到的路径"""
    # 创建迷宫的一个副本用于绘制
    display_maze = np.array(maze)

    # 将路径上的点在副本中标记为特殊值(例如0.5)
    for (y, x) in path:
        display_maze[y, x] = 0.5

    plt.figure(figsize=(12, 12))

    # 绘制迷宫:障碍物为白色,通路为黑色,路径为灰色
    plt.imshow(display_maze, cmap='hot', interpolation='nearest')
    # hot颜色映射:低值(0,通路)为黑色,高值(1,障碍)为白色,中间值(0.5,路径)为红黄色

    # 提取路径的x,y坐标用于画线
    path_y = [p[0] for p in path]  # 行坐标
    path_x = [p[1] for p in path]  # 列坐标
    plt.plot(path_x, path_y, color='cyan', linewidth=2, label='A* Path') # 用青色线描出路径

    # 标记起点和终点
    start_y, start_x = start
    end_y, end_x = end
    plt.scatter([start_x], [start_y], color='lime', s=200, marker='o', label='Start', zorder=5)
    plt.scatter([end_x], [end_y], color='red', s=200, marker='*', label='Goal', zorder=5)

    plt.legend()
    plt.title('A* Algorithm Pathfinding in a Maze')
    plt.show()

3.4 运行与观察

最后,我们把所有部分组合起来,运行并看看效果。

# 运行A*算法
print("开始A*路径搜索...")
path = astar(maze, start, end)

if path:
    print(f"路径找到!共 {len(path)} 步。")
    # 打印前几个和最后几个路径点,避免刷屏
    print("路径前5步:", path[:5])
    print("...")
    print("路径后5步:", path[-5:])
    visualize_path(maze, path, start, end)
else:
    print("未找到可行路径。")

运行这段代码,你会看到一个弹窗,显示一幅热图。其中黑色的背景是通路,白色的方块是障碍物,一条青色的线蜿蜒穿过迷宫,连接着绿色的起点和红色的终点。这就是A*算法为我们找到的最短路径。你可以尝试调整起点、终点的位置,或者增加更复杂的障碍物,看看算法如何应对。

4. 不止于迷宫:A*算法的实战变招与优化

掌握了基础版本,我们就可以聊聊A*在实际项目中更高级的玩法和需要注意的“坑”了。

4.1 启发式函数的选择:曼哈顿、欧几里得与对角线距离

h(n) 的选择直接影响搜索效率。除了我们用的欧几里得距离,还有几个常见选项:

距离类型计算公式 (从点A到点B)适用场景
曼哈顿距离abs(Ax - Bx) + abs(Ay - By)只能朝上下左右四个方向移动的网格(如经典2D游戏)。它绝对可采纳。
欧几里得距离sqrt((Ax - Bx)^2 + (Ay - By)^2)可以朝任意方向移动的连续或网格环境(如机器人导航)。它也是可采纳的。
切比雪夫距离max(abs(Ax - Bx), abs(Ay - By))可以朝八个方向(包括对角线)移动的网格,且对角线移动成本与水平/垂直相同。

在代码中,你可以很容易地替换启发式函数。比如,对于四方向移动的网格,使用曼哈顿距离通常更合适,因为它更贴合移动成本,且计算更快。

# 曼哈顿距离启发函数示例
def heuristic_manhattan(pos, end_pos):
    return abs(pos[0] - end_pos[0]) + abs(pos[1] - end_pos[1])

# 在astar函数中计算h值时调用
# neighbor.h = heuristic_manhattan(neighbor_pos, end_node.position)

4.2 处理权重与复杂地形

现实中的路径成本不总是“一步等于1”。有的路难走(成本高),有的路是高速公路(成本低)。A*算法可以轻松处理带权重的边。你只需要在计算 g(n) 时,不是简单地加1,而是加上从父节点移动到当前节点的实际代价(权重)。

例如,如果你的地图中,草地行走成本是1,沼泽是3,公路是0.5,那么在扩展节点时,就需要根据邻居节点的地形类型来增加相应的 g 值。这要求你的地图数据里包含每个格子的地形信息。

4.3 性能优化与常见问题

当地图非常大时,基础的A*实现可能会遇到性能瓶颈。这里有几个我踩过坑后总结的优化方向:

  1. 数据结构优化:开放列表使用二叉堆(heapq)已经不错,但对于超大规模图,斐波那契堆在理论上有更好的性能。封闭列表可以使用Python的set或者字典来加速 in 操作。
  2. 打破平局:当两个节点的 f(n) 相同时,先探索哪一个?一个简单的技巧是让启发式函数 h(n) 稍微偏向于其中一个,或者优先探索 h(n) 更小的(更接近目标的),这可以避免算法在平局时探索过多不必要的节点。
  3. 内存问题:对于超大规模地图,存储所有节点的 Node 对象可能占用大量内存。可以考虑使用更紧凑的数据结构,或者实现“池化”技术。
  4. 动态障碍物:基础的A*是用于静态环境的。如果障碍物会动(比如游戏中的其他单位),每次变化都重新规划整个路径开销太大。这时可以考虑增量式搜索算法,如 D Lite* 算法,它能在环境变化时高效地更新原有路径,而不是从头算起。

我在一个机器人项目里就遇到过动态障碍的问题,一开始用A重算,机器人经常“卡顿”。后来切换到D Lite,流畅度提升非常明显。当然,算法也复杂了不少。

5. 从A*出发:在更广阔的场景中应用

A*算法是一个强大的基础工具,学会它之后,你可以在很多领域大展拳脚。

  • 游戏开发:这是A的经典舞台。无论是RTS游戏里成百上千单位的调度,还是RPG游戏里NPC的智能移动,都离不开它。很多游戏引擎(如Unity、Unreal)都内置了基于NavMesh(导航网格)的A变种实现。
  • 机器人自主导航:让机器人在室内或已知地图中移动,避开桌椅等障碍物,到达指定地点。可以将传感器构建的栅格地图直接作为A*的输入。
  • 网络路由与物流规划:把城市道路网看作一个图,十字路口是节点,道路是带权重的边(权重可以是距离、时间、拥堵程度)。A*可以用来规划两点间的行驶路线。物流公司用它来优化配送路径。
  • 人工智能与谜题求解:一些看似不像“路径”的问题,也可以转化为图搜索问题。比如八数码谜题(滑动拼图),每个状态是一个节点,移动一步就是一条边,A*可以帮你找到最短的解法步骤。

说到底,A*算法教给我们的一种思维方式:在探索未知时,既要尊重已经付出的努力(g(n)),也要对未来保持合理的乐观估计(h(n)),并以此为指导做出每一步的最优选择。这种思想,或许比算法本身更有价值。

代码跑通了,图也画出来了,但我觉得最有意思的部分才刚刚开始——那就是根据你手头的具体问题,去调整、优化甚至魔改这个算法。比如,试着把四方向移动改成八方向,看看路径有什么变化;或者自己设计一个更复杂的迷宫,挑战一下算法的极限。编程的乐趣,不就在这种不断的尝试和解决新问题的过程中嘛。

路径规划算法实战:用Python实现Dijkstra与A*对比(附完整代码) 本文通过Python实战对比了Dijkstra与A*两种经典路径规划算法。文章详细解析了算法原理,提供了完整的网格环境构建、算法实现与可视化代码,并重点分析了A*算法如何通过启发式函数大幅提升搜索效率。最后探讨了算法在机器人ROS系统等复杂场景中的应用与进阶方向。 阅读详情

相关推荐

Python实战A*算法:从原理到可视化寻路实现

路径规划是计算机科学中的核心问题,旨在寻找两点间的最优通路。其基本原理是通过图搜索算法遍历可能的节点,评估移动代价以做出决策。A*算法作为启发式搜索的典范,通过引入预估代价(启发函数)极大地提升了搜索效率,其技术价值在于平衡了最优性与计算开销。该算法在游戏开发、机器人导航、物流配送等场景中应用广泛。本文以Python实现为核心,结合pygame库构建了交互式可视化界面,详细拆解了A*算法的F=G+H代价函数、开放/封闭列表数据结构以及曼哈顿与欧几里得距离等启发函数选择,并探讨了性能优化与动态避障等高级技巧,

weixin_33226548的博客 248

A*算法实战:从原理到Python实现(含完整代码与可视化)

本文详细介绍了A*算法从原理到Python实现的完整过程,包括核心概念、启发式搜索策略及路径规划实战。通过Python代码示例和可视化演示,帮助开发者掌握这一高效路径搜索算法,适用于游戏AI、机器人导航等场景。文章还提供了性能优化技巧和常见问题解决方案,助力实际应用。

z5a6b的博客 670

游戏开发实战:用Python实现A*算法让NPC自动寻路(附完整代码)

本文通过Python实战教程,详细讲解了A*算法在游戏开发中实现NPC自动寻路的核心原理与应用。文章从网格地图构建出发,深入解析了A*算法的启发式搜索机制、G/H/F值计算以及开放/封闭列表的实现,并提供了完整的代码示例和路径平滑、性能优化等高级技巧,帮助开发者快速构建高效、智能的游戏寻路系统。

github5actions的博客 410

Python实战:用A*算法解决迷宫问题(附完整代码+可视化)

本文通过Python实战详细讲解了A*算法解决迷宫问题的完整过程,包括算法原理、核心数据结构构建与代码实现。文章重点解析了A*算法相比Dijkstra和BFS的优势,即利用启发函数引导搜索方向,并提供了完整的Python代码和基于Pygame的动态可视化演示,帮助读者直观理解算法的搜索过程与路径规划效果。

yog99的博客 605

A*算法实战:用Python实现游戏地图寻路(附完整代码与可视化)

本文通过Python与Pygame实战,详细讲解了A*算法在游戏地图寻路中的应用。从核心原理出发,提供了完整的A*算法实现代码,并构建了支持动态障碍物与实时路径更新的可视化演示系统。文章还探讨了路径平滑、性能优化等高级技巧,帮助开发者将A*算法高效集成到游戏项目中。

weixin_29216957的博客 184

动力学约束下的运动规划算法——Hybrid A*算法(附程序实现及详细解释)

本文主要介绍动力学约束下的运动规划算法中非常经典的Hybrid A*算法,大致分为三部分,第一部分是在传统A * 算法的基础上,对Hybrid A * 算法的原理、流程进行理论介绍。第二部分是详细分析 MotionPlanning运动规划库中Hybrid A * 算法的源码,进一步深入对Hybrid A * 算法的具体细节 进行理解。 第三部分是结合前面第一部分的理论和第二部分的详细源码,对Hybrid A * 算法的流程进行综合的概括总结。

慕羽★的博客 1万+

Python实战:用A*算法解决迷宫问题,附完整代码与可视化效果

本文通过Python实战详细讲解了A*算法的核心原理与实现,包括启发函数选择、算法流程拆解以及完整的代码实现。文章提供了迷宫寻路的完整Python程序,并利用Pillow库实现了路径规划过程的可视化,帮助开发者直观理解A*算法的高效寻路机制。

weixin_29220405的博客 537

路径规划 | 详解混合A*算法Hybrid A*(附ROS C++/Python/Matlab仿真)

Hybrid A*算法通过结合连续状态空间搜索、运动约束考虑和轨迹优化等技术,弥补了普通A*算法在高维连续空间和的不足,提高了路径规划的效率和鲁棒性,广泛应用于车规级路径规划。本文详细图解Hybrid A*算法的原理——启发式、维诺耗散项、节点扩展法则等,并给出ROS C++、python、matlab三种语言的仿真实现加深理解

FRIGIDWINTER的博客 1万+

A*算法(超级详细讲解,附有举例的详细手写步骤)

背景:项目需要接触此算法,以下是一些自学成果,如有不足之处,欢迎指出,必虚心接受。做了一份PPT来汇报,此处直接使用自己PPT的截图。部分图片来源网络,如有侵权立马删除,以下博文仅作为学习笔记。后期又新增了完整PPT。https://blog.youkuaiyun.com/dujuancao11/article/details/114842884 目录 A*寻路算法 A*算法解决什么问题 A*算法的基本原理 A*算法的详细原理 A*算法的详细原理之定义 ​A*算法的详...

木牛的博客 1万+

Python实现A*算法:最短路径的高效搜索

在A*搜索算法中,开放列表和关闭列表是两个用于存储路径搜索状态的关键数据结构。开放列表(Open List)是指待探索的节点集合,也就是算法尚未完成检查的节点集合。它通常是优先队列的结构,能够保证每次从列表中取出具有最低f(n)值的节点进行扩展。而关闭列表(Closed List)则记录了算法已经完成检查的节点集合,确保每一个节点只被处理一次,防止搜索过程中出现重复。在许多优化问题中,特别是涉及到寻找最短路径或者最优解的问题,完全搜索整个解空间是不现实的,因为解空间可能会非常庞大。

weixin_33660045的博客 1262

A*算法在Python中实现航迹规划

航迹规划是自动驾驶、机器人导航以及飞行路径计算等领域的核心问题。本章节将提供一个高层次的概览,以便于读者理解航迹规划的重要性与它在真实世界应用中的复杂性。航迹规划不仅仅是找到两点之间的最短路径,还需要考虑到环境的动态变化、实时数据处理、以及安全性等多个维度。航迹规划涉及到的问题可以分为两大类:静态规划和动态规划。静态规划指的是在已知环境中规划路径,而动态规划则需要在实时收集和处理新信息的基础上作出调整。在实际应用中,动态规划是更常见的情况,因为现实世界的环境往往无法预先完全知晓且会不断发生变化。

weixin_42163404的博客 1186

C++之A*算法的简单实现

c++的A*算法

hesphoros的个人博客 5615

基于live555实现一个rtsp客户端程序

本文介绍了基于live555流媒体库实现的RTSP客户端程序,能够通过RTSP地址获取H.264/H.265裸码流或TS流数据并存入本地文件。详细阐述了使用CLion搭建工程的代码架构和CMake配置,重点分析了TS流解析模块的实现,包括TS包结构解析、PES包提取和ES裸流获取的完整流程。文章提供了TS/PES/ES三种数据包的协议说明,并给出了从TS流中提取视频帧的具体方法,最后附有工程代码下载链接。该方案实现了RTSP流媒体接收、解析和存储的完整功能链。

kk821521286的博客 791

用A*算法玩转九宫格拼图:从原理到Python实现(附完整代码)

本文详细介绍了如何利用A*算法为九宫格拼图寻找最优解。从状态表示、启发函数设计到完整的Python实现,逐步解析A*算法的核心原理与搜索策略,并通过代码示例展示如何构建一个高效的求解器,帮助读者深入理解启发式搜索在解决经典问题中的应用。

u9v0w的博客 585

ubuntu20.04安装Qt5.15.2并配置环境

qt官方取消了离线安装的方式,所以推荐在线安装,当然,如果想要自己通过源码编译也可以,参考官方文档:https://wiki.qt.io/Building_Qt_5_from_Git。 在线安装: 1.到官方网站下载:wget https://download.qt.io/official_releases/online_installers/qt-unified-linux-x64-online.run 2.修改文件权限:chmod 777 qt-unified-linux-x64-online.run

f120854632的博客 8807

关于石墨烯费米能级和偏置电压之间的关系问题

石墨烯费米能级与电压的关系问题

qq_37946542的博客 3517

Python实战:用A*算法解决迷宫问题(附完整代码与可视化)

本文详细介绍了如何使用Python实现A*算法解决迷宫问题,包括环境准备、算法核心实现、可视化展示及优化技巧。通过完整的代码示例和动态可视化,帮助开发者深入理解A*算法的工作原理及其在路径规划中的应用。

weixin_30374009的博客 600

混合部署 操作系统混合部署

在openEuler Embedded 22.03中,已经集成了OpenAMP相关支持,并与openEuler的SIG Zephyr合作实现了openEuler Embedded与实时操作系统Zephyr在QEMU平台上的混合部署。具体的混合部署方式取决于设备的硬件和软件支持。例如,可以使用虚拟机软件(如VirtualBox)在Linux操作系统上运行Android虚拟机,从而实现Linux和Android的混合部署。需要注意的是,混合部署涉及到设备的硬件和软件兼容性,以及操作系统的配置和管理。

dianqicyuyan的博客 1767

用Python实战A*算法:从理论到代码实现(附路径规划可视化)

本文详细介绍了A*算法在路径规划中的应用,从数学原理到Python代码实现,包括启发函数设计、性能优化和动态可视化。特别适合自动驾驶和游戏AI开发者学习,通过实战案例展示如何将理论转化为高效代码,提升路径规划效率。

weixin_29053067的博客 104

检索生成(RAG) vs 长文本大模型:实际应用中如何选择?

大模型的上下文理解能力直接影响到 LLMs 在复杂任务和长对话中的表现。本期内容聚焦于两种主流技术:长上下文(Large Context Windows)和检索增强生成(RAG)。这两种技术各有何优势?在实际应用中,我们又该如何权衡选择?文章不仅详细阐述了这两种技术的工作原理,还深入分析了它们在效率、准确性和实施成本等方面的差异。文章特别提到了在执行重复性任务时使用 Context Caching 优化长上下文的优势,然而,缓存策略的效果很大程度上取决于提示词的可预测性。

2401_85782938的博客 1256

SAP UI5 和 Fiori 的一些小技巧合集 - 持续更新中

本文介绍笔者从事 SAP UI5 和 Fiori 开发多年以来,积累的一些经验和小技巧。会保持更新。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 915

A*算法迷宫路径规划可视化

在这篇教程中,我们将深入介绍 A* 算法的工作原理及其应用,重点讲解如何使用 Python 实现 A* 算法进行路径规划。我们将通过一个迷宫实例展示如何从起点到终点寻找最短路径,并且使用 Pygame 库为整个过程添加动画效果,帮助你更直观地理解路径搜索的过程。无论你是路径规划的初学者还是对算法有一定了解的开发者,这篇教程都将为你提供清晰的思路和实用的代码示例,助你轻松掌握 A* 算法的实现与优化。

kilometerseven的博客 1987

PHPStorm携手ThinkPHP8:开启高效开发之旅

本文围绕使用 PHPStorm 进行 ThinkPHP8 开发展开,先介绍开发环境搭建与 Xdebug 配置,再阐述 PHPStorm 集成 ThinkPHP8 的步骤,包括项目导入、解释器和服务器配置。还讲解了项目开发基础、数据库操作、高级技巧、调试处理及部署上线等内容,为开发者提供了从环境搭建到项目上线的完整指引,助力高效开展 ThinkPHP8 开发工作。

邓邓子的博客 1545

A*算法实战:从迷宫寻路到游戏AI的Python实现与可视化

本文通过Python实战与可视化,深入解析A*算法在迷宫寻路与游戏AI中的应用。文章对比了BFS、Dijkstra与A*的核心差异,详细阐述了A*算法结合实际代价与启发式估计的智能寻路原理,并提供了完整的代码实现与动态可视化方案,帮助开发者理解并掌握这一经典路径规划算法。

weixin_29199873的博客 494

RK3568笔记五十四:SORT实时目标追踪

YOLOv5具备目标检测的功能,把视频分解成多幅图像并逐帧执行时,如果视频帧中有多个目标,如何知道一帧中的目标和上一帧是同一个对象就是目标跟踪的工作。DeepSort是实现目标跟踪的算法,从sort(simple online and realtime tracking)演变而来,使用卡尔曼滤波器预测所检测对象的运动轨迹,匈牙利算法将它们与新的检测目标相匹配。结合YOLOv5和DeepSORT可以在实时场景中实现高效的目标检测和跟踪。

791

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: 实验笔记之——COLMAP预处理下Instant-NGP与3D Gaussian Splatting的实战性能对比
下一篇: 基于STM32与OpenHarmony的可见光语音通信系统设计与实现
java5
博客等级 码龄22年 85粉丝 2103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值