首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于成本和质量的dijkstras改进

基于成本和质量的dijkstras改进
EN

Stack Overflow用户
提问于 2014-01-13 18:25:31
回答 1查看 572关注 0票数 0

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

最初,我使用dijkstras查找开销最小的路径(代码粘贴在下面)。可以用上面提到的方式修改这些dijkstra吗?如果没有,请提出另一种方法来实现这一点。

R代码:

代码语言:javascript
运行
复制
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))

 }
EN

回答 1

Stack Overflow用户

发布于 2014-01-14 17:54:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21088929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档