`
128kj
  • 浏览: 600548 次
  • 来自: ...
社区版块
存档分类
最新评论

A*算法JavaScript实现

阅读更多
欢迎访问博主的网站:http://www.108js.com/link.html

A星算法步骤:
关于A*算法可参看:
http://www.108js.com/article/article5/50017.html

1.起点先添加到开启列表中

2.开启列表中有节点的话,取出第一个节点,即最小F值的节点,
   判断此节点是否是目标点,是则找到了,跳出。
   根据此节点取得八个方向的节点,求出G,H,F值;
   判断每个节点在地图中是否能通过,不能通过则加入关闭列表中,跳出
   判断每个节点是否在关闭列表中,在则跳出;
   判断每个节点是否在开启列表中,在则更新G值,F值,还更新其父节点;不在则将其添加到开启列表中,计算G值,H值,F值,添加其节点。

3.把此节点从开启列表中删除,再添加到关闭列表中;

4.把开启列表中按照F值最小的节点进行排序,最小的F值在第一个;

5.重复2,3,4步骤,直到目标点在开启列表中,即找到了;目标点不在开启列表中,开启列表为空,即没找到。 
  我们怎么确定这条路径呢?很简单,从目标开始,朝父节点移动。这最终会引导你回到起始格,这就是你的路径!



例:如上面第一个图是从(3,2)到(3,8)的A*搜索路径。
<html>
<head><title>A*算法JavaScript实现</title>
<script>
//A*算法
  var map=[//地图(1可通过 0不可通过)
       [1,1,1,1,1,1,1,1,1,1],
       [1,1,1,1,0,1,1,1,1,1],
       [1,1,1,1,0,1,1,1,1,1],
       [1,1,1,1,0,1,1,1,1,1],
       [1,1,1,1,0,1,1,1,1,1],
       [1,1,1,1,0,1,1,1,1,1]];

    
  var openList=[];//开启列表,存入节点Node
  var closeList=[];//关闭列表
  var COST_STRAIGHT = 10;//垂直方向或水平方向移动的路径评分
  var COST_DIAGONAL = 14;//斜方向移动的路径评分
  var row=6;//行
  var column=10;//列

  function showCloseList(){
       for(i=0;i<closeList.length;i++){
           alert("C--"+closeList[i].toString());
       }
   }
   function showOpenList(){
       for(i=0;i<openList.length;i++){
           alert("O--"+openList[i].toString());
       }
   }

 //从起点(x1,y1)查找目标(x2,y2),(-1:错误,0:没找到,1:找到了)
  function search1(x1,y1,x2,y2){
        if(x1<0||x1>=row||x2<0||x2>=row||y1<0||y1>=column||y2<0||y2>=column){
            return -1;
        }
        if(map[x1][y1]==0||map[x2][y2]==0){
            return -1;
        }
        var sNode=new Node(x1,y1,null);//起点
        var eNode=new Node(x2,y2,null);//目标
        
        openList.push(sNode);
        var resultList=search(sNode, eNode);
        if(resultList.length==0){
            return 0;
        }
        for(i=0;i<resultList.length;i++){
            map[resultList[i].getX()][resultList[i].getY()]=2;
        }
        return 1;
    }

//查找核心算法
    function search(sNode,eNode){
      var resultList=[];
      var isFind=false;
      var node=null;
      while(openList.length>0){
         //取出开启列表中最低F值,即第一个存储的值的F为最低的
         node=openList[0];
        
         //判断是否找到目标点
         if(node.getX()==eNode.getX()&&node.getY()==eNode.getY()){
              isFind=true;
              break;
          }
               
          //上
          if((node.getY()-1)>=0){
               checkPath(node.getX(),node.getY()-1,node, eNode, COST_STRAIGHT);
          }
          
           //下
          if((node.getY()+1)<column){
              checkPath(node.getX(),node.getY()+1,node, eNode, COST_STRAIGHT);
           }                                 
             
           //左
           if((node.getX()-1)>=0){
              checkPath(node.getX()-1,node.getY(),node, eNode, COST_STRAIGHT);
            }

           //右
           if((node.getX()+1)<row){
               checkPath(node.getX()+1,node.getY(),node, eNode, COST_STRAIGHT);
           }
        
          //左上
          if((node.getX()-1)>=0&&(node.getY()-1)>=0){
              checkPath(node.getX()-1,node.getY()-1,node, eNode, COST_DIAGONAL);
          }
      
          //左下
           if((node.getX()-1)>=0&&(node.getY()+1)<column){
              checkPath(node.getX()-1,node.getY()+1,node, eNode, COST_DIAGONAL);
           }
            
           //右上
           if((node.getX()+1)<row&&(node.getY()-1)>=0){
               checkPath(node.getX()+1,node.getY()-1,node, eNode, COST_DIAGONAL);
           }
    
           //右下
           if((node.getX()+1)<row&&(node.getY()+1)<column){
               checkPath(node.getX()+1,node.getY()+1,node, eNode, COST_DIAGONAL);
           }
           
            //从开启列表中删除
            //添加到关闭列表中       
            closeList.push(openList.shift());
      
            //开启列表中排序,把F值最低的放到最底端
            openList.sort(compare);
        }
        if(isFind){
            getPath(resultList, node);
        }
        return resultList;
    }

  
    //查询此路(x,y)是否能走通
    function checkPath(x,y,parentNode,eNode,cost){
       var node=new Node(x, y, parentNode);
        //查找地图中是否能通过
        if(map[x][y]==0){
            closeList.push(node);
            return false;
        }
        
     //查找关闭列表中是否存在
     if(isListContains(closeList, x, y)!=-1){    
          return false;
      }
      //查找开启列表中是否存在
      var index=-1;
      if((index=isListContains(openList, x, y))!=-1){
         //G值是否更小,即是否更新G,F值
         if((parentNode.getG()+cost)<openList[index].getG()){
            node.setParentNode(parentNode);
            countG(node, eNode, cost);
            countF(node);
            openList[index]=node;
        }
      }else{
        //添加到开启列表中
        node.setParentNode(parentNode);
        count(node, eNode, cost);
        openList.push(node);    
      }
        return true;
    }

    //集合中是否包含某个元素(-1:没有找到,否则返回所在的索引)
    function isListContains(list, x, y){
        var i,node;
        for(i=0;i<list.length;i++){
            node=list[i];
            if(node.getX()==x&&node.getY()==y){
                return i;
            }
        }
        return -1;
    }

    //从终点往返回到起点
    function getPath(resultList,node){
        if(node.getParentNode()!=null){
            getPath(resultList, node.getParentNode());
        }
        resultList.push(node);
    }
    
    //计算G,H,F值
    function count(node, eNode,cost){
        countG(node, eNode, cost);
        countH(node, eNode);
        countF(node);
    }
    //计算G值
    function countG(node,eNode,cost){
        if(node.getParentNode()==null){
            node.setG(cost);
        }else{
            node.setG(node.getParentNode().getG()+cost);
        }
    }
    //计算H值
    function countH(node,eNode){
        node.setF((Math.abs(node.getX()-eNode.getX())+Math.abs(node.getY()-eNode.getY()))*10);
    }
    //计算F值
    function countF(node){
        node.setF(node.getG()+node.getH());
    }
    
 
//节点类
function  Node(x,y,parentNode) {
        this.x=x;
        this.y=y;
        this.parentNode=parentNode;//父节点
        this.g=0; //当前点到起点的移动耗费
        this.h=0;//当前点到终点的移动耗费,即曼哈顿距离|x1-x2|+|y1-y2|(忽略障碍物)
        this.f=0; //f=g+h
    }
    
    Node.prototype.getX=function() {
        return this.x;
    }
    Node.prototype.setX=function(x) {
        this.x = x;
    }
    Node.prototype.getY=function() {
        return this.y;
    }
    Node.prototype.setY=function(y) {
        this.y = y;
    }
    Node.prototype.getParentNode=function() {
        return this.parentNode;
    }
    Node.prototype.setParentNode=function(parentNode) {
        this.parentNode = parentNode;
    }
    Node.prototype.getG=function() {
        return this.g;
    }
    Node.prototype.setG=function(g) {
        this.g = g;
    }
    Node.prototype.getH=function() {
        return this.h;
    }
    Node.prototype.setH=function(h) {
        this.h = h;
    }
    Node.prototype.getF=function() {
        return this.f;
    }
    Node.prototype.setF=function(f) {
        this.f = f;
    }
    Node.prototype.toString=function(){
        return "("+this.x+","+this.y+","+this.f+")";
     }

//节点比较类
  function compare(o1, o2) {
    return o1.getF()-o2.getF();
 }

function init(){
   var flag=search1(3, 2, 3, 8);
   if(flag==-1){
      alert("传输数据有误!");
   }else if(flag==0){
      alert("没找到!");
    }else{          
     for( x=0;x<6;x++){
      for( y=0;y<10;y++){
       if(map[x][y]==1){
         document.write("* ");
       }else if(map[x][y]==0){
         document.write("〓");
       }else if(map[x][y]==2){//输出搜索路径
         document.write("※");
       }
      }
      document.write("<br/>");
     }
   }
}
     
</script>
<head>
<body onLoad="init()"> 
</body></html>


一些运行结果在上面。
演示及源码下载:http://www.108js.com/article/article5/50019.html
  • 大小: 3.8 KB
0
0
分享到:
评论

相关推荐

    layaair typescipt吃豆人a*算法实现

    **吃豆人游戏实现**: 在吃豆人游戏中,地图由网格组成,每个网格可以是空地、墙壁或其他障碍物。吃豆人需要在这些网格间移动,同时避开幽灵。通过A*算法,吃豆人可以找到避开障碍物到达目标的最佳路径。游戏循环中...

    A*算法 js实现

    总结起来,本实验项目利用JavaScript实现了A*算法,通过计算节点的g值、h值和F值,结合启发式函数,高效地在迷宫中找到了从起点到终点的最短路径。这个项目不仅锻炼了编程能力,还加深了对A*算法的理解和应用。

    利用javascript在网页实现八数码启发式A*算法动画

    总的来说,这个项目涵盖了八数码问题的理论、A*算法的实现、JavaScript编程、网页交互和动画制作等多个方面,是学习计算机科学与前端技术的很好实践。在实际操作中,还需要考虑性能优化,比如避免重复搜索和剪枝策略...

    COCOS2D -HTML5 JS A*算法

    JS_astar2这个文件可能包含了实现A*算法的JavaScript源代码,可能包括以下部分: 1. 数据结构:如节点类,用于存储节点的位置、代价和相邻节点信息。 2. 地图表示:二维数组或其他数据结构,用于存储地图信息。 3. A...

    A*寻路算法 教程(一) (转)

    在实际开发中,有许多工具和库可以帮助开发者实现A*算法,例如Unity引擎的NavMesh系统、PathFinding.js等JavaScript库,以及专门为路径搜索设计的开源库如Recast & Detour等。 总结,A*寻路算法是一种强大的路径...

    javascript版 A*寻路算法实例

    本实例是基于JavaScript实现的A*寻路算法,结合了贪心算法与穷举法,还提供了一个可视化的界面来展示寻路过程,有助于理解和学习。 首先,我们要理解A*算法的核心思想。A*算法结合了Dijkstra算法的最短路径搜索和...

    js算法之A*寻路算法

    用js写的实现的A*寻路算法(包含UI) 用js写的实现的A*寻路算法(包含UI)

    cocos2d A*算法游戏demo

    《cocos2d A*算法游戏demo》是利用cocos2d游戏引擎开发的一个实践项目,旨在展示如何在游戏环境中实现自动寻路功能。A*(A-star)算法是一种广泛应用的路径搜索算法,以其高效性和寻找到的最优路径而著名。在游戏...

    cocos creator 实现A*寻路

    在Cocos Creator中,利用JavaScript实现A*寻路算法可以为游戏或交互式应用提供高效、智能的导航功能。以下是对A*寻路算法及其在Cocos Creator中的实现进行的详细解释。 1. **A*寻路算法基础**: - **目标与启发式...

    用cocos实现A星寻路算法

    在这个课程作业中,你使用Cocos来实现A*算法,虽然可能实现的基础,但这是理解游戏开发中路径查找的一个重要步骤。 首先,A*算法的核心在于结合了Dijkstra算法的最短路径寻找和启发式搜索。它通过评估两个因素——...

    a-star-on-quadtree:四叉树上的A *算法(带有实时演示)

    四叉树上的A*算法是一种将经典寻路算法A*与数据结构四叉树结合的高效路径搜索方法。在游戏开发、地图导航等领域,寻路...通过JavaScript实现,可以让这个算法在网页应用中得到广泛应用,如在线地图服务、游戏开发等。

    three.js算法寻路示例

    然后,他们将实现A*算法,考虑到3D空间中的距离和障碍物,以计算出从起点到终点的最短路径。最后,他们将结合Vue来实现用户界面,允许用户选择不同的算法并观察结果。 总结来说,这个"three.js算法寻路示例"是一个...

    javascript实现astar算法和demo

    在这个JavaScript实现的A*算法中,我们重点关注其核心概念、实现步骤以及如何在实际项目中应用。 一、A*算法的核心概念 1. **启发式函数(Heuristic Function)**:A*算法的关键在于启发式函数,它估计从当前节点到...

    最短路径A_算法实现(Javascript)

    在提供的ShortPath.htm文件中,可能包含了A*算法的具体JavaScript实现代码,你可以通过阅读和理解这些代码来进一步掌握A*算法的细节和实践应用。通过这个实现,你可以学习如何在实际项目中应用A*算法,解决如游戏...

    a-star-interactive:在UI的TypeScript w Vue中实现的A *算法

    《在UI中使用TypeScript与Vue实现A*算法详解》 在现代Web开发中,TypeScript作为JavaScript的超集,以其强大的类型系统和静态检查能力,越来越受到开发者的青睐。结合Vue.js这样的轻量级前端框架,可以构建出高效、...

    A_start_example_javascript.rar_javascript算法

    **A*算法详解及其JavaScript实现** A*(A-star)算法是一种在图形搜索中寻找从起点到终点最短路径的启发式搜索算法。它结合了Dijkstra算法的全局最优性和BFS(广度优先搜索)的高效性,通过引入启发式函数来指导...

    A*寻路算法的部分实践

    在TS(TypeScript)或JS(JavaScript)中实现A*算法,你需要定义以下功能: 1. **定义节点类**:包含位置信息、G、H、F值以及父节点引用。 2. **计算启发式函数**:根据地图特性选择合适的启发式函数。 3. **找到...

    JS实现的A*寻路算法详解

    本文将详细解析使用JavaScript实现A*寻路算法的过程。 首先,我们需要理解A*算法的基本原理。A*算法的核心在于评估每个节点(在本例中是地图上的方块)的F值,该值由两部分组成:G值和H值。G值是从起点到当前节点的...

    基于JavaScript的旅行路径规划算法设计与实现

    本项目聚焦于如何利用JavaScript设计和实现一个旅行路径规划算法,以帮助用户高效地规划他们的出行路线。 首先,我们需要理解路径规划的基本概念。路径规划算法通常涉及图论中的最短路径问题,如Dijkstra算法或A*...

Global site tag (gtag.js) - Google Analytics