【发布时间】:2018-05-03 14:53:47
【问题描述】:
您的朋友正计划前往加拿大北部深处的一个小镇探险
下一个寒假。他们研究了所有的旅行选择,并制定了一个有针对性的
图,其节点表示中间目的地,边表示之间的重载
他们。
在此过程中,他们还了解到极端天气会导致这部分地区出现道路。
世界在冬天变得相当缓慢,并可能导致大量旅行延误。他们已经
找到了一个出色的旅游网站,可以准确预测他们能够以多快的速度旅行
沿着道路行驶;但是,旅行的速度取决于一年中的时间。更多的
准确地说,该网站回答以下形式的查询:给定一条边 e = (u, v)
连接两个站点 u 和 v,并给定从位置 u 开始的建议开始时间 t,
网站将返回一个值 fe(t),即到达 v 的预计时间。网站保证
1
fe(t) > t 对于每个边 e 和每个时间 t(你不能在时间上倒退),并且
fe(t) 是 t 的单调递增函数(也就是说,你不会因为开始而更早到达
之后)。除此之外,函数fe 可以是任意的。例如,在那些
旅行时间不随季节变化,我们将有 fe(t) = t + e, wheree 是
从边缘开始到结束所需的时间 e.
您的朋友想通过网站确定最快的旅行方式
从起点到预期目的地的有向图。 (你应该假设
它们从时间 0 开始,并且网站所做的所有预测都是完全正确的
正确。)给出一个多项式时间算法来执行此操作,我们将单个查询处理为
网站(基于特定的边 e 和时间 t)作为单个计算步骤。
def updatepath(node):
randomvalue = random.randint(0,3)
print(node,"to other node:",randomvalue)
for i in range(0,n):
distance[node][i] = distance[node][i] + randomvalue
def minDistance(dist,flag_array,n):
min_value = math.inf
for i in range(0,n):
if dist[i] < min_value and flag_array[i] == False:
min_value = dist[i]
min_index = i
return min_index
def shortest_path(graph, src,n):
dist = [math.inf] * n
flag_array = [False] * n
dist[src] = 0
for cout in range(n):
#find the node index that have min cost
u = minDistance(dist,flag_array,n)
flag_array[u] = True
updatepath(u)
for i in range(n):
if graph[u][i] > 0 and flag_array[i]==False and dist[i] > dist[u] + graph[u][i]:
dist[i] = dist[u] + graph[u][i]
path[i] = u
return dist
我应用了 Dijkstra 算法,但它不正确?我将在我的算法中进行哪些更改以使其用于动态变化的边缘。
【问题讨论】:
-
请不要只粘贴完整的问题描述供我们分析,而是提供对您面临的问题以及您解决该问题的尝试的简洁准确的描述。发布的代码没有上下文,也没有 cmets,因此很难遵循您想要实现的目标。
-
问题是朋友们想出去野餐,他们正在穿越不同的城市。成本是从一个城市到另一个城市所需的小时数。但是有季节性效应会改变成本,因为哪条路径会改变。但 dijakstra 适用于静态图。
-
不,我的意思是,问题是你有一个加权图,你想找到两个节点之间的最短路径,特别是路径中每条边的权重取决于(即正和单调函数)在前边的总权重上。
-
由于限制,Dijkstra 的算法工作正常,但是当您计算从该顶点行进的成本时,您当然需要考虑到达该顶点所需的时间。快速查看您的代码表明您正在模拟它。您的代码很慢,但看起来可以正常工作。你怎么知道错了?
标签: algorithm graph shortest-path