最近读到一篇关于《HTML5实现炮塔防守》的文章,对其中的路径搜索算法有点兴趣,稍微探索了一下。
基于搜索下载的Micheal Hong的Java版本的AStar算法,并做了一些调整。核心代码如下:
while (open.isEmpty() == false) {
close.add(open.remove(0));
getNeighbour(node, neighbour);
for (int i = 0; i < neighbour.length; i++) {
if ((index = contain(open, neighbour[i].x, neighbour[i].y)) != -1) {
if (open.get(index).gn > neighbour[i].gn)
// 以前掠过这个节点的时候(getNeighbour的形式)的代价比现在掠过这里的代价大,说明现在的掠过更好
// 所以用现在的掠过代替?也就是说要把原来的那个替换掉,
open.set(index, neighbour[i]);
// 反之,就不考虑这个新的掠过
} else
open.add(neighbour[i]); // 没有曾经掠过,就作为候选节点加入
}
/* 判断是否到达目标 */
if ((index = contain(open, end.x, end.y)) != -1) {
int count = 1;
Node d = open.get(index);
while (d.father != null) {
d = d.father;
count++;
}
d = open.get(index);
int[][] path = new int[count][];
for (int i = count - 1; i >= 0; i--) {
path[i] = new int[2];
path[i][0] = d.x;
path[i][1] = d.y;
d = d.father;
}
return path;
}
/* 对open表进行排序(按fn由小到大) */
// 我认为可以不用sort,只是取一个值而已,
// 也可以在加入open队列的时候就已经形成了大值排序
Collections.sort((open));
}
我认为AStar算法的思想不错。
对于遍历,我们想到的可能就是深度优先遍历和广度优先遍历,但是那种教科书式的遍历方法的搜索空间太大了。
于是人们想到了缩小范围的方法,技术总是在不断改进的驱动下进步的。
AStar就是这个思想驱动下诞生的,首先基于原有广度优先遍历会随着层级的递增可选的next step会越来越多,我们不难想到如何在可选的next step集合中找到一个最优的next step,所以关键点就在于如何定义这个最优评估的方法的问题了。
AStar的评估方法就是F=H+G,也就是说评估值等于已经走过的路径总长度加上未来可能还需要走的路径总长度。全局排序后选最优的,也就是最短的。
已经走过的路径很容易,只要我们把它记录累加就能得到,所以关键点又落到了如何预估未来需要走的路径总长度。
那未来需要走的路径总长度又怎么评估呢?就像一个人进入一个沙漠,完全不知道剩下的路到底还有多长,只知道自己已经走了三天三夜,呵呵。
AStar给出了一个方案,那就是当前坐标和目的地坐标的X,Y的差值和,外国人叫曼哈顿距离。具体见百度百科
这样通过比较F值也就是说总路程最短的优先作为next step(虽然只是预估出来的)。
这就像迷茫的寻路过程有了一盏灯指引着你走向终点。而这盏灯其实关键点就是那个曼哈顿距离,所以AStar算法是一种启发式的路径搜索算法。
膜拜了一下这个曼哈顿距离,不经让我发问:为什么就曼哈顿距离而不是其他距离?(TB continue..)
分享到:
相关推荐
AStar算法的优点在于它可以快速地找到最短路径,并且可以避免搜索空间的探索。然而,AStar算法也存在一些缺陷,例如,它不能 guarantee 找到最短路径,在某些情况下可能会出现无限循环。 AStar算法是一种常用的路径...
AStar算法的核心思想是将待搜索节点分为两部分:已探索过的节点(CLOSED表)和待探索的节点(OPEN表)。 1. **AStar算法的基本步骤**: - 初始化:将起点加入OPEN表,赋予初始成本(通常是0)和启发式估计成本...
这个VB实现的AStar算法演示旨在帮助用户理解该算法的工作原理,并提供了一个可视化的学习工具。VB(Visual Basic)是微软开发的一种面向对象的编程语言,适合初学者和专业开发者用于创建Windows应用程序。 AStar...
在Java环境下,我们可以利用面向对象编程特性来实现AStar算法,并将其应用于窗口界面,以直观地展示路径搜索过程。 AStar算法的关键在于以下几个组成部分: 1. **启发式函数(Heuristic Function)**:启发式函数...
在给定的描述中,我们了解到该程序是用Astar算法在一个5*5的方格环境中模拟最短路径查找。这种小型的环境使得可视化和理解算法的运作变得相对简单。下面我们将深入探讨Astar算法的原理、实现步骤以及在5*5方格中的...
Astar算法保证找到的是全局最优解,因为它总是选择具有最低f(n)值的未探索节点。 在C#实现Astar算法时,通常需要以下组件: 1. **节点类**:每个节点代表地图上的一个位置,包含位置信息、代价g(n)、预估代价h(n)、...
在这个名为"ASTAR.rar"的压缩包中,包含了一个名为"ASTAR.py"的Python文件,它提供了A*算法的实现,并且有详尽的注释,方便学习和理解。 首先,我们要理解A*算法的基本原理。A*算法通过计算每个节点的评估函数来...
这个压缩包文件"Java_astar代码完成_scalee1h_astar算法java"包含了AStar算法的源代码实现和一个演示JAR文件,帮助开发者理解和使用该算法。 AStar算法的核心思想可以概括为以下几个部分: 1. **启发式函数**:...
AStar算法,全称为A*搜索算法,是一种在图形中寻找从起点到终点最短路径的启发式搜索算法。在无人驾驶车辆领域,路径规划是一项关键技术,A*算法因其高效性和准确性而被广泛应用。本篇将详细介绍AStar算法及其在...
### 最易理解的Astar算法解析 #### 引言:搜索区域与节点概念 A*算法,作为一种广泛应用的路径寻找算法,尤其适用于游戏开发、地图导航等场景,其核心在于高效地从起点A找到通往终点B的最短路径。本文通过直观的...
启发式函数h(n)的选择对Astar算法的效率至关重要。它需要满足两个条件:一是非负性,即h(n) >= 0;二是腺近性,即实际成本不大于启发式估计,即h(n) (n, goal),其中d(n, goal)为节点n到目标节点的最短距离。常见的...
在C#中实现AStar算法,我们可以利用其强大的面向对象编程特性以及丰富的数据结构库。 AStar算法的核心在于以下几个关键概念: 1. 开放集(Open Set):存储待评估的节点,按F值(从起始节点到当前节点的G值加上预计...
启发式函数h(n)的选择对AStar算法的效率至关重要。常见的启发式函数有曼哈顿距离、欧几里得距离、切比雪夫距离等。一个好的启发式函数应该是 admissible 和 consistent 的,即不低估实际距离且对于任何两个相邻节点...
**VB.NET AStar 算法** A*(A-Star)算法是一种在图形搜索中用于找到从起点到终点最短路径的启发式搜索算法。它结合了Dijkstra算法的最优化特性以及A算法的效率,通过引入启发式函数来估计从当前节点到目标节点的...
标题"Astar算法matlab.zip"表明这是一个包含MATLAB代码实现A*算法的压缩包。MATLAB是一种强大的数学计算和编程环境,非常适合进行数值分析和算法开发。用户可以直接下载这个压缩包,然后在MATLAB中打开并运行,以...
总之,"ie可用的astar算法javascript demo"是一个在JavaScript中实现的A*搜索算法,它考虑了在Internet Explorer浏览器下的兼容性,能够有效地寻找两点之间的最短路径。这个实现涉及到了数据结构、启发式函数设计...
**Astar算法原理及其优化探讨** Astar(A*)算法是一种高效的图形搜索算法,广泛应用于寻路和路径规划问题,特别是在游戏开发、机器人导航等领域。A*算法结合了广度优先搜索(BFS)和Dijkstra算法的特点,同时利用...
Astar(A*)算法是一种在图形中寻找从起点到终点最短路径的搜索算法,广泛应用于游戏开发、地图导航、机器人路径规划等领域。它的核心思想是结合了Dijkstra算法的最短路径特性以及优先级队列的效率,同时引入启发式...
A*(发音为“A-star”)算法是一种在图形搜索中广泛应用的路径查找算法,它结合了最佳优先搜索和Dijkstra算法的优点。A*算法通过引入一个启发式函数来估计从起点到目标点的最优路径,从而能更有效地找到最短路径,...
1. **启发式函数**:AStar算法需要一个启发式函数(通常为曼哈顿距离或欧几里得距离),以估计从当前节点到目标节点的剩余成本。这使得搜索更加高效,避免了盲目探索。 2. **开放列表与关闭列表**:算法维护两个...