一步一步写算法(之 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 10款Java小游戏(详解+源码)

    10款Java小游戏(详解+源码)开源Java小游戏前言下面就给大家介绍十几个开源的Java小游戏,供大家学习交流。资源都下载好共享到我的交流群了,需要的在群内自取862461829不收取任何资源费,毕竟开源才是我们的宗旨。【群里还含有:Java80g学习资料包+Java学习书籍+Java项目实战源码+安装软件等】各类资源都有哦~1.数字彩虹雨这是我比较喜欢的一个小应用,虽然代码比较简单但是喜欢那种简单的美。下面是运行截图,就是我们在黑客帝国里面见到的那种数字雨,运行时是全屏的。下面说说下载链接里面的东西.

    2022年7月9日
    19
  • 使用C#创建WebService实例

    使用C#创建WebService实例新增WebService专案更改服务程式名称重命名程式名称Service1.asmx修改为TestService.asmx此时下面的cs代表文件也会跟着修改,但可发现,代码中的类名并没有跟着变动修改类名称手动将类名称由Service1修改为TestService如果此时执行发布会发现还是会vb.net教程有问题,报错無法建立型別‘.Service1’修改服务绑定代码在TestService.asmx上右键选择打开方式,选择“Web服务编辑器”打开此时会看到服务所有设定,

    2022年7月21日
    12
  • 线与逻辑与OC门、OD门关系

    线与逻辑与OC门、OD门关系线与逻辑:两个或多个输出信号连接在一起可以实现逻辑“与”的功能。以下图为例:当与非门G1和G2输出都为1时,输出L才为1;只要有一个输出为0,则输出L为0。在硬件上,要用OC门(三极管,集电极开路)或OD门(NMOS,漏极开路)来实现。另外,为了防止灌电流过大,在输出端要加1个上拉电阻。我们先来说说集电极开路输出的结构。集电极开路输出的结构如图1所示,右边的那个三极管集电极什么…

    2025年6月6日
    1
  • 什么是有限状态机?

    什么是有限状态机?这里是修真院前端小课堂 每篇分享文从 背景介绍 知识剖析 常见问题 解决方案 编码实战 扩展思考 更多讨论 参考文献 八个方面深度解析前端知识 技能 本篇分享的是 什么是有限状态机 大家好 我是 IT 修真院北京总院第 24 期的学员 一枚正直纯洁善良的 web 程序员今天给大家分享一下 修真院官网 js 任务 3 深度思考中的知识点 什么是有限状态机 1

    2025年9月7日
    2
  • ajax跨域请求jsonp完整示例

    ajax跨域请求jsonp完整示例最经用到jsonp(ajax)的跨域请求,在这分享给大家,有需要用到的一看就能明白。具体步骤如下:1.首先客户端即页面script中调用代码如下:        varcardNumber="***********"; $.ajax({ type:"GET", url:’你请求的服务地址?idCard=’+cardNumber, dataType:…

    2022年6月17日
    103
  • 提供一个免费的CSDN下载账号

    提供一个免费的CSDN下载账号

    2021年11月16日
    40

发表回复

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

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