根据成本和质量修改dijkstras

时间:2014-01-13 10:25:31

标签: r graph-algorithm dijkstra

我有一个图表,每个边缘都有成本和质量。我需要修改dijkstras以找到质量最高的路径 - 但如果两条路径的质量相同,则应选择成本最低的路径。

最初,我使用dijkstras以最低的成本找到路径(代码粘贴在下面)。 是否有可能以上述方式修改这些dijkstras? 如果没有,那么请提出另一种方法来实现这一目标。

R代码:

dijs<-function(n,v,cost,dist)
{

 dist<-numeric(n)  
 flag<- numeric(n)
 prev<-numeric(n)

 for(i in 1:n)
  prev[i] = -1

for(i in 1:n)
dist[i]<-cost[v,i]

count=2
while(count <= n)
{
  min=999
  for(w in 1:n)
  {     
    if(dist[w] < min && !flag[w])
    {
      min=dist[w]
      u=w
    }
  }
  flag[u]=1
  count<-count+1
  for(w in 1:n)
  {
    if((dist[u]+cost[u,w] < dist[w]) && !flag[w])
    {
      dist[w]=dist[u]+cost[u,w]
      prev[w]=u
    }


  }
}

  printmin(v,dist,n)
   return(prev)
}

main<-function()
{
  cat('Enter no of nodes:', '\n')

  n<-scan("",n=1,quiet=TRUE)
  cat('Enter cost matrix','\n')
  cost<-matrix(0,n,n)
  for(i in 1:n) for(j in 1:n) 
  {
    if(i == j)
      cost[i,j]<-999

    if(i != j && cost[i,j] == 0)
    {
      cat(sprintf("enter the cost from node %d to %d",i,j))
      cost[i,j]<-scan("",n=1,quiet=TRUE)
      if(cost[i,j] == 0)
        cost[i,j]=999
      cost[j,i]<-cost[i,j]
    }


  }

  print(cost)

  print('Enter the source:',quote=FALSE) 
  v<-scan("",n=1,quiet=TRUE)

  prev<-digs(n,v,cost,dest)
  print("the shortest distance")

  for(i in 1:n)
  {
    cat(sprintf("path to %d ->",i))

    printpath(i,prev)
    cat('\n')
  }

}
printmin<-function(v,mindist,n)
{
  for(i in 1:n)
  {
     if(i != v)
     {
       cat(sprintf("%d -> %d, cost =%f",v,i,mindist[i]))
       cat('\n')

     }
  }
}


 printpath<-function(dest,prev)
 {
   if(prev[dest] != -1)
    printpath(prev[dest],prev)
  cat(sprintf("%d  ",dest))

 }

1 个答案:

答案 0 :(得分:0)

假设您使用的质量不会导致负周期,我认为最简单的方法是计算源和目标之间的所有最短路径,然后根据您的第二个目标对所有路径进行排名。您可以使用默认的Dijkstra实现来根据第一个目标计算所有等效的最短路径,只需继续探索队列(而不是在到达目标时停止),直到从队列中取出的下一个路径大于最佳路径。然后,使用第二个目标计算每个最小路径的成本,并使用排序算法对它们进行排名。

如果您想修改原始Dijkstra以使用优先目标比较成本(首先是质量然后是成本,反之亦然)那么您必须证明your modified version is optimal and complete