A*算法
来源:互联网 发布:win10的80端口被占用 编辑:程序博客网 时间:2024/06/07 22:29
A*算法:一种典型的人工智能启发式搜索算法,被广泛应用在最优路径求解和一些策略设计的问题中。
启发式搜索:与DFS和BFS这类盲目型搜索最大的不同,就在于当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最小(大)的结点作为下一步搜索结点,以求得问题的最小(大)值。
选择代价最小(大):STL库中的数据结构priority_queue。
估价函数:f(n)=g(n)+h(n) f(n)是结点n的估价函数值,g(n)是从初始结点到n结点的实际代价,h(n)是从n结点到目标结点最佳路径的估计代价,因为真正代价h*(n)显然目前无法求出,但对最小值问题,要求h(n)<=h*(n);对最大值问题,要求h(n)>=h*(n)。显然,g(n)是已知的,g(n)代表了搜索的广度优先趋势,而h(n)体现了搜索的启发信息。
g(n):一般取起始结点到当前结点的距离; h(n):一般取当前结点到目标结点的曼哈顿距离;
DFS和BFS:显然,A*算法与它们的联系就在于,当g(n)=0时,该算法类似于DFS;当h(n)=0时,该算法类似于BFS,没有一点启发信息,可以认为BFS是“最烂的”A*算法。
IDA*算法:这种算法被称为迭代加深A*算法,可以有效的解决A*空间增长带来的问题,基本不怎么花费内存,甚至可以不用到优先级队列。
时间复杂度:通常比较难以估算其复杂度,建议通过实际测试,边比较边学习,同时还应该统计搜索过程中的状态数,以便得到更清晰的结果。
实现:
创建两个表“开启列表”OPEN和“关闭列表”CLOSED;void ASTAR(){ CLOSE与OPEN初始化为空,将起始结点放入OPEN表; while(OPEN!=NULL) { 从OPEN表中取估价值f最小的结点CurrentNode; 将CurrentNode结点从OPEN表中删除; if(CurrentNode结点==目标结点) { 求得路径PATH; break; } for(CurrentNode结点的每一个子结点NewNode) { if(NewNode不在OPEN表和CLOSED表中) { 求NewNode的估价值f; 将NewNode插入OPEN表中; } else if(NewNode在OPEN表中) { if(NewNode的估价值f小于OPEN表中结点的估价值) 更新OPEN表中的估价值;//取最小路径的估价值 } else //NewNode在CLOSED表中 { if(NewNode的估价值f小于CLOSED表中结点的估价值) { 更新CLOSED表中的估价值; 从CLOSED表中移出结点,并把NewNode放入OPEN表中; } } 将CurrentNode结点插入CLOSED表中; 按照估价值将OPEN表中的结点排序; }//for }//while}
阅读全文
0 0
- A*算法
- A*算法
- A*算法
- A*算法
- A*算法
- A*算法
- A* 算法
- A*算法
- A * 算法
- A* 算法
- A* 算法
- A*算法
- A*算法
- A*算法
- A*算法
- A*算法
- A*算法
- A*算法
- socket.io 中文手册 socket.io 中文文档
- 练习 3-4 在数的对二的补码表示中,我们编写的itoa函数不能处理最大的负数,即n等于-2^(字长-1)的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。
- 机器学习实战_初识决策树(ID3)算法_理解其python代码(二)
- JAVA实现http/https的Post、Get、代理访问请求
- CSU-ACM2017暑期训练12-KMP H
- A*算法
- chromedriver_selenium_java2(图片,JavaScript)
- C#使用Dropzone.js上传图片
- Nginx性能优化
- Docker介绍
- 练习 3-5 编写函数 itob(n, s, b),将整数n转换为以b为底的数,并将转换结果以字符的形式保存到字符串s中。例如,itob(n, s, 16)把整数n格式化成十六进制整数保存在s中。
- 我的实现_头部
- LeetCode之1.Two Sum
- 棋盘反转