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. GIFT-EMS礼记----青软S2SH(笔记)

    这个S2SH的项目,是这本书的一个贯穿项目,所以这里要记录一下, 看这个项目有两个目的: 1.借助这个项目,学习一下S2SH的综合配置及使用 2.借助这个项目练习一下如何做需求分析和项目架构设计. P ...

  2. 大熊君JavaScript插件化开发------(实战篇之DXJ UI ------ ProcessBar)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,还记得前两篇文章吗.主要讲述了以“jQuery的方式如何开发插件”,以及过程化设计与面向对象思想设计相结合的方式是 如何设计一个插件的,两种方式各有利 ...

  3. 【Json】关于json解析时异常org.json.JSONException: A JSONObject text must begin with '{' at character 1 of {的解决方法

    遇到这种异常有几种情况: 1.JSON格式有问题,检查一下格式. 2.格式没问题,仍然报错,这个是因为你的json文件头里带有编码字符(如UTF-8等),读取字符串时json串是正常的,但是解析就有异 ...

  4. [Machine Learning & Algorithm] 随机森林(Random Forest)

    1 什么是随机森林? 作为新兴起的.高度灵活的一种机器学习算法,随机森林(Random Forest,简称RF)拥有广泛的应用前景,从市场营销到医疗保健保险,既可以用来做市场营销模拟的建模,统计客户来 ...

  5. [Python] 网络爬虫和正则表达式学习总结

    以前在学校做科研都是直接利用网上共享的一些数据,就像我们经常说的dataset.beachmark等等.但是,对于实际的工业需求来说,爬取网络的数据是必须的并且是首要的.最近在国内一家互联网公司实习, ...

  6. 【荐1】Total Commander 7.57 个人使用设置 及 常用快捷键 备忘

    Total Commander 7.57a  下载地址:http://www.baidu.com/s?wd=total commander 7.57 破解版 软件整体预览图:(注意,下面的版本我用的是 ...

  7. 加载默认图片,如何避免img标签陷入onerror事件死循环

    当图片加载失败的时候,我们可以利用onerror事件赋予它默认图片,但是问题来了,假如默认图片又不存在呢,即加载失败,这个时候就会陷入死循环. 为了避免死循环的情况,我们可以在执行完onerror事件 ...

  8. popoverPresentationController UIPopoverController 使用方法详解

    之前iPad特有的控件,现在iPhone亦可使用. 点击按钮,弹出popOverVC. 按钮的点击事件: - (IBAction)pickOrderAction:(UIButton *)sender ...

  9. 双击导航栏自动滑动ListView到顶部

    有些app都实现了双击导航栏让页面的list自动滑动到顶部的feature. 先实现一个继承于OnTouchListener的监听多次点击事件的监听器,通过callback把连续点击的次数返回给客户代 ...

  10. canvas的简单圆形进度条

    window.onload = function(){ function arc(canvas,number){ var canvas = document.getElementById(canvas ...