一步一步写算法(之 A*算法)

一步一步写算法(之 A*算法)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

【 声明:版权全部,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

    在前面的博客其中,事实上我们已经讨论过寻路的算法。只是,当时的演示样例图中,可选的路径是唯一的。我们挑选一个算法,就是说要把这个唯一的路径选出来,怎么选呢?当时我们就是採用穷尽递归的算法。然而,今天的情形有点不太一样了。在什么地方呢?那就是今天的路径有n条,这条路径都能够达到目的地,然而我们在挑选的过程中有一个要求,那就是挑选的路径距离最短?有没有什么办法呢?

    那么,这时候就要A*算法就能够排上用场了。A*算法和普通的算法有什么差别呢?我们能够用一个演示样例说明一下:

/*
*       0  0  0  0  0
*       1  1  1  1  1
*       1  0  0  0  1  
*       1  0  0  0  1   
*       A  1  1  1  1
*/

    这是一个5*5的数组。如果我们从array[1][0]出发,目标为A点。我们发现,在图中有两种方法能够到达目的地,可是往下直达的方法最短。那么怎么找到这个最短的算法呢?朋友们能够好好思考一下。

    我们能够把时光回到到达的前几个步骤?我们为什么要选方向朝下的点,而不选水平方向的点?原因不复杂,就是由于全部点中,当时我们要选的这个点和目标点之间距离最短。那么这中间,路径的选择有没有发生改变呢?事实上是有可能的,由于选路的过程本省就是一个pk的过程,我们所能做的就是寻找当时那个离目标近期的点而已,而这个点是时刻变化的,所以最后选出来的路应该是这种。

/*
*       0  0  0  0  0
*       1  0  0  0  0
*       1  0  0  0  0  
*       1  0  0  0  0   
*       A  0  0  0  0
*/

    算法编程算法,应该怎么改动呢?当然首先定义一个数据结构?

typedef struct _VALUE
{
	int x;
	int y;
}VALUE;

    然后呢,寻找到和目标点距离最短的那个点,

int find_most_nearest_neigh(VALUE data[], int length, int x, int y)
{
	int index;
	int number;
	int current;
	int median;

	if(NULL == data || 0 == length)
		return -1;

	current = 0;
	number = (int) sqrt((data[0].x - x) * (data[0].x - x)+ (data[0].y - y) *  (data[0].y - y));

	for(index = 1; index < length; index ++){
		median = (int) sqrt((data[index].x - x) * (data[index].x - x)+ (data[index].y - y) *  (data[index].y - y));
		
		if(median < number){
			number = median;
			current = index;
		}
	}

	return current;
}

    寻找到这个点,一切都好办了,那么如今我们就须要又一次对data进行处理,毕竟有些点须要弹出,另一些新的点须要压入处理的。

VALUE* updata_data_for_queue(VALUE* data, int length, int* newLen)
{
	int index;
	int count;
	int max;
	VALUE* pData;

	if(NULL == data || 0 == length || NULL == newLen)
		return NULL;

	max = length << 2;
	pData = (VALUE*)malloc(max * sizeof(VALUE));
	memset(pData, 0, max * sizeof(VALUE));

	count = 0;
	for(index = 0; index < length; index ++){
		if(check_pos_valid(data[index].x, data[index].y - 1)){
			pData[count].x = data[index].x;
			pData[count].y = data[index].y -1;
			count ++;
		}

		if(check_pos_valid(data[index].x -1, data[index].y)){
			pData[count].x = data[index].x -1;
			pData[count].y = data[index].y;
			count ++; 
		}

		if(check_pos_valid(data[index].x, data[index].y + 1)){
			pData[count].x = data[index].x;
			pData[count].y = data[index].y +1;
			count ++;
		}

		if(check_pos_valid(data[index].x + 1, data[index].y)){
			pData[count].x = data[index].x + 1;
			pData[count].y = data[index].y;
			count ++; 
		}
	}

	*newLen = count;
	return pData;
}

    有了上面的函数之后,那么find_path就十分简单了。

void find_path(int x, int y)
{
  while(/* 最短距离不为0 */){

	  /* 更新列表 */

	  /* 寻找近期点 */

  };
}

总结:

    (1)A*的重点在于设计权重推断函数,选择最佳下一跳

    (2)A*的目标是已知的

    (3)A*尤其适合于网格型的路径查找

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118546.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言十进制转八进制程序_c语言八进制以什么开头

    c语言十进制转八进制程序_c语言八进制以什么开头二进制整数转八进制算法二进制整数转换为八进制整数时,每三位二进制数字转换为一位八进制数字,运算的顺序是从低位向高位依次进行,高位不足三位用零补齐。八进制整数转二进制算法八进制整数转换为二进制整数时,每一位八进制数字转换为三位二进制数字,运算的顺序也是从低位向高位依次进行。案例二进制整数转八进制将二进制整数1110111100转换为八进制,转换过程如下:我们将二进制的1110111100转…

    2025年6月21日
    6
  • 软件著作权 源码_python申请软件著作权

    软件著作权 源码_python申请软件著作权申请软件著作权时需要清除代码中的注释,可以通过word和Notepad++组合操作来快速的完成1。使用word的插入文件功能合并多个源代码文件,操作方法为:新打开1个word文件,在“插入”标签栏下找到“对象”点击右边的小三角下拉菜单里选择“文件中的文字…”,然后在跳出来的文件选择对话框里选择要合并的文件,如果对话框里没有显示出需要的文件,可能是文件类型过滤器选择的不对,更改为“所有文件…

    2025年11月12日
    3
  • Murmur下载_murmurio

    Murmur下载_murmurioMurmurHash1MurmurHash简介Murmur英文(multiplyandrotate)and(multiplyandrotate),MurmurHash是一种非加密型哈希函数,适用于一般的哈希检索操作。由AustinAppleby在2008年发明,并出现了多个变种,都已经发布到了公有领域(publicdomain)。与其它流行的哈希函数相比,对于规律性较强的key,…

    2022年10月19日
    3
  • MT4安卓版下载安装

    MT4安卓版下载安装投资者安卓手机可以使用MT4软件吗?答案是:当然可以。MT4软件作为投资者通用的交易软件mt4.M1.xinclo.xyz涵盖了多个版本,电脑版MT4、手机版(包含IOS和安卓)MT4、MAC版MT4。如果是安卓手机,下载和安装安卓版的即可。安卓手机是无法在应用商店搜索到MT4的,因此大多都在网页上先获取安装包。下载交易软件,该软件商店中的移动终端。点击安装,软件会存储在手机桌面上,主界面上会显示MT4交易系统软件。…

    2022年8月15日
    8
  • 反三角函数求解matlab,关於反三角函数atan2的使用 使用Matlab计算反三角函数atan2…[通俗易懂]

    三角函数中atan2是如何计算的atan2(y,x)返回的是弧度值,两者如果相同则是0.785……,既45度我想问的atan2(y,x)是表示X-Y平面上所对应的(x,y)坐标的角度,它的值域范围是(-π,π)用数学表示就是:atan2(y,x)=arg(y/x)-π当y0时,其值为正.当两者相同时,即y=x,则其角度就是π/4,即45度。使用Matlab计算反三角函数atan2各位好…

    2022年4月7日
    123
  • 第十二章《mysql的日志优化》

    第十二章《mysql的日志优化》

    2021年5月29日
    92

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号