A*算法C实现

路径规划-A*(C++实现) 路径规划A星算法,原理与C++实现 阅读详情

参考 http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 实现了A*算法,模拟了一下,大多数场景还是可以应对的,以传统的场景为例 

 

以下,1为源,2为目的,-1为墙。

 

初始地图:

 0  0  0  0  0
 0  0 -1  0  0
 0  1 -1  0  2
 0  0 -1  0  0
 0  0  0  0  0

路径:

 0  0  0  0  0
 0  0 -1  0  0
 0  1 -1  0  2
 0  1 -1  1  0
 0  0  1  0  0

 

但对于下面的地址,处理的结果很差

 0  0  0  0  0
 0 -1  0 -1  0
 1 -1  0 -1  2
 0 -1  0 -1  0
 0  0  0  0  0

 

路径: 

 0  1  0  0  0
 1 -1  1 -1  0
 1 -1  1 -1  2
 0 -1  1 -1  1
 0  0  0  1  0

 

这种场景还要再研究下优化方法,第一版的草稿先粘一下,有兴趣的朋友可以参考。为了方便大家编译,把地图编辑器也去掉了,换成硬编码的二维数组。

 

/*
 * A* 算法模拟
 */

#include <stdio.h>
#include <stdlib.h>
#include <vector>

using std::vector;

typedef struct stNode
{
	stNode() : x(0), y(0), px(0), py(0), f(0), g(0), h(0)
	{}

	int x;
	int y;
	int px; /* 父结点横坐标 */
	int py; /* 父结点纵坐标 */
	int f;
	int g;
	int h;
}Node;

/*
 * 地图0为通路,1为起点,2为终点,-1为不可达
 */
#define ROW 5
#define COLUMN 5
int short_map[][COLUMN] = {
	{0, 0, 0, 0, 0},
	{0, -1, 0, -1, 0},
	{1, -1, 0, -1, 2},
	{0, -1, 0, -1, 0},
	{0, 0, 0, 0, 0}};

vector<Node> close_map;
vector<Node> open_map;

/*
 * 找到本次查找的边界
 */
void CalcBound(Node & cur, int &startx, int &starty, int &endx, int &endy)
{
	startx = (cur.x > 0) ? (cur.x - 1) : cur.x;
	starty = (cur.y > 0) ? (cur.y - 1) : cur.y;
	endx = (cur.x < COLUMN) ? (cur.x + 1) : cur.x;
	endy = (cur.y < COLUMN) ? (cur.y + 1) : cur.y;
}

/*
 * 计算G值,G=从起点 A 移动到指定方格的移动代价,沿着到达该方格而生成的路径 
 */
int CalcG(Node cur, int nextx, int nexty)
{
	if (cur.x == nextx || cur.y == nexty)
	{
		return 10;	
	}
	else
	{
		return 14;
	}
}

/*
 * 计算H值,H=从指定的方格移动到终点 B 的估算成本
 * 我们使用 Manhattan 方法,计算从当前方格横向或纵向移动到达目标所经过的方格数,忽略对角移动,然后把总数乘以 10 
 *
 */
int CalcH(Node dst, int nextx, int nexty)
{
	int stepnum = 0;

	stepnum += ((dst.x >= nextx) ? 1 : -1) * (dst.x - nextx);
	stepnum += ((dst.y >= nexty) ? 1 : -1) * (dst.y - nexty);

	return stepnum * 10;
}

Node * IsInCloseMap(int i, int j)
{
	int pos = 0;
	for (vector<Node>::const_iterator it = close_map.begin(); it != close_map.end(); it++, pos++)
	{
		if (it->x == i && it->y == j )
		{
			return &close_map[pos];
		}
	}

	return NULL;
}

Node * IsInOpenMap(int i, int j)
{
	int pos = 0;
	for (vector<Node>::const_iterator it = open_map.begin(); it != open_map.end(); it++, pos++)
	{
		if (it->x == i && it->y == j )
		{
			return &(open_map[pos]);
		}
	}

	return NULL;
}

