`
jj7jj7jj
  • 浏览: 50316 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

js版 a星算法(原创:算法独立出来了)

阅读更多
a星算法的原理,网络上基本都有,这里就不在介绍了,网络上的a星和例子结合的过于密切,不利于复用,如果你只需要代码,不需要了解原理,此文会对你有帮助

图片见附件,代码如下:

window.AStar = {};
(function(aStar){

	//start:起始节点[i,j] , end:最终节点[i,j]  map:地图数据(2d)arr,marker:可以通过的标识(例子用的是1)
	aStar.find_path = function(start,end,map,marker){
		var open = [];
		var close = [];

		var s_p = start;
		var e_p = end;
		var map_arr = map;
		var tra_marker = marker;
	
		var G = 0;
		var H = 0;
		var F = 0;

		//加入起始节点  [x, y , G ,F ,father]
		open.push([s_p[0],s_p[1],0,(Math.abs(e_p[0]-s_p[0]) + Math.abs(e_p[1]-s_p[1])),null]);

		return function(obj){
			//重拍,取最小的一个
			var count = 0;
			for(var i = obj[0]-1,ilen = i+3 ; i < ilen ; i++){
				for(var j = obj[1]-1,jlen = j+3 ;j < jlen; j++){
					//遍历周围八节点,排除自己
					if(i == obj[0] && j == obj[1])
						continue;
					//排除穿越的情况
					if(!((i == obj[0] ) || ( j == obj[1])) && ( map_arr[i] && map_arr[obj[0]] && map_arr[i][obj[1]] != tra_marker && map_arr[obj[0]][j] != tra_marker))
						continue;
					if(i == e_p[0] && j == e_p[1]){
						open.push([i,j,G,F,obj]);
						var ways = [];
						var ele = obj;
						do{
							ways.unshift(ele);
							ele = ele[4];
						}while(ele[4] != null);
						return ways;
					}
					
					if(map_arr[i] && map_arr[i][j] && map_arr[i][j] == tra_marker && is_exist(open,[i,j]) == -1 && is_exist(close,[i,j]) == -1){
						G = ( i == obj[0] ) || ( j == obj[1] ) ? obj[2]+1.0 : obj[2]+1.4 ;				
						H = Math.sqrt((e_p[0] - i)*(e_p[0] - i) + (e_p[1] - j)*(e_p[1] - j));
						F = G + H;

						open.push([i,j,G,F,obj]);
						count++;
					}
				}
			}
			close.push(open.shift());
			var o;
			if(open[0] && open[0][4] == obj[4]){
				o = count == 0 ? get_other(open,obj) : (arr_sort(open),open[0]);
			}else{
				o = (arr_sort(open),open[0]);
			}
			
			if(o){
				return arguments.callee(o);
			}else{
				return [];
			}
		}(open[0])
	}

	
	//获取其他节点
	var get_other = function(arr,o){
		var a = [];
		for(var i = 0 ; i < arr.length ; i++){
			if(o && arr[i][4] == o[4]){
				return arr[i];
			}
		}
		if(o[4]){
			return arguments.callee(o[4]);
		}else{
			return null;
		}
	}

	
	//对数组进行重排列
	var arr_sort = function(){
		function s(a,b){
			return a[3] - b[3];
		}
		return function(arr){
			arr.sort(s);
		}
	}();

	//数组中是否存在此元素
	var is_exist = function(arr,p){
		for(var i = 0 ; i < arr.length ; i++){
			if(arr[i][0] == p[0] && arr[i][1] == p[1]){
				return i;
			}
		}
		return -1;
	}
})(window.AStar)


测试代码
<script src="a_star.js"></script>
<link rel="stylesheet" type="text/css" href="reset.css" />
<script>
	var state = 1;
	var w = 20;
	var h = 10;
	var map_arr = [];
	var start,end;

	window.onload = function(){
		var map = document.getElementById("map");
		var arr = [];
		
		
		arr.push("<table border=\"1\">");
		for(var i = 0 ; i < h ; i++){
			arr.push("<tr>");
			if(!map_arr[i]) map_arr[i] = [];
			for(var j = 0 ; j < w ;j++){
				arr.push("<td id=\""+i+"-"+j+"\" style=\"width:50px;height:50px;border:1px solid #000\" onclick=\"td(" + i + "," + j + ")\"></td>");
				map_arr[i][j] = 1;
			}
			arr.push("</tr>");
		}
		arr.push("</table>");
		map.innerHTML = arr.join("");
	}

	function td(x,y){
		var e = document.getElementById( x + "-" + y);
		switch(state){
			case 1:
				start = [x,y];
				e.style.backgroundColor = "#0f0";
				break;
			case 2:
				end = [x,y];
				e.style.backgroundColor = "#f00";
				break;
			case 3:
				e.style.backgroundColor = "#000";
				map_arr[x][y] = 0;
				break;
		}
		
	}

	function changeS(value){
		state = value;
	}

	function find_path(){
		
		var ways = AStar.find_path(start,end,map_arr,1);
		if(ways.length == 0 ){
			alert("no ways!~~~");
			return ;
		}
		for(var i = 0;i < ways.length; i++){
			 var e = document.getElementById(ways[i][0]+"-"+ways[i][1]);
			e.style.backgroundColor = "#00f";
		}
	}
</script>
<body>
	<div id="map"></div>
	<input type="button" onclick="changeS(1);" value="添加起始"/>
	<input type="button" onclick="changeS(2);"  value="添加终点" />
	<input type="button" onclick="changeS(3);"  value="添加障碍物" />

	<input type="button" onclick="find_path();"  value="生成路径" />
</body>


分享到:
评论

相关推荐

    A星寻路_A算法栅格地图_a星走格_A星算法_A星栅格_A星

    在压缩包中的"A星寻路"文件可能包含实现A星算法的具体代码示例,通过读取栅格地图数据,计算各个节点之间的路径成本,使用A星算法找到从起点到终点的最短路径。理解并掌握这些知识点,将有助于你在实际项目中实现...

    A星算法介绍

    ### A星算法简介 A*(A星)算法是一种广泛应用于路径寻找和图遍历的算法,能够在图中寻找从起始节点到目标节点的最短路径。虽然A*算法对于初学者而言较为复杂,但一旦掌握其核心原理,就会发现其实质上是非常直观且...

    A星算法的实现(JAVA)

    下面将详细介绍A星算法的基本原理、实现步骤以及在JAVA中的应用。 1. A星算法的基本原理: A*算法的核心在于评估每个节点的F值,F值是G值(从起点到当前节点的实际代价)和H值(从当前节点到目标节点的预估代价)...

    A星算法DEMO

    这个"A星算法DEMO"是一个使用Java编程语言实现的示例,开发工具为NetBeans 8.1。下面将详细介绍A星算法的基本原理以及如何在Java中实现它。 1. A星算法概述: A*算法是Dijkstra算法的一个扩展,它引入了启发式信息...

    A星寻路算法案例

    A星算法的核心思想是使用一个评估函数来指导搜索方向,这个函数通常由两部分组成:g(n)表示从起点到当前节点的实际代价,h(n)是从当前节点到目标节点的启发式估计代价。综合这两个部分,我们得到f(n) = g(n) + h(n)...

    实现a星算法,并用a星算法解决八数码问题

    A星(A*)算法是一种在图形搜索中广泛使用的路径规划算法,它的主要目标是找到从起点到终点的最短路径。A*算法结合了Dijkstra算法的全局最优性和贪婪最佳优先搜索算法的效率,通过引入启发式函数来指导搜索过程,...

    A星算法及A星优化算法源码

    A星算法结合了最佳优先搜索(BFS)和Dijkstra算法的优点,通过引入启发式函数来提高搜索效率。 A星算法的核心包括以下几个关键部分: 1. **开放列表(Open List)**:这是一个优先级队列,存储待检查的节点,根据F...

    A星算法 c语言实现 a*算法

    A星(A*)算法是一种在图形搜索中广泛使用的路径规划算法,它的主要目标是找到从起点到终点的最短路径。A*算法结合了Dijkstra算法的全局最优性和最佳优先搜索的效率,通过引入启发式函数来指导搜索,使得算法能够更...

    A星算法简单实现(附源码)

    A星算法简单的实现,分别使用C#、Python、JavaScript三种语言实现,通过界面10x10方格展示算法过程 思路参考于:https://blog.csdn.net/zhanghow/article/details/53585286

    基于MATLAB的A星算法源码

    基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星算法源码基于MATLAB的A星...

    A星算法格栅地图路径考虑障碍物的动态切点光滑算法-matlab代码

    1. **A星算法**:A星算法的核心在于维护一个优先级队列,其中包含当前可能的最短路径节点。每个节点有一个评估函数值`f(n) = g(n) + h(n)`,`g(n)`表示从起点到当前节点的实际代价,`h(n)`是启发式估计从当前节点到...

    易语言源码易语言A星算法源码.rar

    本压缩包“易语言源码易语言A星算法源码.rar”提供了易语言实现的A星(A*)寻路算法的源代码,这对于想要了解或学习A*算法以及易语言编程的人来说是一份宝贵的资源。 A星算法是路径搜索领域中的一种非常高效的算法,...

    易语言A星寻路算法

    在压缩包文件"A星算法.Q"中,可能包含了实现易语言A星算法的源代码示例,你可以通过阅读和分析代码来进一步理解其具体实现细节。此外,学习和理解A星算法的过程中,可以参考相关编程书籍、在线教程和开源项目,以便...

    易语言A星算法 游戏自动寻路源码

    A星算法的核心思想是找到从起点到目标点的最小代价路径。它使用一个开放列表和一个关闭列表来存储节点。开放列表包含待检查的节点,而关闭列表则存储已检查过的节点。算法的主要步骤如下: 1. 初始化:将起点放入...

    A*算法A星算法

    A*(发音为 "A-star")算法是一种在图形搜索中广泛应用的路径寻找算法,它结合了Dijkstra算法和最佳优先搜索,旨在找到从起点到目标点的最短路径。A*算法以其效率和准确性而著名,特别是在游戏、地图导航和机器人...

    A星算法~~~

    A星算法的核心在于结合了Dijkstra算法的全局最优性和最佳优先搜索的效率。它使用一个优先队列来存储待评估的节点,根据每个节点的评估函数值F进行排序。F值由两部分组成:G值(从起点到当前节点的实际成本)和H值...

    A星算法大全

    A星算法(A* Search Algorithm)是路径搜索领域中一种经典的启发式搜索算法,因其高效性和准确性而被广泛应用。这个名为"A星算法大全"的资源显然提供了深入学习和理解A星算法的全面教程,对于想在游戏中实现智能路径...

    A星算法演示

    在这个"A星算法演示"项目中,我们可以通过MFC(Microsoft Foundation Classes)窗口程序来直观地理解并学习A星算法。MFC是微软提供的一种C++库,用于构建Windows应用程序,它简化了窗口、菜单、控件等元素的创建和...

    基于Qlearning算法最优路径规划算法matlab仿真,同时使用A星算法进行对比+代码操作视频

    2.内容:基于Qlearning算法最优路径规划算法matlab仿真,同时使用A星算法进行对比+代码操作视频 3.用处:用于Qlearning算法,A星算法编程学习 4.指向人群:本硕博等教研学习使用 5.运行注意事项: 使用matlab...

Global site tag (gtag.js) - Google Analytics