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
原创粉丝点击