`
cjx186
  • 浏览: 271939 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

最短路径A*算法实现(Javascript)

阅读更多
<html><head><title>use A* to find path...</title></head>
<body style="margin:0px">
<script>
var closelist=new Array(),openlist=new Array();
var gw=10,gh=10,gwh=14;
var p_start=new Array(2),p_end=new Array(2);
var s_path,n_path="";
var num,bg,flag=0;
var w=30,h=20;
function GetRound(pos){
 var a=new Array();
 a[0]=(pos[0]+1)+","+(pos[1]-1);
 a[1]=(pos[0]+1)+","+pos[1];
 a[2]=(pos[0]+1)+","+(pos[1]+1);
 a[3]=pos[0]+","+(pos[1]+1);
 a[4]=(pos[0]-1)+","+(pos[1]+1);
 a[5]=(pos[0]-1)+","+pos[1];
 a[6]=(pos[0]-1)+","+(pos[1]-1);
 a[7]=pos[0]+","+(pos[1]-1);
 return a;
}
function GetF(arr){
 var t,G,H,F;
 for(var i=0;i<arr.length;i++){
  t=arr[i].split(",");
  t[0]=parseInt(t[0]);t[1]=parseInt(t[1]);
  if(IsOutScreen([t[0],t[1]])||IsPass(arr[i])||InClose([t[0],t[1]])||IsStart([t[0],t[1]])||!IsInTurn([t[0],t[1]]))
    continue;
  if((t[0]-s_path[3][0])*(t[1]-s_path[3][1])!=0)
    G=s_path[1]+gwh;
  else
    G=s_path[1]+gw;
  if(InOpen([t[0],t[1]])){
    if(G<openlist[num][1]){
     openlist[num][0]=(G+openlist[num][2]);
     openlist[num][1]=G;
     openlist[num][4]=s_path[3];
    }
    else{G=openlist[num][1];}
  }
  else{
    H=(Math.abs(p_end[0]-t[0])+Math.abs(p_end[1]-t[1]))*gw;
    F=G+H;
    arr[i]=new Array();
    arr[i][0]=F;arr[i][1]=G;arr[i][2]=H;arr[i][3]=[t[0],t[1]];arr[i][4]=s_path[3];
    openlist[openlist.length]=arr[i];
  }
  if(maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#cccccc"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#0000ff"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#ff0000"&&maptt.rows[t[1]].cells[t[0]].style.backgroundColor!="#00ff00")
  {
    maptt.rows[t[1]].cells[t[0]].style.backgroundColor="#FF00FF";
    //maptt.rows[t[1]].cells[t[0]].innerHTML="<font color=white>"+G+"</font>";
  }
 }
}
function IsStart(arr){
 if(arr[0]==p_start[0]&&arr[1]==p_start[1])
  return true;
 return false;
}
function IsInTurn(arr){
 if(arr[0]>s_path[3][0]){
  if(arr[1]>s_path[3][1]){
    if(IsPass((arr[0]-1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]-1)))
     return false;
  }
  else if(arr[1]<s_path[3][1]){
    if(IsPass((arr[0]-1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]+1)))
     return false;
  }
 }
 else if(arr[0]<s_path[3][0]){
  if(arr[1]>s_path[3][1]){
    if(IsPass((arr[0]+1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]-1)))
     return false;
  }
  else if(arr[1]<s_path[3][1]){
    if(IsPass((arr[0]+1)+","+arr[1])||IsPass(arr[0]+","+(arr[1]+1)))
     return false;
  }
 }
 return true;
}
function IsOutScreen(arr){
 if(arr[0]<0||arr[1]<0||arr[0]>(w-1)||arr[1]>(h-1))
  return true;
 return false;
}
function InOpen(arr){
 var bool=false;
 for(var i=0;i<openlist.length;i++){
  if(arr[0]==openlist[i][3][0]&&arr[1]==openlist[i][3][1]){
    bool=true;num=i;break;}
 }
 return bool;
}
function InClose(arr){
 var bool=false;
 for(var i=0;i<closelist.length;i++){
  if((arr[0]==closelist[i][3][0])&&(arr[1]==closelist[i][3][1])){
    bool=true;break;}
 }
 return bool;
}
function IsPass(pos){
 if((";"+n_path+";").indexOf(";"+pos+";")!=-1)
  return true;
 return false;
}
function Sort(arr){
 var temp;
 for(var i=0;i<arr.length;i++){
  if(arr.length==1)break;
  if(arr[i][0]<=arr[i+1][0]){
    temp=arr[i];
    arr[i]=arr[i+1];
    arr[i+1]=temp;
  }
  if((i+1)==(arr.length-1))
    break;
 }
}
function main(){
  GetF(GetRound(s_path[3]));
  Sort(openlist);
  s_path=openlist[openlist.length-1];
  closelist[closelist.length]=s_path;
  openlist[openlist.length-1]=null;
  if(openlist.length==0){alert("找不到路径");return;}
  openlist.length=openlist.length-1;
  if((s_path[3][0]==p_end[0])&&(s_path[3][1]==p_end[1])){
    getPath();
  }
  else{maptt.rows[s_path[3][1]].cells[s_path[3][0]].style.backgroundColor="#00ff00";setTimeout("main()",100);}
}
function getPath(){
 var str="";
 var t=closelist[closelist.length-1][4];
 while(1){
  str+=t.join(",")+";";
  maptt.rows[t[1]].cells[t[0]].style.backgroundColor="#ffff00";
  for(var i=0;i<closelist.length;i++){
    if(closelist[i][3][0]==t[0]&&closelist[i][3][1]==t[1])
     t=closelist[i][4];
  }
  if(t[0]==p_start[0]&&t[1]==p_start[1])
    break;
 }
 alert(str);
}
function setPos(){
 var h=(Math.abs(p_end[0]-p_start[0])+Math.abs(p_end[1]-p_start[1]))*gw;
 s_path=[h,0,h,p_start,p_start];
}
function set(id,arr){
 switch(id){
  case 1:
    p_start=arr;
    maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#ff0000";break;
  case 2:
    p_end=arr;maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#0000ff";break;
  case 3:
    n_path+=arr.join(",")+";";maptt.rows[arr[1]].cells[arr[0]].style.backgroundColor="#cccccc";break;
  default:
    break;
 }
}
function setflag(id){flag=id;}
</script>
<table id="maptt" cellspacing="1" cellpadding="0" border="0" bgcolor="#000000">
<script>
for(var i=0;i<h;i++){
 document.write("<tr>");
 for(var j=0;j<w;j++){
  document.write('<td onclick="set(flag,['+j+','+i+']);" bgcolor="#ffffff" width="20" height="20"></td>');
 }
 document.write("</tr>");
}
</script>
</table>
<a href="javascript:setflag(1);">设置起点</a><br>
<a href='javascript:setflag(2);'>设置终点</a><br>
<a href='javascript:setflag(3);'>设置障碍点</a><br>
<input type="button" onclick="setPos();main();this.disabled=true;" value="find">
</body>
</html>
分享到:
评论

相关推荐

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

    最短路径问题在计算机科学中是一项基础且重要的研究领域,特别是在图论和网络分析中有着广泛应用。A*(发音为 "A-star")算法是一种启发式搜索算法,它结合了Dijkstra算法的优点,并通过引入一个评估函数来提高效率...

    layaair typescipt吃豆人a*算法实现

    2. **A*算法**:编写A*算法的实现,包括开放列表、关闭列表、启发式函数以及如何根据f(n)值选择下一个节点。 3. **吃豆人和幽灵的运动**:定义它们的移动规则,如四向移动、碰撞检测和转向逻辑。 4. **游戏循环**:...

    最短路径算法演示2A*

    标题 "最短路径算法演示2A*" 指向了一个使用JavaScript编写的脚本程序,其核心内容是演示了A*(A-star)算法的应用。A*算法是一种在图形搜索中寻找从起始节点到目标节点最短路径的启发式搜索算法。它结合了Dijkstra...

    最短路径算法演示脚本

    在这个"最短路径算法演示脚本"中,`Dijkstra.htm`可能是一个HTML文件,它包含了用JavaScript编写的Dijkstra算法实现。JavaScript代码会解析代表图的数据结构(如数组或对象),然后执行Dijkstra算法找出最短路径。...

    A*算法 js实现

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

    最短路径算法课程设计javascript版

    最短路径算法主要有几种经典的实现,包括Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法以及A*搜索算法等。在这个课程设计中,重点是Dijkstra算法,这也是文件名“dijkstra2-code”所暗示的。Dijkstra算法由...

    AE实现最短路径分析

    常见的最短路径算法有Dijkstra算法、Floyd-Warshall算法和Bellman-Ford算法。 1. Dijkstra算法:这是一种单源最短路径算法,适用于没有负权边的图。它通过维护一个优先队列来逐步扩展最短路径树,保证每次添加的边...

    最短路径

    A+算法通常指的是A*搜索算法,它是一种启发式寻路算法,而Dijkstra算法则是一种基础且广泛应用的单源最短路径算法。 A*算法结合了Dijkstra算法和启发式信息,目的是更高效地找到最短路径。它使用一个评估函数,该...

    js最短路径算法

    在JavaScript(简称js)中实现最短路径算法,可以帮助我们构建交互式的可视化应用,例如网页上的地图导航或游戏中的寻路系统。本篇文章将深入探讨如何使用js实现这一算法,并结合提供的文件`www.pudn.com.txt`和`...

    COCOS2D -HTML5 JS A*算法

    它通过结合最佳优先搜索(BFS)和Dijkstra算法的优点,既能保证找到最短路径,又能有效减少搜索空间,提高效率。 A*算法的核心在于它使用了一个评估函数`f(n) = g(n) + h(n)`,其中`g(n)`是从起点到当前节点的实际...

    1.(高级示例篇)leaflet+postgres+postgis+geoserver实现最短路径规划分析.zip

    2. 利用PostGIS的空间分析功能,比如Dijkstra算法或A*算法,计算两个地理点之间的最短路径。 3. Geoserver获取这些计算结果,并以WMS或WFS服务的形式发布。 4. Leaflet前端通过调用Geoserver的服务,获取并显示最短...

    校园最短路径规划分析可视化

    Dijkstra算法是一种用于查找图中两个节点间最短路径的算法,它保证了找到的路径是最优的。而A*算法则在Dijkstra的基础上引入了启发式函数,使得搜索过程更加高效,尤其适用于实时导航系统。 在校园环境中,我们可以...

    用cocos实现A星寻路算法

    A星(A*)寻路算法是游戏开发中常用的一种路径规划算法,它在二维或三维空间中寻找从起点到终点的最短路径。Cocos是一个强大的跨平台2D游戏开发框架,支持多种编程语言,如C++, Lua和JavaScript。在这个课程作业中,你...

    cocos creator 实现A*寻路

    A*(A-Star)寻路算法是路径规划领域中一种广泛应用的算法,它结合了Dijkstra算法的最短路径特性与优先级队列的效率优势。在Cocos Creator中,利用JavaScript实现A*寻路算法可以为游戏或交互式应用提供高效、智能的...

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

    路径规划算法通常涉及图论中的最短路径问题,如Dijkstra算法或A*搜索算法。这些算法用于在给定的节点(例如城市或位置)网络中找到从起点到终点的最短或最优路径。Dijkstra算法是解决最短路径问题的一个基础方法,...

    javascript版 A*寻路算法实例

    A*(A-star)寻路算法是一种在图形中寻找从起点到终点最短路径的高效算法,广泛应用于游戏开发、地图导航等领域。本实例是基于JavaScript实现的A*寻路算法,结合了贪心算法与穷举法,还提供了一个可视化的界面来展示...

    root.rar_ROOT_最短路径

    1. **Dijkstra算法**:由Edsger Dijkstra提出的单源最短路径算法,适用于有权重的图。它使用优先队列(通常用最小堆实现)来存储待访问的节点,并保证每次选择当前未访问节点中距离源点最近的一个。 2. **Bellman-...

    本人毕业设计,智能停车场导航系统,利用最短路径算法,实现两层停车场导航.zip

    《智能停车场导航系统:基于最短路径算法的实现》 智能停车场导航系统是现代城市交通管理中的一个重要组成部分,尤其在大型商业区、办公区域及公共场所,有效引导车辆快速找到停车位,不仅能提高停车场的运营效率,...

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

    在游戏开发中,A*算法常用于生成角色或NPC(非玩家角色)之间的最短路径。例如,在实时战略游戏中,单位需要找到到达敌人基地的最快路线;在角色扮演游戏中,NPC需要规划到达玩家位置的路径。通过将游戏地图表示为...

Global site tag (gtag.js) - Google Analytics