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*算法——启发式搜索的更多相关文章

  1. 启发式搜索A-Star算法 【寻找 最短路径 算法】【地理几何位置 可利用的情况】

    在处理最短路径问题时,有一种启发式算法是我们应该了解的,由于其有着优秀的探索效率在各自现实项目中多有应用,它就是 A-star 算法,或  A*  算法. 个人观点: A*  算法并不保证找到的路径一 ...

  2. 集训Day10

    果然颓的不像话 bzoj3680 gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天 ...

  3. 启发式搜索A*算法

    A* 寻路算法 (2011-02-15 10:53:11) 转载▼ 标签: 游戏 分类: 算法 概述 虽然掌握了 A* 算法的人认为它容易,但是对于初学者来说, A* 算法还是很复杂的. 搜索区域(T ...

  4. 启发式搜索——A*算法

    启发式搜索 启发式搜索是一种对搜索到的每一个位置进行评估,然后从评估的最优位置进行搜索直到目的地, 由于搜索时对每一个位置的评估是基于直观或经验的所有叫启发式搜索 A*算法 历史: 1964年Nils ...

  5. 启发式搜索 A*算法的OC 实现

    前两天重新学习了下A*算法,上次学习A*算法已经是5年前了,看到网上铺天盖地的A*算法都是C.C++等等其他语言的,就是没有OC 的,所以抽空写了一份.今天太晚了就不说明A*算法的细节了,大家如果想学 ...

  6. js版九宫格拼图与启发式搜索(A*算法)

    九宫格拼图游戏大家都很熟悉,这里给大家如介绍何应用状态空间搜索的方式求解拼图的最佳路径和一个游戏dome及自动求解方法: 本文分web版游戏的实现和启发式搜索算法两部分: 先看dome,直接鼠标点击要 ...

  7. 【启发式搜索】【A*算法】hdu6171 Admiral

    一个舰队的目标状态如上图.红色是旗舰.然后给你初始局面,每一次决策可以把旗舰和其上一层或下一层的两个相邻的进行交换.如果能在20步内出解的话,输出最小步数:否则输出“too difficult”. 把 ...

  8. A*算法

    A*在游戏设计中有它很典型的用法,是人工智能在游戏中的代表. A*算法在人工智能中是一种典型的启发式搜索算法,为了说清楚 A*算法,我看还是先说说何谓启发式算法. 一.何谓启发式搜索算法: 在说它之前 ...

  9. [Evolutionary Algorithm] 进化算法简介

    进化算法,也被成为是演化算法(evolutionary algorithms,简称EAs),它不是一个具体的算法,而是一个“算法簇”.进化算法的产生的灵感借鉴了大自然中生物的进化操作,它一般包括基因编 ...

随机推荐

  1. NPM

    参考资料: 淘宝NPM

  2. nyoj 623 A*B Problem II(矩阵)

    A*B Problem II 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 ACM的C++同学有好多作业要做,最头痛莫过于线性代数了,因为每次做到矩阵相乘的时候,大 ...

  3. exception catch doesn't work?? (python 3)

    exception catch doesn't work?? (python 3) except u.URLError, e: ^ SyntaxError: invalid syntax in Pyt ...

  4. linux常用命令-用户管理命令

    useradd 用户名 passwd 用户名:修改该用户的密码 groupadd 组名 who: 查看现在登录了几个用户,得到的信息含义如下 登录用户名 登录终端 登录时间 登录终端的IP地址(如果没 ...

  5. SQLPULS : 密码中有特殊字符的处理方法

    前日在使用SQLPLUS访问oracle数据库时,系统提示密码过期,需要更新密码.于是不假思索的修改密码为xxx@2016(估计当时脑子抽风了),造成了杯具的开始. 再次进入SQLPLUS,输入用户名 ...

  6. 我常用的grep命令

    查找包含某个字符的行并保存在文件 grep -rn 'test' ./*.sql >test.sql -r 是递归查找 -n 是显示行号 在当前目录下的.sql结尾的文件中查找包含 test 字 ...

  7. Angular2 指令

      1. 指令说明 Angular2 指令是构成Angular2应用程序的重要组成部分,指令主要用来对模板的标签或者元素附加一些新的特性或者功能,改变一个 DOM 元素的外观或行为,Angular2指 ...

  8. OC编程之道-创建对象之工厂方法

    一 何为工厂方法模式?(what) 定义创建对象的接口,让子类决定实例化哪一个类,工厂方法是的一个类的实例化延迟到其子类. 工厂方法创建的对象拥有一组共同的行为,所以往类层次结构中引入新的具体产品并不 ...

  9. 基于STM32和W5500的Modbus TCP通讯

    在最近的一个项目中需要实现Modbus TCP通讯,而选用的硬件平台则是STM32F103和W5500,软件平台则选用IAR EWAR6.4来实现. 1.移植千的准备工作 为了实现Modbus TCP ...

  10. node07-http

    目录:node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-exp ...