# AStartProject **Repository Path**: WhiteFire/AStartProject ## Basic Information - **Project Name**: AStartProject - **Description**: A星算法 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2018-05-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AStartProject #### 项目介绍 A星算法 #### 参考资料 1. https://blog.csdn.net/agroupofruffian/article/details/77700338 2. http://www.cnblogs.com/yangyxd/articles/5447889.html 3. https://www.cnblogs.com/jacobb/p/7223325.html 4. http://www.cnblogs.com/leoin2012/p/3899822.html #### 伪代码 1. 从起点 A 开始, 把它作为待处理的方格存入一个"开启列表", 开启列表就是一个等待检查方格 的列表. 2. 寻找起点 A 周围可以到达的方格, 将它们放入"开启列表", 并设置它们的"父方格"为 A. 3. 从"开启列表"中删除起点 A, 并将起点 A 加入"关闭列表", "关闭列表"中存放的都是不需要再次检查的方格 从 "开启列表" 中找出相对最靠谱的方块, 什么是最靠谱? 它们通过公式 F=G+H 来计算. F = G + H G 表示从起点 A 移动到网格上指定方格的移动耗费 (可沿斜方向移动). H 表示从指定的方格移动到终点 B 的预计耗费 (H 有很多计算方法, 这里我们设定只可以 上下左右移动). 从 "开启列表" 中选择 F 值最低的方格 C (绿色起始方块 A 右边的方块), 然后对它进行如下处 理: 4. 把它从 "开启列表" 中删除, 并放到 "关闭列表" 中. 5. 检查它所有相邻并且可以到达 (障碍物和 "关闭列表" 的方格都不考虑) 的方格. 如果这些方格 还不在 "开启列表" 里的话, 将它们加入 "开启列表", 计算这些方格的 G, H 和 F 值各是多少, 并设置 它们的 "父方格" 为 C. 6. 如果某个相邻方格 D 已经在 "开启列表" 里了, 检查如果用新的路径 (就是经过 C 的路径) 到 达它的话, G 值是否会更低一些, 如果新的 G 值更低, 那就把它的 "父方格" 改为目前选中的方格 C, 然 后重新计算它的 F 值和 G 值 (H 值不需要重新计算, 因为对于每个方块, H 值是不变的). 如果新的 G 值比较高, 就说明经过 C 再到达 D 不是一个明智的选择, 因为它需要更远的路, 这时我们什么也不做. G值 = 父节点的G值 + 父节点到当前点的移动代价 H值 = 当前点到结束点的曼哈顿距离 #### H值估算方法 //曼哈顿估价法 private function manhattan(node:Node):Number { return Math.abs(node.x - _endNode.x) * _straightCost + Math.abs(node.y + _endNode.y) * _straightCost; } //几何估价法 private function euclidian(node:Node):Number { var dx:Number=node.x - _endNode.x; var dy:Number=node.y - _endNode.y; return Math.sqrt(dx * dx + dy * dy) * _straightCost; } //对角线估价法 private function diagonal(node:Node):Number { var dx:Number=Math.abs(node.x - _endNode.x); var dy:Number=Math.abs(node.y - _endNode.y); var diag:Number=Math.min(dx, dy); var straight:Number=dx + dy; return _diagCost * diag + _straightCost * (straight - 2 * diag); }