[A*算法05]A*算法部分逻辑搭建

Posted AIplusX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[A*算法05]A*算法部分逻辑搭建相关的知识,希望对你有一定的参考价值。

写在前面

上次的语法问题没有解决,我换了一种更为清晰的实现思路,将在接下来给出。今天也实现了A*算法的逻辑设计。

知识点

1:C++类的前向声明写法:

class Graph

实现

首先是数据流转方向,具体如下图所示:

首先利用user_para在Graph对象user_graph中生成起点,终点,障碍物的坐标,并且通过user_graph对象的get方法做为接口将起点,终点,障碍物的坐标和user_para参数传递给A_star类的对象astar,最终在astar对象里完成算法的构建和路径的生成。

void A_star::set_start_end_obs_map(Graph& user_graph)
{
	start = user_graph.get_start();
	end = user_graph.get_end();
	obstacleset = user_graph.get_obstacle();
	user_trajectory = user_graph.get_userPara();
}

8邻域法的搜索方式如下图所示:

整张地图是向右为x轴正方向,向下为y轴正方向,因此我定义了2个数组,这样就可以通过一次循环遍历周围8个点了(思路来自github程序,侵权请评论,马上删除)。具体实现如下所示:

	for (int i = 0; i < env_nums; i++){
		Point search_p(p.x + offset_x[i], p.y + offset_y[i]);

	}

然后就是A*算法的逻辑了,这边我参考了知乎大佬的伪代码,超链接如下所示:

路径规划之 A* 算法;

昨天比较匆忙还没有实现完全:

void A_star::Astar_algorithm()
{
	add_openset(start);
	int max_Fn_idx(0);
	Point max_Fn_p = start;

	while (!openset.empty()) {
		max_Fn_idx = find_min_Fn(max_Fn_p);

		if (is_end(openset[max_Fn_idx])) {

		}else{
			delete_openset(max_Fn_idx);
			add_closeset(max_Fn_p);
			search_8_block(max_Fn_p);
		}
	}

}

整体逻辑如上所示,今天还有一部分没有实现,明天一定完成!

接下来介绍一下部分功能函数:

这4个函数就是open_set和close_set增删的实现,利用的STL的vector模块:

void A_star::add_openset(Point& p)
{
	openset.push_back(p);
}

void A_star::add_closeset(Point& p)
{
	closeset.push_back(p);
}

void A_star::delete_openset(const int& idx)
{
	openset.erase(openset.begin() + idx);
}

void A_star::delete_closeset(const int& idx)
{
	closeset.erase(closeset.begin() + idx);
}

还有就是启发函数Hn的计算方法了,我在函数的输入设计了一个参数,可以通过这个参数修改启发函数的形式:

void A_star::calcu_Hn(const int& move_type, const Point& p1, const Point& p2)
{
	int dx = abs(p1.x - p2.x);
	int	dy = abs(p1.y - p2.y);
	switch (move_type)
	{
	case Manhattan_Distance:
		Hn = plane_cost * (dx + dy);
		break;
	case Cross_Distance:
		Hn = cross_cost * (dx + dy) + (cross_cost - 2 * plane_cost) * user_min(dx, dy);
		break;
	case Euclidean_Distance:
		Hn = plane_cost * (dx * dx + dy * dy);
		break;
	default:
		Hn = -1;
		break;
	}
}

明天就是完成整个A*算法的逻辑设计以及实现并结束这个系列啦~

以上是关于[A*算法05]A*算法部分逻辑搭建的主要内容,如果未能解决你的问题,请参考以下文章

编程思想与算法

常用编程思想与算法

FinClip小程序+Rust:环境搭建

算法面试通关

逻辑回归模型

直方图统计的FPGA实现