A*算法:机器人路径规划的核心原理与工程实践
1. 为什么A*依然是机器人路径规划里的“万金油”算法如果你刚开始接触机器人导航大概率会被一堆算法名词绕晕Dijkstra、贪心最佳优先、A*、D* Lite、RRT、PRM、Hybrid A*…… 每个听起来都很厉害但真正落到“我要让一个小车从房间左下角走到右上角还不能撞墙”绝大多数人第一次能跑通的就是A*。这不是因为A*最先进而是因为它把“搜索效率”和“路径质量”之间的平衡拿捏得最稳代码量又足够小特别适合作为路径规划的第一块基石。我见过不少新手一上来就直奔RRT或者Hybrid A*理由是“A太基础了没什么用”。这个想法我特别理解但实际做项目的时候你会发现轮式机器人、扫地机、仓储AGV这类在栅格化地图上运动的场景A以及它的变体依然是主力。RRT擅长的是高维空间和复杂约束下的快速搜索但它给出的路径抖动大、质量不稳定后续还得做平滑Hybrid A则要处理连续状态空间和车辆运动学约束工程复杂度直接翻倍。而A的逻辑简单到可以用一句话概括每次从“代价最小”的候选点往外扩展直到找到终点。这句话背后其实藏着一个非常重要的设计哲学A*不是盲目地朝终点冲也不是毫无方向地把整张地图都搜一遍。它用了一个启发函数来“猜测”当前点到终点还有多远然后结合已经走过的实际代价聪明地决定下一步该看哪里。这种“实际代价 预估代价”的组合让它在大多数场景下既能保证找到最优路径又比Dijkstra快得多。这篇文章我不会只贴一段能跑的代码就完事而是会把这几个问题讲透启发函数为什么必须“乐观估计”预估得太悲观会发生什么开列表、闭列表、父节点这些概念怎么落实到真正的数据结构里在真实的机器人地图上A*算出来的路径为什么经常有折线怎么处理什么时候A*会慢到不可用有哪些工程手段可以救适合谁来读如果你是正要接触机器人导航、准备自己写一个路径规划模块的开发者或者你在做游戏AI、地图寻路相关的项目想系统理解A*的原理和工程落地这篇文章应该能帮你省下不少自己踩坑的时间。我不保证你读完立刻成大师但至少能把原理、代码、踩坑这三件事串成一条线。2. 从Dijkstra到A*启发函数是如何把搜索“拉向”终点的2.1 先搞懂代价是什么要理解A*得先接受一个设定地图上的每个格子或节点都有一个“代价”。在机器人导航里这个代价通常指距离——走一步的物理长度。但代价也可以是时间、能量消耗甚至结合了障碍物距离的安全裕度。A*本身不关心代价的具体含义它只要求你给它一个数字它能比较大小就行。这里有一个关键点代价必须是“可累加的”。也就是说从起点走到某个中间点的总代价等于把路径上每一段的代价加起来。这个看起来理所当然的要求其实排除了很多乱七八糟的自定义代价设计。比如你如果告诉A*“靠近障碍物的格子扣3分远离障碍物的格子加2分”这种设计就没法用A*直接处理因为单步代价失去了“累加”的意义算出来的所谓最优路径会很奇怪。我用一个最简单的栅格地图来说明。假设一张地图只有两种格子可通行的空格代价为1和不可通行的障碍格代价为无穷大。那么从起点走到任意格子的代价就是走过的格子数。这个代价有个专门的名字叫g值。2.2 贪心算法为什么不行如果只有g值那就是Dijkstra算法从起点开始一圈一圈往外扩展像水波一样均匀扩散直到碰到终点。Dijkstra的优点是保证找到最短路径缺点是慢——它在完全不知道终点在哪边的情况下把起点周围所有方向的格子都搜了个遍。后来有人想了个偷懒的办法每次都优先扩展“看起来离终点最近”的格子。这就是贪心最佳优先搜索。它用了一个启发函数h值表示当前点到终点的预估距离。贪心算法只看h值完全不看已经走过的代价。听起来很合理对吧但贪心算法有个致命问题它容易被局部信息欺骗。想象一个C字形的障碍物终点就在C字开口的另外一侧。贪心算法会一路朝着终点方向冲过去撞到C字形的墙壁后才发现此路不通然后只能沿着墙慢慢绕。绕的过程中它依然只看“离终点直线距离最近”的格子结果就是它会贴着墙探索很多没用的区域甚至可能走回头路。最终找到的路径不一定最短有时候连路径都找不到。换句话说贪心的毛病是只顾着看目标忽略了成本。而Dijkstra正好相反它是只计算成本完全没有目标感。A*的高明之处就是两者相加它优先扩展f值 g值 h值最小的点。g值保证不会为了接近目标而绕远路h值保证搜索方向大致朝向终点。2.3 A*最优性的数学直觉很多人背下了一个结论“只要h函数是可采纳的admissibleA*就能找到最优路径。”但“可采纳”到底是什么意思用大白话讲就是你对剩余路程的预估不能比实际路程更远。为什么这个条件如此重要因为A的搜索顺序依赖于f值排序。假设终点旁边的某个格子实际剩余路程是5你预估它到终点的h值是5那这个格子的f值就是真实的总距离。此时搜索过程中任何f值大于这个真实值的格子都会被排除在优先队列的前面也就是说A在扩展完所有“可能更优”的路径之前不会急着宣布终点。反过来如果你把h值预估成8比实际5还大那么某些本来更短的路径会被误判为“更高代价”从而被排在后面A*就可能先找到一条次优路径然后才慢慢发现还有更好的路。这里有朋友会问那我直接把h值设为0不就行了吗永远乐观保证可采纳。确实h0时A就退化成了Dijkstra最优性有了但效率没了。启发函数的艺术就在于在保证不超过实际代价的前提下尽可能接近实际代价。预估越准A需要扩展的节点越少搜索越快。我在实际项目中见过一个很典型的误用有人用欧氏距离作为网格地图的启发函数这本身没问题但如果地图只允许上下左右四个方向移动那么实际的曼哈顿距离往往大于欧氏距离而曼哈顿距离才是“实际剩余路程的下界”里更紧的那个。用欧氏距离虽然不会破坏最优性但会让A多扩展不少节点。如果地图允许斜着走8方向那欧氏距离就是最紧的下界曼哈顿距离反而会超过实际路程导致A有可能找不到真正的最短路径。这一点在后面的实现部分还会再讲。3. 手写A*核心数据结构与完整可运行代码3.1 一张地图怎么表示在写代码之前先定义地图的数据结构。最常见的做法是用一个二维数组0表示可通行1表示障碍物。比如import heapq import math # 0 空地1 障碍物 MAP [ [0, 0, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0], [0, 0, 1, 0, 1, 0], [0, 0, 1, 0, 1, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 0], ]每个格子用(row, col)坐标表示。移动时我采用四方向还是八方向四方向简单但路径转弯急八方向更自然但要额外处理斜穿墙角的情况——这一点后面踩坑部分专门讲。这里先采用四方向移动等代码跑通了再扩展。3.2 三个核心容器开列表、闭列表、parent字典A*运行时需要维护三样东西开列表open list所有已经被发现、但还没被扩展的格子。它们按 f 值从小到大排序。每次循环从里面取 f 值最小的格子。闭列表closed list已经被扩展过的格子不会再被处理。作用是防止算法在同一个圈子里打转。parent字典记录每个格子是从哪个格子走来的这样当算法到达终点后才能一路回溯重建完整路径。这里有个新手经常踩的坑开列表里有个格子后来你又发现了一条到达这个格子的新路径g值比之前更小。这时候怎么办两个选择把这个格子的g值更新、重新排序或者干脆把这个格子当作新节点再压进去一次让旧记录慢慢沉底。第二种做法实现简单但会让开列表变得臃肿在有性能压力的大地图上会浪费内存。第一种做法需要实现“减少键值”操作Python里可以用heapq配合一个in_open字典来标记当前有效记录。3.3 一份能直接跑的A*代码下面这份代码是我在实际项目里用的简化版去掉了一些业务逻辑保留了核心骨架def heuristic(a, b): # 曼哈顿距离四方向移动下的“可采纳启发函数” return abs(a[0] - b[0]) abs(a[1] - b[1]) def astar(grid, start, goal): rows, cols len(grid), len(grid[0]) open_heap [] # 优先队列元素为 (f, g, node) heapq.heappush(open_heap, (0, 0, start)) came_from {} # 记录父节点 g_score {start: 0} # g值表 closed set() # 闭列表 while open_heap: current_f, current_g, current heapq.heappop(open_heap) if current in closed: continue closed.add(current) if current goal: # 回溯路径 path [] node goal while node is not None: path.append(node) node came_from.get(node) return path[::-1] for dr, dc in [(-1,0), (1,0), (0,-1), (0,1)]: nr, nc current[0] dr, current[1] dc if not (0 nr rows and 0 nc cols): continue if grid[nr][nc] 1: continue neighbor (nr, nc) tentative_g current_g 1 # 4方向移动每步代价为1 if neighbor in closed: continue if tentative_g g_score.get(neighbor, float(inf)): came_from[neighbor] current g_score[neighbor] tentative_g f tentative_g heuristic(neighbor, goal) heapq.heappush(open_heap, (f, tentative_g, neighbor)) return None # 找不到路径代码的核心循环思路就三步弹出最小f值的格子把它放进闭环检查它是不是终点如果不是就把周边可通行的邻居拉进开列表并更新它们的g值和父节点。我在代码里把heappop出来的current_g也一并存进了堆里这其实是个小技巧。因为当你更新某个邻居的g值后旧的开列表记录还在堆里但它的g值已经过期了。弹出的current_g可以和g_score[current]比较如果不一致就跳过。上面的代码在弹出时直接检查了if current in closed其实还不够严谨更稳妥的做法是同时检查g值是否过期if current in closed: continue if current_g ! g_score.get(current): continue3.4 从终点回溯到起点重建路径的细节路径重建的核心是came_from字典。从终点开始一路通过came_from[当前点]找父节点直到起点。这里有两个容易写错的点起点的came_from不要设置否则回溯会过头。我用node came_from.get(node)当node是起点时返回None循环结束。回溯出来的是从终点到起点的逆序列表要[::-1]反转成从起点到终点。如果你运行一下这段代码把MAP换成前面那个小地图会发现A*找到的路径是类似(0,0) - (1,0) - (2,0) - ...的直角折线。这在栅格地图上很常见也正好引出下一个话题如何在真实机器人上使用这条路径。4. 真实机器人地图上的三个工程问题栅格化、八方向与路径平滑4.1 栅格地图和实际位姿之间的换算代码跑通了但你很快会发现机器人的实际位姿是连续的浮点数比如(x0.53m, y1.27m, theta90°)而A*处理的是离散格子坐标(row, col)。高速真实场景里这个转换通常靠一张分辨率固定的栅格地图完成。假设地图分辨率为resolution 0.05米/格那么从世界坐标到栅格坐标的转换就是col int(x / resolution) row int(y / resolution)反过来x col * resolution resolution / 2 y row * resolution resolution / 2这里的 resolution/2是为了取格子的中心点。细节虽小但直接影响路径跟踪的精度。我以前调试时发现机器人在目标点附近反复绕圈查了很久才发现是坐标转换时没加半个格子偏移导致目标点一直在格子边缘附近来回跳动。分辨率的选择也直接影响A的性能和路径质量。分辨率太高比如0.01米/格一张10米×10米的地图就有一百万个格子A在这么精细的网格上搜索会非常慢。分辨率太低比如0.2米/格小车可能钻不过去的缝隙在栅格地图上依然显示为可通行。经验法则是分辨率就要取机器人直径的1/3到1/5之间兼顾通过性和效率。4.2 四方向还是八方向对角线移动的坑四方向移动在栅格地图上生成的路径充满直角转弯真实机器人跟着走会频繁原地转向效率极低。所以大多数实际项目都会用八方向移动。八方向的邻居定义就多了四组斜向移动for dr, dc in [(-1,0), (1,0), (0,-1), (0,1), (-1,-1), (-1,1), (1,-1), (1,1)]: # 每步代价不同 mn 1.0 if dr 0 or dc 0 else math.sqrt(2) tentative_g current_g mn但斜向移动引入了一个新问题斜穿墙角。假设机器人从(2,1)斜移到(3,2)而(2,2)是一个障碍格。从几何上看机器人斜着走的时候会“蹭”到墙角的顶点。如果机器人的半径是0.3米格子的分辨率是0.05米这个墙角尖角可能直接撞上机器人。解决方式是在斜移前检查两个相邻的正交格子是否都通行if abs(dr) 1 and abs(dc) 1: if grid[current[0] dr][current[1]] 1: continue if grid[current[0]][current[1] dc] 1: continue这个检查看起来简单但如果不加A算出来的路径会有很多贴着障碍物边角的斜线机器人跑起来非常容易磕碰。把这个逻辑加进去后A不仅更安全生成的路径也更符合轮式机器人的运动习惯。4.3 折线路径怎么变得更平滑线性插值剪枝A*输出的是格子中心点序列哪怕用了八方向依然有明显的折线感。直接发给底盘控制器小车会在每个拐点处减速甚至停顿。比较流行的做法是做一次路径剪枝path pruning检查路径中不相邻的两个点之间是否可以直接直线到达如果中间没有障碍物就把中间的点全部删掉。def prune_path(path, grid): if not path: return path result [path[0]] i 0 while i len(path) - 1: j len(path) - 1 found_next False while j i: if in_line_of_sight(path[i], path[j], grid): result.append(path[j]) i j found_next True break j - 1 if not found_next: i 1 return resultin_line_of_sight用Bresenham直线算法遍历两个格子之间的所有格子只要有一个是障碍物就返回False。剪枝后的路径往往只会剩下起点、几个关键转折点和终点。然后你再用三次样条或者贝塞尔曲线拟合这些关键点就能得到一条能让机器人顺畅跟踪的光滑曲线。说实话路径平滑本身就是一个可以写几千字的坑。这里我只是给你一个方向真实项目中这部分往往需要根据底盘的运动学模型反复调参。但无论是哪种平滑算法第一步的剪枝都是最划算的优化——它把A*的高密度输出压缩成几个关键路标大幅减轻了后端轨迹优化的负担。5. 实战踩坑记录五个让我抓狂的A*问题5.1 开列表性能爆炸线性表的致命伤我第一次在200×200的栅格地图上跑A时用了最朴素的Python列表来维护开列表每次弹出f值最小的节点时都用min(open_list)加list.remove()。小地图上完全看不出问题但地图一大A的搜索节点数轻松上万线性扫描的复杂度直接让我等了好几分钟才出结果。换成heapq后同样的地图几乎瞬间完成。这个坑其实很多人都提醒过但自己没踩过一遍永远记不住原理heapq的 push 和 pop 都是 O(log n)而线性表扫描是 O(n)。当节点数上万时一个是毫秒级一个是秒级甚至分钟级。凡是需要频繁取最小值的场景优先队列是默认选择。5.2 启发函数太悲观路径变长还变慢前面讲了可采纳性问题。实际中还有一种错误更隐蔽某个格子到终点的h值被设计成大于真实代价A仍然会跑完但结果不再是全局最优。比如在一个八方向移动的地图里你用了四方向的曼哈顿距离作为h函数那么从(0,0)到(5,5)的h值是10但实际八方向移动只要走5次斜移总代价是7.07。h值比真实代价大A就会把真正的最短路径误判成“更远”从而先找到一条次优路径。如果地图允许对角移动请使用对角距离作为h值def diagonal_heuristic(a, b): dx abs(a[0] - b[0]) dy abs(a[1] - b[1]) return max(dx, dy) (math.sqrt(2) - 1) * min(dx, dy)这个公式的逻辑是能走斜线的部分尽量走斜线剩下的用正交移动补齐。经验证它在八方向栅格地图上是严格可采纳且非常紧的启发函数——我实测比曼哈顿距离减少约30%的扩展节点数。5.3 卡死在角点闭列表的“围栏效应”有一次跑仿真A在某个角落反复扩展路径一直出不来。我一开始以为是地图数据有问题后来打断点看发现A的搜索从一个死角往回退的时候某个格子被闭列表锁死导致所有绕行路径都被堵住了。闭列表本质上是防止算法无限循环但如果你在更新邻居时没有正确处理“已经在闭列表里的格子”就会造成围栏效应明明有一条绕行路径但因为中间某个格子在闭列表里新路径被直接丢弃。后来我改成只有当新的g值比g_score[neighbor]更小的时候才允许更新。哪怕这个邻居已经在闭列表里只要新路径更好就必须把它重新放回开列表。这样虽然可能让某些格子被扩展两次但保证了算法不会因为闭列表的限制而错过更优路径。严格来说这会轻微降低效率但在实际地图上基本感知不到。5.4 对称路径导致的地图边缘贴边问题A有一种经常被人忽略的行为它倾向于贴着障碍物边缘走。原因在于栅格地图中一条直路的中线和贴边路径的总代价完全一样A在平等代价面前没有偏好最终路径取决于堆的排序方式。但真实机器人有体积贴边走非常危险走廊里还容易和别的机器人迎面撞上。解决办法之一是给靠近障碍物的格子加一个额外的“安全代价”。我的做法是在加载地图时预计算一个距离场离障碍物越近的格子A*的通过代价越大def compute_cost_map(grid, danger_threshold3): # 用BFS从每个障碍物向外传播距离距离越小代价越大 # 这里省略具体实现核心思路是 # cost 1 penalty * max(0, danger_threshold - distance) pass这么一来A*虽然还是以保证路径最短为主但在同等长度的备选路径里会优先选择离障碍物更远的走廊中央。这个处理在动态环境里尤其重要——机器人贴墙走的时候一旦旁边有人或物体突然出现留给反应和重规划的空间太少了。5.5 地图带权值后A*反而变慢的根因有时候我会给不同的区域设置不同的代价比如地毯区域代价1.5、瓷砖区域代价1.0这样A*规划出来的路线会倾向于走瓷砖路。但注意一旦引入了非均匀的通行代价h函数就不能只用距离来计算了因为实际的剩余代价不只是距离还取决于路径经过区域的代价。如果还想保证最优性h函数需要是“当前点到终点所有可行路径的最小代价”的下界这变得很难算。工程上我一般直接放弃严格最优性让h函数依然按距离估算代码上的代价也允许它低估。这样找出来的路径不一定是最短路径但通常足够好而且搜索速度不受影响。如果你的业务场景要求严格的“全局最优路径”且带权值那你应该考虑的不是A*而是更复杂的算法框架。坦白说这类需求在现实机器人产品里很少见大多数时候“足够好”远比“最优”有用。6. 从A*走向实战动态避障与JPS加速的进阶思路6.1 静态路径只跑一次真实机器人没这么幸运如果你现在做的项目是静态场景A跑一次就够了。但真实环境里经常有人、门、其他机器人动来动去A算好的路径走一半就失效了。最简单的应对策略是局部重规划机器人在沿A路径移动时如果发现前方一定范围内出现了新的障碍物就立即以当前位置为起点、以全局目标点为终点重新调用A。如果地图不大重新跑一次A也就几十毫秒的事完全来得及。但如果地图很大或者重规划频率很高你会发现重复计算很浪费。这时候可以考虑DLite算法——它复用上一次搜索结果只对受影响区域做增量修复是A在动态环境下的自然延伸。说实话DLite的实现复杂度比A高不少我的建议是先把A的重规划跑通确认系统瓶颈确实在搜索耗时上再决定要不要上D* Lite。过度设计是新手最容易犯的毛病我也不例外。6.2 大地图加速JPS跳跃点搜索A在开阔的地图上会把许多等代价的格子逐个扩展效率很低。JPSJump Point Search是A的一种优化策略它利用栅格地图的对称性只扩展“跳跃点”可以理解成是“智能地跳过一整条直线走廊”。JPS的核心是寻找满足特定条件的跳跃点当某个格子只有唯一方向可以继续前进时它不会像A那样把沿途每个格子都加入开列表而是一口气跳到走廊尽头、转角处、或障碍物拐角。我实测在1000×1000的开阔地图上JPS比标准A快一个数量级但代码复杂度也上了一个台阶。如果只是学习或小地图使用标准A*完全够用如果项目里确实碰到性能瓶颈再去研究JPS。6.3 我给你的从入门到实战的学习路线我建议按下面的顺序推进把本文的标准A*代码在几张不同结构的地图上跑通观察扩展节点的范围和路径形状。改成八方向移动加上斜穿墙角的检查对比四方向和八方向的路径差异。加上路径剪枝和简单的贝塞尔平滑让路径适合真实底盘跟踪。做局部重规划模拟动态障碍物场景验证A*能否在有限时间内重新出路径。如果确实遇到性能问题再研究JPS或D* Lite。换掉“格子代价全是1”的假设引入带权值地图观察路径变化对你业务的影响。别急着一步到位。我记得自己第一次做路径规划项目时光是处理地图坐标转换和障碍物膨胀就花了两天A*本身反而半天就写完了。你要相信路径规划真正难的地方从来不是算法本身而是把算法放到真实世界那一堆乌漆麻糟的细节里还能稳定工作。7. 更高层的选型思考A*并非万能但永远值得先试写了这么多最后还是想聊两句更高的视角。A*在机器人路径规划里的地位很特殊它不如RRT系列那么擅长应对高维复杂空间也不如人工势场法那样适合平滑避障但它上手门槛低、行为可解释、结果可预测这些优势在工程调试时是巨大的财富。我见过不少团队一上来就在状态空间做Hybrid A*、做带运动学约束的优化系统复杂到出了bug根本查不过来。后来我接手时做的第一件事就是先用标准A*在一个2.5D的栅格地图上跑通整个导航链路确认上游定位和下游控制都没问题之后再逐步替换和升级规划算法。这个思路后来帮我避开了无数“不知道是规划器的锅还是底盘控制器的锅”的泥潭。所以如果你正准备开始学习机器人路径规划或者正在为一个新的导航项目选型我的建议很直接先老老实实地把A吃透。它不是花架子也不该被当作入门后就要丢掉的玩具。恰恰相反A是你理解更复杂规划算法的锚点——D* Lite是它的动态扩展JPS是它的加速优化Theta*是它的任意角度变体。把这个锚点打牢之后再往上长什么枝桠都会顺很多。我自己在项目里用A已经不下几十次了每次换新场景、新地图、新的底盘时A都是第一个跑通的算法。那种“地图加载、坐标转换、路径输出、底盘跟线”整条链路一气呵成的感觉是真的过瘾。希望这篇文章能帮你少走点弯路早点体会到这种感觉。