void InsertCloseList(Node & node)
{
	close_map.push_back(node);
}

void InsertOpenList(Node & node)
{
	open_map.push_back(node);
}

/*
 * 计算F值,返回下一步坐票
 *
 * param int cur: 当前计算的坐标
 * param out next: 下一步的坐标即F值最小的一个
 */
int FindNext(Node cur, Node dst, Node & next)
{
	int startx = 0; /* 遍历的横向坐标起点 */
	int starty = 0; /* 遍历的纵向坐标起点 */
	int endx = 0;   /* 遍历的横向坐标终点 */
	int endy = 0;   /* 遍历的纵向坐标终点 */

	InsertCloseList(cur);

	/* 计算坐标 */
	CalcBound(cur, startx, starty, endx, endy);

	/* 遍历找到F值最小的坐标 */
	int min = 0;
	int minx = 0;
	int miny = 0;

	Node * pnext = NULL;
	for (int i = startx; i <= endx; i++)
	{
		for (int j = starty; j <= endy; j++)
		{
			if (IsInCloseMap(i, j))
			{/* 已存在于关闭列表 */
				continue;
			}

			if (-1 == short_map[i][j])
			{/* 不可达跳过 */
				continue;
			}

			/* 找到一个相邻结点,判断是否在open_list中 a*/
			Node * node = IsInOpenMap(i, j);
			if (NULL == node)
			{
				node = new Node();
				node->x = i;
				node->y = j;
				node->px = cur.x;
				node->py = cur.y;
				node->g = CalcG(cur, i, j);
				node->h = CalcH(dst, i, j);
				node->f = node->g + node->h;

				InsertOpenList(*node);
			}
			else
			{/* 在open_list中 */
				int g = CalcG(cur, i, j);
				if ((g + cur.g) < node->g)
				{
					node->px = cur.x;
					node->py = cur.y;
					node->g = g;
					node->f = node->g + node->h;
				}
			}

			int value = node->f;
			if (0 == min || min > value)
			{
				min = value;
				pnext = node;
			}
		}
	}

	next = * pnext;

	return 0;
}

void Draw()
{
	for (int i = 0; i < ROW; i++)
	{
		for (int j =0; j < COLUMN; j++)
		{
			printf("%2d ", short_map[i][j]);
		}
		printf("\n");
	}
	printf("\n");

}

int AStar()
{
	Node Src;
	Node Dst;
	Node Cur;
	Node Next;

	/* 查找源和目的结点 */
	for (int i = 0; i < ROW; i++)
	{
		for (int j =0; j < COLUMN; j++)
		{
			if (1 == short_map[i][j])
			{
				Src.x = i; 
				Src.y = j;
				Cur.x = i;
				Cur.y = j;
			}
			
			if (2 == short_map[i][j])
			{
				Dst.x = i;
				Dst.y = j;
			}

			printf("%2d ", short_map[i][j]);
		}

		printf("\n");
	}
	printf("\n");

	/* 寻路 */
	for (int i = 0; ; i++)
	{
		FindNext(Cur, Dst, Next);

		if (Next.x == Dst.x && Next.y == Dst.y)
		{
			InsertCloseList(Next);
			break;
		}

		Cur = Next;
	}

	/* 反向绘图 */
	Node * node;
	int x = Dst.x;
	int y = Dst.y;
	
	while(1)
	{
		node = IsInCloseMap(x, y);
		
		if (NULL == node)
		{
			printf("[%d][%d]\n", x, y);
			break;
		}

		if (node->x == Src.x && node->y == Src.y)
		{
			break;
		}
	
		short_map[node->px][node->py] = 1;
		Draw();
		x = node->px;
		y = node->py;
	}
}

int main(int argc, char ** argv)
{
	AStar();
	return 0;
}


 

C++ 算法学习——1.3 A*算法 A算法是一种常用且高效的启发式搜索算法。 阅读详情

相关推荐

A* A星 算法 C语言 实现代码

