K短路算法
来源:互联网 发布:网络视听大会 编辑:程序博客网 时间:2024/05/17 09:40
1 A*算法
A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的:
第K最短路-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++代码如下:
//Created by pritryint graph[MAX][MAX]; //0为源点s,n-1为汇点tint h[MAX]; //h[i]表示节点i到t的最短距离bool visit[MAX];int n;struct State{ int g; //从源点到v的实际距离 int v; //节点v};bool operator < (const State& a,const State& b){ return (a.g+h[a.v] > b.g+h[b.v]);}priority_queue<State> Q;void Init(){ while(!Q.empty()) Q.pop(); memset(visit, 0, sizeof(visit)); for(int i = 0; i <= n; ++i) h[i] = INF; h[n-1] = 0; for(int i = 0; i < n; ++i) { int k = n; for(int j = 0; j < n; ++j) { if(!visit[j] && h[k] > h[j]) k = j; } visit[k] = true; for(int j = 0; j < n; ++j) { if(!visit[j] && graph[k][j] != -1 && graph[k][j] + h[k] < h[j]) h[j] = graph[k][j] + h[k]; } }}int Astar(int K){ int ans = -1; int count = 0; State s; Init(); s.g = s.v = 0; Q.push(s); while(!Q.empty()) { s = Q.top(); Q.pop(); if(s.v == n-1) count++; if(count == K) { ans = s.g; break; } for(int i = 0; i < n; ++i) { if(graph[s.v][i] != -1) { State state; state.v = i; state.g = s.g + graph[s.v][i]; Q.push(state); } } } return ans;}
0 0
- K短路算法
- 第k短路算法模板
- poj 2449 k短路+A*算法
- A*算法—第K短路
- poj2449 第k最短路,A*算法
- k短路 SPFA+A*算法 poj 2449
- k短路 SPFA+A*算法 poj 2449
- poj2449--A*算法求解k短路
- K最短路问题(A*算法)
- 第K短路(A*算法)
- A*算法——第K短路
- k短路
- k短路
- k短路
- K短路
- K短路
- 图论算法(3)--- A*算法求k短路
- 综合算法05—考虑换乘的K短路算法
- MFC子对话框跟随主对话框移动
- Vim文本编辑器 指令大全(二)
- AndroidManifest
- 服务化基础设施
- 图像相似度计算
- K短路算法
- 硬盘分区、寻址和系统启动过程
- 利用系统时间实现APP内部随机IMEI和IMSI的方法
- 深入Java关键字null
- Hadoop集群中wordcount的运行命令
- TextView省略号显示(ellipsize)
- perl for 循环格式
- Spring 数据访问之事务管理
- 什么叫执行?这就是执行