相关新闻

AI智能体安全评估实战:基于MITM的OpenClaw红队攻击测试

AI智能体安全评估实战:基于MITM的OpenClaw红队攻击测试

我以前评估AI智能体的安全,习惯直接从提示词下手,各种越狱样本、护栏绕过、诱导输出测了个遍。这套玩法在纯对话场景下还算够用,可一旦面对真实部署的智能体,尤其是像OpenClaw这种自带工具调用、能读写本地文件、能执行命令、能发…

2026/10/16 13:10:09 阅读更多 →
Node.js+Express+Nodemailer+QQ邮箱SMTP:从零实现邮箱验证码模块

Node.js+Express+Nodemailer+QQ邮箱SMTP:从零实现邮箱验证码模块

1. 从一个真实需求说起:为什么邮箱验证码模块值得自己写 很多做Web项目的朋友都遇到过这个场景:用户注册、登录、找回密码,需要发一封验证码邮件。第一反应往往是找第三方短信或邮件服务,但短信要钱、要资质,邮件反而是…

2026/10/16 13:10:09 阅读更多 →
混酸投料计算器:硝化工艺中高精度密度-温度-浓度耦合计算工具

混酸投料计算器:硝化工艺中高精度密度-温度-浓度耦合计算工具

简介:混酸投料计算器是一款面向化学实验人员、化工工艺工程师及高校教学实践者的专业级配比计算工具,专为解决混酸配制中密度换算、体积-质量转换、含水量校验等关键问题而设计,适用于硝化反应、金属蚀刻、催化剂制备等需精确控制酸组分的实际…

