我有一个图表,每个边缘都有成本和质量。我需要修改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))
}
答案 0 :(得分:0)
假设您使用的质量不会导致负周期,我认为最简单的方法是计算源和目标之间的所有最短路径,然后根据您的第二个目标对所有路径进行排名。您可以使用默认的Dijkstra实现来根据第一个目标计算所有等效的最短路径,只需继续探索队列(而不是在到达目标时停止),直到从队列中取出的下一个路径大于最佳路径。然后,使用第二个目标计算每个最小路径的成本,并使用排序算法对它们进行排名。
如果您想修改原始Dijkstra以使用优先目标比较成本(首先是质量然后是成本,反之亦然)那么您必须证明your modified version is optimal and complete