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代码:
1 #include <bits/stdc++.h> 2 #define INF 0x3f3f3f3f 3 using namespace std; 4 const int AX = 1e5+66; 5 const int MAXN = 1e3+66; 6 int n,m,k; 7 int s,t; 8 int tot; 9 int retot; 10 struct edge{ 11 int to,w; 12 int next1; 13 }G[AX],RG[AX]; 14 15 struct Node{ 16 int v; 17 int f,h,g; 18 bool operator < (const Node &a) const{ return f==a.f? g>a.g : f>a.f; } 19 }; 20 21 22 int dis[MAXN]; 23 int head[MAXN]; 24 int rehead[AX]; 25 int vis[MAXN]; 26 27 void add_edge(int u,int v,int c) 28 { 29 G[tot].to=v; 30 G[tot].w=c; 31 G[tot].next1=head[u]; 32 head[u]=tot++; 33 34 RG[retot].to=u; 35 RG[retot].w=c; 36 RG[retot].next1=rehead[v]; 37 rehead[v]=retot++; 38 } 39 void SPFA() 40 { 41 for(int i=1;i<=n;i++) dis[i]=INF; 42 dis[t]=0; 43 queue<int> Q; 44 Q.push(t); 45 while(!Q.empty()) 46 { 47 int u=Q.front(); 48 Q.pop(); 49 for(int i=rehead[u];i!=-1;i=RG[i].next1) 50 { 51 int v=RG[i].to ; 52 int w=RG[i].w ; 53 if(dis[v]>dis[u]+w) 54 { 55 dis[v]=dis[u]+w; 56 Q.push(v); 57 } 58 } 59 } 60 } 61 62 int Astar(Node a) 63 { 64 memset(vis,0,sizeof(vis)); 65 if(dis[s]==INF) return -1;//如果没有与S相连的点 66 if(s==t) k++; 67 priority_queue<Node> Q; 68 Q.push(a); 69 while(!Q.empty()) 70 { 71 Node tmp=Q.top(); 72 Q.pop(); 73 int v=tmp.v; 74 vis[v]++; 75 if(vis[t]==k) return tmp.g; 76 for(int i=head[v];i!=-1;i=G[i].next1) 77 { 78 Node p; 79 p.v=G[i].to; 80 p.h=dis[G[i].to]; 81 p.g=tmp.g+G[i].w; 82 p.f=p.g+p.h; 83 Q.push(p); 84 } 85 } 86 return -1; 87 } 88 89 int main() 90 { 91 tot=0; 92 retot=0; 93 memset(head,-1,sizeof head); 94 memset(rehead,-1,sizeof rehead); 95 scanf("%d%d%d",&n,&m,&k); 96 scanf("%d%d",&s,&t); 97 int x,y,w; 98 for(int i=0;i<m;i++) 99 { 100 scanf("%d%d%d",&x,&y,&w); 101 add_edge(x,y,w); 102 } 103 SPFA(); 104 Node a; 105 a.v=s; 106 a.g=0; 107 a.h=dis[s]; 108 a.f=a.g+a.h; 109 int g=Astar(a); 110 printf("%d\n",g); 111 return 0 ; 112 }
View Code
后面我还会更新出 关于启发式搜索的讲解,以及Dijkstra,,SPFA,Folyd这三种关于不同最短路问题讲解及例题分析。
越努力,越幸运! 加油!!!
转载于:https://www.cnblogs.com/songorz/p/9386760.html
A*算法在最短路问题的应用及其使用举例相关推荐
- matlab 求解最短路问题,matlab算法求解最短路问题.doc
matlab算法求解最短路问题.doc 组合优化实验报告实验序号日期班级姓名学号实验名称最短路问题实验所用软件及版本MATLABR2008B1.实验目的1.掌握最短路问题的一种求解算法,并能编程实现该 ...
- 【HDU/算法】最短路问题 杭电OJ 2544 (Dijkstra,Dijkstra+priority_queue,Floyd,Bellman_ford,SPFA)
最短路径问题是图论中很重要的问题. 解决最短路径几个经典的算法 1.Dijkstra算法 单源最短路径(贪心),还有用 priority_queue 进行优化的 Dijkstra 算法. 2.bell ...
- java实现迪杰斯特拉(Dijkstra)算法求解最短路问题
迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...
- 算法的时间与空间复杂度(精细+举例)
算法(Algorithm)是指用来操作数据.解决程序问题的一组方法.对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别. 那么我们应该如何去衡量不同 ...
- A*算法(超级详细讲解,附有举例的详细手写步骤)
背景:项目需要接触此算法,以下是一些自学成果,如有不足之处,欢迎指出,必虚心接受.做了一份PPT来汇报,此处直接使用自己PPT的截图.部分图片来源网络,如有侵权立马删除,以下博文仅作为学习笔记.后期又 ...
- 【上篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解. 目录 1. 适用场景 2. 算法说明 3. 测试网络 ...
- 【下篇】Python实现最短路问题常见求解算法——Label Correcting Algorithm(deque)
基于python语言,实现deque label correcting 算法对最短路问题(Shortest Path Problem)进行求解,可以识别网络中是否含有负环. 目录 1. 适用场景 2. ...
- Python实现最短路问题常见求解算法——A*算法
基于python语言,实现A*算法对最短路问题(Shortest Path Problem)进行求解. 目录 1. 适用场景 2. 测试网络 3. 代码实现 参考 1. 适用场景 无负环网络 起点与终 ...
- Floyd算法的应用
Floyd算法的应用 Floyd算法 算法过程 算法特点 最短路问题 求传递闭包 什么是传递闭包 算法过程 算法模板 例题 最小环问题 求最小环权值 算法过程 算法模板 求最小环路径 算法过程 代码模 ...
最新文章
- pandas基于dataframe字符串数据列不包含特定字符串来筛选dataframe中的数据行(rows where values do not contain substring)
- Java生成xlsx格式的excel文件
- 【解决方案】vue不是内部或外部命令
- android Wifi开发相关内容
- linux中动态链接库用扩展名,Linux操作系统下动态库的生成及链接方法是什么?...
- 异构计算黄金时代下,超强异构计算服务器FP5468G2将会带来哪些变革?
- ado.net mysql 连接池_ADO.NET数据连接池
- Ubuntu 16.04 火狐添加java插件、解决Firefox强制低版本java插件运行以及安全设置限制自签名应用程序运行
- C语言SOCKET编程指南
- adam优化_认识 AdaMod: 一个新的有记忆的深度学习优化器
- 家庭监控方案设计及施工-无线监控
- 金士顿优盘突然出现写保护,无法删除更改数据也没有办法格式化
- Oracle增加临时表空间
- LRO (大量接收减负)
- Window系列 (一) — WindowManager 详解
- 最新论文阅读(17)--Pyramidal RoR for Image Classification
- 数据脱敏为何如此重要?
- 笔记:《机器学习训练秘籍》-吴恩达deeplearningai微信公众号推送文章
- iOS10.2下的IPA砸壳
- 数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)