2026/10/16 13:09:08 阅读更多 →

最新新闻

规范驱动开发三剑客:Spec Kit、Superpowers与OpenSpec选型指南

规范驱动开发三剑客:Spec Kit、Superpowers与OpenSpec选型指南

1. 规范驱动开发到底在解决什么问题1.1 从“代码先写、文档后补”到“规范先行”的转变做开发时间长了,你会发现一个很普遍的现象:需求文档写完就没人看了,代码写完也没人补文档,最后整个项目的知识全散落在不同人的脑子里。等到有…

2026/10/16 13:53:37 阅读更多 →
ResNet任意尺寸输入改造指南:从池化替换到全卷积实战

ResNet任意尺寸输入改造指南:从池化替换到全卷积实战

1. 问题诊断:ResNet为何会对输入尺寸“挑食” 做深度学习项目久了你一定会碰到这个场景:训练时图片尺寸是224x224,结果推理时来了张1920x1080的图,直接一缩放塞进去,小目标全糊了。更头疼的是,有时候连模型…

2026/10/16 13:53:37 阅读更多 →
横评 5 大 AI 决策模型:8B 开源黑马几乎逆袭 Jev,付费墙还能撑多久?

横评 5 大 AI 决策模型:8B 开源黑马几乎逆袭 Jev,付费墙还能撑多久?