关于A*算法,很早就想写点什么,可是貌似天天在忙活着什么,可事实又没有做什么,真是浮躁啊!所以今晚还是来写一下总结吧!         A*算法是很经典的只能启发式搜索算法,关于只能搜索算法和一般的搜索算法(例如DFS,BFS之类),在语言描述上的区别,我觉得用《代码大全》中的一句话描述的非常好:“驾驶汽车达到某人家,写成算法是:沿167号高速往南行至Puyallup,从XX出口后往山上开4

zhanghow的博客 1万+

A* 算法研究(附 Python / C++ 实现)

对 A* 算法的原理进行较为详细的讲解,并给出 Python 和 C++ 的实现

Solititude的博客 3432

C语言实现A*算法

C语言实现A*算法 最近搞MTK斯凯冒泡平台的游戏开发,碰到了自动寻路的问题,很多程序员都知道A*算法,既简单有使用!所以我也选择了A*算法,由于时间比较紧,就在网上百度此算法的C实现,确实有很多!但经测试都有不同的问题,并不能用在商业游戏中,所以最后决定还是自己写吧! A*原理 比较简单,网上有很多介绍的!我也是在网上看的,这里就不重复了! 由于我是Java程序员

2694

【路径规划】全局路径规划算法——A*算法(含python实现 | c++实现)

A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。广泛应用于室内机器人路径搜索、游戏动画路径搜索等A*算法结合了贪心算法(深度优先)和Dijkstra算法(广度优先),是一种启发式搜索算法。它使用一个路径优劣评价公式为: f(n)=g(n)+h(n) f(n)=g(n)+h(n) f(n)=g(n)+h(n)A*算法需要维护两个状态表,分别称为表和表。表由待考察的节点组成, 表由已经考察过的节点组成。如图,假设我们需要从点到目标点,这两点之间有一堵墙。

weixin_42301220的博客 8万+

A*算法C/C++实现

A*算法是一种在图形平面上,有多个节点的路径中,寻找一条从起始点(source)到目标点(goal)的最短遍历路径的算法。它属于启发式搜索算法,因为它使用启发式方法来计算图中的节点,从而减少实际计算的节点数量。,用于在图中找到从起始点(source)到目标点(goal)的最短路径。它属于最佳优先搜索算法的一种,使用启发式方法来估计从当前节点到目标节点的距离,以此来优化搜索过程。

2401_86771711的博客 1913

C 语言实现 A* 算法:从原理到优化实践

A算法是一种高效的启发式路径搜索算法,广泛应用于游戏寻路和导航系统。本文详细介绍了其核心原理:通过评估函数f(n)=g(n)+h(n)选择最优路径节点,其中g(n)为实际代价,h(n)为启发式估计。重点阐述了C语言实现方法,包括节点数据结构定义、曼哈顿距离启发函数设计,以及开放列表和关闭列表的管理策略。文章还探讨了性能优化技巧,如使用优先队列、改进启发函数、双向搜索和剪枝策略。通过理论分析与代码示例,全面展示了A算法从原理到实现的完整过程,为开发高效路径搜索系统提供了实用指导。

数字魔方操控师的博客 1972

C++之A*算法的简单实现

c++的A*算法

hesphoros的个人博客 5615

人工智能A*算法C实现

一、实验内容 对下图所示的状态空间图用A*算法进行搜索: 其中A为起始节点,E为目标节点,各节点的启发值表示在括号内。 二、实验设计(原理分析及流程) A* 是启发式搜索算法。该算法创建两个表:OPEN(类似于回溯算法中的NSL,它列出已经产生但其孩子还未被分析的状态)和CLOSED(记录已经分析了的状态,为回溯算法中的DE与SL列表的联合)。 算法预先将初始节点放入OPEN表,从初始节

读书,反思 3374

c语言实现a*算法

