K短路算法

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 pritry
int graph[MAX][MAX];  //0为源点s,n-1为汇点t
int 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;
}


你可能感兴趣的:(K短路算法)