zoukankan      html  css  js  c++  java
  • Astar寻路算法

    A* (ASTAR) 算法

    简介
    ...

    步骤

    1. 将开始节点放入开放列表(开始节点的F和G值都视为0);

    2.重复一下步骤,直到结束条件满足

    i. 在开放列表中查找具有最小F值的节点,并把查找到的节点作为当前节点;

    ii.把当前节点从开放列表删除, 加入到封闭列表;

    iii.对当前节点相邻的每一个节点依次执行以下步骤:

    1. 如果该相邻节点不可通行或者该相邻节点已经在封闭列表,则什么操作也不执行,继续检验下一个节点;

    2. 如果该相邻节点不在开放列表,则将该节点添加到开放列表中, 并将该相邻节点的父节点设为当前节点,同时保存该相邻节点的G和F值;

    3. 如果该相邻节点开放列表, 判断若经由当前节点到达该相邻节点的G值是否小于原来保存的G值,

    若小于,则将该相邻节点的父节点设为当前节点,并重新设置该相邻节点的G和F值.

    iv. 循环结束条件:

    终点节点被加入到开放列表作为待检验节点时, 表示路径被找到,此时应终止循环;

    或者开放列表为空,表明已无可以添加的新节点,而已检验的节点中没有终点节点则意味着路径无法被找到,此时也结束循环;

    3. 从终点节点开始沿父节点遍历, 并保存整个遍历到的节点坐标,遍历所得的节点就是最后得到的路径;

    关键值计算

    F = G+H

    G=从起点A到一个给定点的距离。

    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);
    }
  • 相关阅读:
    OpenGL, Net 2005, error C2381: 'exit' : redefinition; __declspec(noreturn) differs
    24点游戏
    一个3*3的格子,给定n>=10, 将[1,n]中的数填入方格中,使得相邻方格的数的和为质数
    最大子矩阵问题 PKU 1050
    12年9月12日
    再谈MSDN Library For Visual Studio 2010
    漫谈.NET开发中的字符串编码
    《.NET 4.0网络开发入门之旅》4:与Socket的第一次“约会”
    “.NET 4.0 网络开发入门之旅系列文章”—— IP 知多少?(下)
    C#之int挑战Java之Integer
  • 原文地址:https://www.cnblogs.com/mitang/p/13741671.html
Copyright © 2011-2022 走看看