A*算法在最短路问题的应用及其使用举例
1 A*算法
A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的:
其中f(n)是节点n的估价函数,g(n)表示实际状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。另外定义h'(n)为n到目标节点最佳路径的实际值。如果h'(n)≥h(n)则如果存在从初始状态走到目标状态的最小代价的解,那么用该估价函数搜索的算法就叫A*算法。
2 第K最短路的算法
我们设源点为s,终点为t,我们设状态f(i)的g(i)为从s走到节点i的实际距离,h(i)为从节点i到t的最短距离,从而满足A*算法的要求,当第K次走到f(n-1)时表示此时的g(n-1)为第K最短路长度。C++代码如下:()
CDOJ找的一道例题:(模板题)这里面用到SPFA算法(这是中国人创造的,用于求单源最短路的一种算法,关于SFPA时间复杂度的问题,,,不确定性,有时很大,有时很小,emmmm,貌似外国人不太认可,)
Time Limit: 10000 MS Memory Limit: 256 MB
Submit Status
6·1即将来临,游乐园推出了新的主题活动,雨过天晴,帆宝
和乐爷
童心未泯,准备一探究竟。
兴奋的他们一入园便和孩子们打成一片,不知不觉便走散了。
当他们意识到的时候,只能通过手机来确认对方的位置。
他们当然想尽快找到对方,然而由于孩子们实在是太多,只能选择距离稍远的但是游客稀少的路会合。
帆宝
希望找到第kk短的路径,这条路径是他认为的幸运路径。
帆宝
迫切地想知道该条路径的长度,而乐于助人的你也一定会帮助她的。
Input
第一行三个整数n,m,kn,m,k,分别表示游乐园的景点数目、景点之间的道路数目以及路径长度从小到大排列时希望选择的序号。
第二行两个整数S,TS,T,分别表示帆宝
和乐爷
所在景点的编号。
接下来mm行,每行三个整数u,v,wu,v,w,表示编号为uu和vv的景点之间有一条长度为ww的单向通路。
1≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤1001≤n≤1000,0≤m≤100000,1≤k≤1000,1≤S,T,u,v≤N,1≤w≤100
Output
第一行一个整数xx,表示所选路径的长度
无解输出−1−1
Sample input and output
Sample Input | Sample Output |
---|---|
|
|
题意:给你起点,终点以及要求的第K短路;
题解:首先将有向图以终点T为起点,计算出T到每一个边的最短距离(到第i条边dis[i]),
然后建立一个优先队列,从优先队列中弹出f(p)最小的点p,如果p就是T,则T的次数加一。如果当前次数等于K则当前路即为地K小
的路,,否则,,便利每一个p 所连的边,将其扩张出的到p临接点的信息加入到优先队列中;
AC代码:
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
const int AX = 1e5+;
const int MAXN = 1e3+;
int n,m,k;
int s,t;
int tot;
int retot;
struct edge{
int to,w;
int next1;
}G[AX],RG[AX]; struct Node{
int v;
int f,h,g;
bool operator < (const Node &a) const{ return f==a.f? g>a.g : f>a.f; }
}; int dis[MAXN];
int head[MAXN];
int rehead[AX];
int vis[MAXN]; void add_edge(int u,int v,int c)
{
G[tot].to=v;
G[tot].w=c;
G[tot].next1=head[u];
head[u]=tot++; RG[retot].to=u;
RG[retot].w=c;
RG[retot].next1=rehead[v];
rehead[v]=retot++;
}
void SPFA()
{
for(int i=;i<=n;i++) dis[i]=INF;
dis[t]=;
queue<int> Q;
Q.push(t);
while(!Q.empty())
{
int u=Q.front();
Q.pop();
for(int i=rehead[u];i!=-;i=RG[i].next1)
{
int v=RG[i].to ;
int w=RG[i].w ;
if(dis[v]>dis[u]+w)
{
dis[v]=dis[u]+w;
Q.push(v);
}
}
}
} int Astar(Node a)
{
memset(vis,,sizeof(vis));
if(dis[s]==INF) return -;//如果没有与S相连的点
if(s==t) k++;
priority_queue<Node> Q;
Q.push(a);
while(!Q.empty())
{
Node tmp=Q.top();
Q.pop();
int v=tmp.v;
vis[v]++;
if(vis[t]==k) return tmp.g;
for(int i=head[v];i!=-;i=G[i].next1)
{
Node p;
p.v=G[i].to;
p.h=dis[G[i].to];
p.g=tmp.g+G[i].w;
p.f=p.g+p.h;
Q.push(p);
}
}
return -;
} int main()
{
tot=;
retot=;
memset(head,-,sizeof head);
memset(rehead,-,sizeof rehead);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d",&s,&t);
int x,y,w;
for(int i=;i<m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add_edge(x,y,w);
}
SPFA();
Node a;
a.v=s;
a.g=;
a.h=dis[s];
a.f=a.g+a.h;
int g=Astar(a);
printf("%d\n",g);
return ;
}
后面我还会更新出 关于启发式搜索的讲解,以及Dijkstra,,SPFA,Folyd这三种关于不同最短路问题讲解及例题分析。
越努力,越幸运! 加油!!!
A*算法在最短路问题的应用及其使用举例的更多相关文章
- 最短路问题的三种算法&模板
最短路算法&模板 最短路问题是图论的基础问题.本篇随笔就图论中最短路问题进行剖析,讲解常用的三种最短路算法:Floyd算法.Dijkstra算法及SPFA算法,并给出三种算法的模板.流畅阅读本 ...
- 用Apache Ant在Weka中嵌入新算法
本文将介绍一种新的添加新的算法到Weka中的方法,国内的论坛基本都是通过IDE(Eclipse或NetBeans)编译,详细教程请见上一篇博客.经研究,发现国外的网站很流行用Ant这个方法,教程奉上. ...
- 用Eclipse在Weka中嵌入新算法
本文介绍添加一个新算法到Weka集成环境中的过程,并能在GUI中运行并显示其结果.想做到这一点有两种方法,一是用ANT命令生成新的weka.jar(稍后写教程),二是用IDE(Eclipse或NetB ...
- HDU--杭电--3790--最短路径问题
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- POJ 2472 106 miles to Chicago(Dijstra变形——史上最坑的最长路问题)
题目链接 :http://poj.org/problem?id=2472 Description In the movie "Blues Brothers", the orphan ...
- java学会需要掌握的知识(来源网上。。)
Java就业指导 2016-03-22 骆昊 程序人生 点击上方"程序人生"关注我们 想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些 ...
- C++拾遗
1三个概念 字符串字面值是一串常量字符(是一个常量),字符串字面值常量用双引号括起来的零个或多个字符表示,为兼容C语言,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符.字符串字面值的类型 ...
- springMVC web项目 对访问数据库的用户名密码进行加密解密
在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入.properties的变量,例如 在config.proper ...
- Adaboost总结
一.简介 Boosting 是一类算法的总称,这类算法的特点是通过训练若干弱分类器,然后将弱分类器组合成强分类器进行分类.为什么要这样做呢?因为弱分类器训练起来很容易,将弱分类器集成起来,往往可以得到 ...
随机推荐
- kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用
1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...
- 将 /u 转变为 utf-8 编码
将 /u 转变为 utf-8 编码 PHP实例: $result = {"errno":-1,"message":"\u8bbf\u95ee\u5fa ...
- H5 - css3(学习c3的第一天)
css3 中的转换:可以对元素进行移动.缩放.装懂.拉长或拉伸. 属性值:transform 每个浏览器的内核都不同,所以对应的前缀也不同,谷歌的是: -webkit- : ie的是 -ms- ...
- ubunit 16 安装pip
pip是一个用来安装和管理python包的工具.已经内置到python2.7.9和python3.4及其以上的版本里. python2.7执行: sudo apt-get install python ...
- 关于手机微信端ios的input不能选中问题解决方案
最近在做一个微信端的商城,以前做web端的比较多,手机端做的相对来说要少点,老板说让我用俗称”靠谱的移动前端框架”—-AUI来搭建项目. 当时觉得用不用框架无所谓啦.结果后来写到一半把项目发布到手机上 ...
- vue3.0wactch监听
<template> <div> <input v-model="count" /> </div> </template> ...
- vue-cli从2升级到3报错error 404 Not Found: @wry/context@^0.4.0
vue3出来了,想尝尝鲜. 于是按官方的方法卸载2安装3. npm uninstall vue-cli -g npm install -g @vue/cli 但是报错了 error 404 Not F ...
- PHP提高SESSION响应速度的方法有哪些
1.设置多级目录存储SESSION 默认session的存储目录是1级目录,如果用户量比较大,session文件数量就比较大,我们可以设置目录数为2,使用2级目录可以提交查找和存取速度.不过这种方式对 ...
- 洛谷P2634 聪聪可可 (点分治)
###题目链接### 题目大意: 给你一棵树,假如树上两点间的距离是 3 的倍数 的点对有 s 对,则输出最简分数 s/n ,其中 n 表示所有整棵树的点对总数. 分析: 1.显然,可以采用点分治. ...
- Linux虚拟机扩容根分区CentOs6.9 VMware14
1.首先关闭虚拟机点击编辑虚拟机设置 2.点击想要扩容的硬盘点击扩容 3.增加容量 输入想增加的容量,因为我本身是30G写到35G是加了5G不是增加30G.(此处为了演示只增加5G) 4.开启虚拟机 ...