最近要实训需要实现迷宫,所以就先实现了之前一直总是了解算法思路的a算法。最开始我是想凭借自己对于这个寻路算法的理解,完全的按照自己的思路实现,最后结果感人,在实现函数的传递时候,才发现自己对于c语言函数参数传递的概念有些理解错误,导致一直有错误。再我测试了多次,终于发现是由于函数参数传递使用有误,在这里我分享以下自己所遇见的错误吧,并且把自己实现的a算法,所讲一下。 函数参数传递 c语言中的函数传...

weixin_45137677的博客 9054

基于二叉堆优化的A*寻路算法C语言实现与解析

简介:A寻路算法是路径搜索中的经典方法,结合Dijkstra算法与启发式搜索的优势,通过优先级队列高效寻找最短路径。本C语言实例包含AStar.c、AStar.h、main.c和makefile等文件,完整实现了基于二叉堆优化的A算法。其中,AStar.c封装了节点管理、启发式函数计算与路径搜索逻辑,AStar.h提供接口声明,main.c负责地图初始化与算法调用,makefile支持Linux环境下的自动化编译,具备良好的可移植性。该实例适用于理解A*核心机制及C语言在算法工程化中的应用。

weixin_42124497的博客 622

C语言实现的A*算法源代码与路径规划

A*算法是一种启发式搜索算法,广泛应用于路径查找和图遍历等问题。其核心在于结合了最佳优先搜索的高效性和Dijkstra算法的最短路径准确性。算法维护两个集合,一个已关闭集合(Closed Set)和一个开放集合(Open Set)。开放集合中存放待评估的节点,而关闭集合中存放已经评估过的节点。在每一步中,算法会选择在开放集合中估计代价最小的节点进行扩展。算法的逻辑结构可以概括为:1. 初始化开放集合,加入起点。

weixin_33670640的博客 861

聊聊A*算法与Dijkstra算法的Matlab及C实现

A*算法matlab程序,附送c程序Djikstra算法matlab程序代码特点:1. matlab读入excel制作的地图,障碍物为1;2.设置起始点和终止点,A*算法会输出一条近最优路径,因为这是启发式算法;3.Dijkstra算法的输入是邻接矩阵,输出是一个点到所有点的最优路径在路径规划领域,A算法和Dijkstra算法都是赫赫有名的存在。今天就来分享一下它们在Matlab中的实现,顺带送上A算法的C程序代码。

2508_94230129的博客 1546

115.工业相机海康SDK开发指南(阅读)

包含初始化SDK和反初始化SDK接口。(由于看不到函数内部的具体实现,因此以下的解释仅代表个人的理解)

weixin_63779802的博客 5994

A*算法简单实现(C语言)

简单的A*算法,后续考虑更复杂情况,一个C文件即可,VS,linux等都可以直接编译运行。后面首先考虑加上图形化界面(地图可以自己输入确定也考虑下) A*算法原理 这个很简单就不多说了,根据f = g + h。像是欧几里得距离,绝对距离等等,还有周围8节点以及4节点(16节点)对算法的影响也都是同样的道理,简单修改即可 算法流程 //算法流程 //构建地图 //把起点放入open list //w...

weixin_42352795的博客 4255

交通流预测爬坑记(一):交通流数据集,原始数据

常用的交通流数据集,持续更新~~

K_first的博客 4万+

Mac本地部署OpenClaw:从零搭建企业级知识库AI助手

大语言模型(LLM)作为当前人工智能的核心技术,通过其强大的自然语言理解和生成能力,正在深刻改变信息交互方式。其原理是基于海量数据训练的深度神经网络,能够根据上下文预测并生成连贯文本。这一技术的核心价值在于,它能够作为智能中枢,理解和执行复杂指令,从而将通用AI能力转化为解决特定业务问题的生产力。在工程实践中,通过AI Agent框架(如OpenClaw)将LLM与外部工具和知识系统连接,是实现其价值的关键。这涉及到**本地部署**与**私有化**部署,以确保数据安全与成本可控。具体应用场景包括企业知识库问

weixin_33402252的博客 378
上一篇: 关于模版的一个问题
下一篇: 转一个,备忘
nellson
博客等级 码龄20年 48粉丝 84原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值