横评 5 大 AI 决策模型:8B 开源黑马几乎逆袭 Jev,付费墙还能撑多久? 【免费下载链接】openjev 项目地址: https://ai.gitcode.com/hf_mirrors/AlexWortega/openjev 2026 年 9 月,TypeSafe AI 前 OpenAI 研究员 Diogo Alme…

2026/10/16 13:53:37 阅读更多 →
Star Rat 3.1源码升级版:内网资产盘点与状态监控实践

Star Rat 3.1源码升级版:内网资产盘点与状态监控实践

简介:Star Rat 3.1源码升级版是一套面向Windows平台的远程控制软件源代码,适合有C/C基础的安全开发人员、系统管理员及对远控原理感兴趣的进阶学习者。其核心价值在于提供完整可编译的工程,较为全面地展示了远控软件的通信、控制与界面实现思…

2026/10/16 13:53:37 阅读更多 →
为什么做智能分类要选fast-decisions?GLiNER2.5-Decide决策数据套件初探

为什么做智能分类要选fast-decisions?GLiNER2.5-Decide决策数据套件初探

【免费下载链接】fast-decisions 项目地址: https://ai.gitcode.com/hf_mirrors/fastino/fast-decisions 点击查看 免费下载 fast-decisions 是 Fastino 官方为 GLiNER2.5-Decide 智能分类模型发布的一套决策数据套件:17 个真实业务领域、每个领域 100 …

2026/10/16 13:53:37 阅读更多 →
Mosaico全景解读:面向Physical AI的机器人数据平台,5大核心能力让你告别.bag文件

Mosaico全景解读:面向Physical AI的机器人数据平台,5大核心能力让你告别.bag文件

【免费下载链接】mosaico Mosaico - The data platform for Physical AI 项目地址: https://gitcode.com/gh_mirrors/mosai/mosaico 点击查看 免费下载 Mosaico 是一款面向 Physical AI 与机器人场景的开源数据平台,能把 ROS .bag、.mcap 这类单体传感器…

2026/10/16 13:52:36 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →