A*算法——启发式搜索
A*算法
本质还是搜索:加了优化而已
关于这个优化,听到两种说法:
1.剪枝
通过判断预计最少还要几步,加强版剪枝
比如说一个经典剪枝:
如果
步数≥已知最小值
则
剪枝
升级|
V
如果
步数+最少还要几步≥已知最小值
则
剪枝
2.修改顺序
每次搜索时优先考虑最有可能是最有解的选项
(启发的感觉)
可以建个优先队列来维护每次取到的f最小
注:
f=g+h
g为已经用的步数
h为预计要用的步数
——我倾向于这一种,因为感觉更加神奇,而且写出来是非递归(递归的心理阴影)——
下面来一道水题:BFS轻松过的我来写A*
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19699 poj3984事实上既然m n都是5,BFS说不定会比A*更优
但是说明问题就好
#include <cstdio>
#include <queue>
#include <cmath>
using namespace std;
struct hh
{
int x,y,z;
};
priority_queue<hh> q;
int n,m,t,x1,yy,x2,y2,_x,_y;
bool ma[][],b[][],c[][];
int f[][],g[][],h[][],fa[][],mo[][];
bool operator <(hh a,hh b)
{
return a.z>b.z;
}
int add(int x,int y,int z)
{
hh p;
p.x=y;p.y=z;p.z=x;
q.push(p);
return ;
}
int check(int x,int y,int z,int ff,int m)
{
if(!ma[x][y])
{
if(b[x][y])
{
if(g[x][y]>z)
{
g[x][y]=z;
f[x][y]=z+h[x][y];
fa[x][y]=ff;
mo[x][y]=m;
add(f[x][y],x,y);
}
}
else
if(!c[x][y])
{
b[x][y]=true;
g[x][y]=z;
h[x][y]=abs(x-x2)+abs(y-y2);
f[x][y]=g[x][y]+h[x][y];
fa[x][y]=ff;
mo[x][y]=m;
add(f[x][y],x,y);
}
}
return ;
}
int a_star()
{
check(x1,yy,,,);
while(!q.empty())
{
int x=q.top().x;
int y=q.top().y;
q.pop();
if((x==x2)&&(y==y2))
return g[x][y];
b[x][y]=false;
c[x][y]=true;
check(x-,y,g[x][y]+,x,y);
check(x,y-,g[x][y]+,x,y);
check(x+,y,g[x][y]+,x,y);
check(x,y+,g[x][y]+,x,y);
}
return ;
}
int print(int x,int y)
{
if(fa[x][y]>)
print(fa[x][y],mo[x][y]);
printf("(%d, %d)\n",x-,y-);
return ;
}
int main()
{
n=;m=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&ma[i][j]);
x1=;yy=;x2=;y2=;
a_star();
print(,);
return ;
}
代码不是很长,而且因为刚写完别的题,这里只是套了一下,很多代码是多余的
print递归输出不用管
a_star是主要程序(一看就知道)
check用于检查当前点周围一圈的点能不能加入队列,b表示点是否已经加入,c表示该点是否已经退出(已退出的不用管了)
记得在有更优值时更新
其实像是一种更加神奇的Dj——优先级是预计中的全路而不是已搜到的路,让程序能稍稍有点远见前面是坑还是会钻
这样写最神奇的地方在于它会向着目标一头栽过去,而不是像广搜只顾着预定的顺序,更加接近正常人的逻辑,因此搜索范围大大减小。
既然每个点都只能进队列一次,这个算法的复杂度最差情况下还是很低的
A*算法——启发式搜索的更多相关文章
- 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】
在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或 A* 算法. 个人观点: A* 算法并不保证找到的路径一 ...
- 集训Day10
果然颓的不像话 bzoj3680 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天 ...
- 启发式搜索A*算法
A* 寻路算法 (2011-02-15 10:53:11) 转载▼ 标签: 游戏 分类: 算法 概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的. 搜索区域(T ...
- 启发式搜索——A*算法
启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...
- 启发式搜索 A*算法的OC 实现
前两天重新学习了下A*算法,上次学习A*算法已经是5年前了,看到网上铺天盖地的A*算法都是C.C++等等其他语言的,就是没有OC 的,所以抽空写了一份.今天太晚了就不说明A*算法的细节了,大家如果想学 ...
- js版九宫格拼图与启发式搜索(A*算法)
九宫格拼图游戏大家都很熟悉,这里给大家如介绍何应用状态空间搜索的方式求解拼图的最佳路径和一个游戏dome及自动求解方法: 本文分web版游戏的实现和启发式搜索算法两部分: 先看dome,直接鼠标点击要 ...
- 【启发式搜索】【A*算法】hdu6171 Admiral
一个舰队的目标状态如上图.红色是旗舰.然后给你初始局面,每一次决策可以把旗舰和其上一层或下一层的两个相邻的进行交换.如果能在20步内出解的话,输出最小步数:否则输出“too difficult”. 把 ...
- A*算法
A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...
- [Evolutionary Algorithm] 进化算法简介
进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...
随机推荐
- CentOS个人目录下中文路径转英文路径
CentOS个人目录下中文路径转英文路径 如果安装了中文版到CentOS之后,root目录及home目录下会出现中文到路径名,如"桌面"."文档"," ...
- 设置arc 的默认编辑器
arc set-config editor "vim" 转自:http://udn.yyuap.com/thread-39791-1-1.html Pharicator是FB的代码 ...
- 5、Servlet的使用
一.什么是Servlet:用于开发动态Web资源的的技术.使用Servlet可以读取来自用户端的数据,而实现了用户与服务器之间的动态数据交互.更简单的说就是连接页面和代码. 1.开发一个动态的Web资 ...
- tyvj1086 Elevator
背景 广东汕头聿怀初中 Train#2 Problem4 描述 现有N种箱子,每种箱子高度H_i,数量C_i.现选取若干箱子堆成一列,且第i种箱子不能放在高度超过A_i的地方.试求最大叠放高度. 输入 ...
- ANT的安装
1.下载ANT http://ant.apache.org/bindownload.cgi 2.将下载下来的压缩包解压到任意文件夹下,例如D盘根目录下D:/apache-ant-1.9.2 3.添加环 ...
- 关于BigDecimal 和 double 类型保存金钱,以及精度问题,银行家舍入法
1. BigDecimal 类型数据 的创建,构造函数 有 public BigDecimal(BigInteger intVal, long val, int scale, int prec); p ...
- MySQL Cluster在线添加数据节点
增加或减少数据节点的数量和 NoOfReplicas(即副本数,通过管理节点的config.ini配置文件来设置)有关,一般来说NoOfReplicas是2,那么增加或减少的数量也应该是成对的,否则要 ...
- padding
padding-top:20px;上内边距 padding-right:30px;右内边距 padding-bottom:30px;下内边距 padding-left:20px;左内边距 paddin ...
- bzoj1023: [SHOI2008]cactus仙人掌图
学习了一下圆方树. 圆方树是一种可以处理仙人掌的数据结构,具体见这里:http://immortalco.blog.uoj.ac/blog/1955 简单来讲它是这么做的:用tarjan找环,然后对每 ...
- Python自动化之一对多
一对多 建立一对多关系之后(也就是加了外键),会在字表里面多一个"外键字段_id"这个字段 查询 #_*_coding:utf-8_*_ from django.db import ...