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. Python学习笔记——函数

    1.标准类型内建函数 <1>type() —— 返回对象的类型 <2>cmp() —— 比较两个对象,返回两个对象的ASCII码的差 <3>str().repr() ...

  2. 2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等

    1.面向对象贪吃蛇   2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片 ...

  3. VBA笔记(一)

    开启VBA编程环境--VBE 方法一:按<Alt+F11>组合建 方法二:查看代码 宏设置 当然启用宏的设置方式不同,宏的启动方式也不一样. 首先打开"office 按钮&quo ...

  4. 3、CCS样式表

    一.CCS样式表的分类(优先级从低到高): 1.浏览器默认样式表 2.外部样式表:在外部创建的.ccs文件中.使用外部样式表可以使样式应用于多个网页.通过这个方法只需改动一个文件就能改变整个网站的外观 ...

  5. scp命令详解

    \ svn 删除所有的 .svn文件 find . -name .svn -type d -exec rm -fr {} \; linux之cp/scp命令+scp命令详解   名称:cp 使用权限: ...

  6. Swift3.0P1 语法指南——枚举

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  7. 第2月第25天 BlocksKit

    1.blockskit https://github.com/zwaldowski/BlocksKit bk_showAlertViewWithTitle 2.toast +(void)showToa ...

  8. shell--1.shell 相关及变量

    1.shell脚本解释器 Bourme Shell (/usr/bin/sh 或 /bin/sh ) Bourme Again Shell ( /bin/bash ) C Shell ( /usr/b ...

  9. ODBC API简介

    1.      数据类型: 通过SQLGetTypeInfo函数来获取ODBC 3.0支持的数据类型信息.由SQLGetTypeInfo返回的数据类型是数据源所支持的数据类型. SQLRETURN S ...

  10. javascript数据结构-数组

    github博客地址 简介 数组是最简单的数据结构,javascript语言也很早就原声支持了数组Array数据类型,和其他语言略微不同的是:js中的数组可以存储不同类型的值,看起来很厉害的样子,但是 ...