【发布时间】:2017-08-18 15:41:05
【问题描述】:
对于在线课程,我的任务是实施 Dijkstra 算法。我按照描述完成了算法,您在其中维护已探索和未探索节点的列表,并在您遍历图形时更新其未探索邻居的距离分数(并将节点移动到已探索列表)。
我注意到这看起来很像面包优先搜索,因此我尝试修改 BFS 以在将节点添加到队列时更新节点分数。这似乎工作完全相同,但没有明确跟踪探索队列和未探索队列中的哪些节点。
这只是实现细节的问题吗?这些都是 Dijkstra 算法的例子还是不同的例子?
Dijkstra 示例:
def dijkstra(graph, source):
explored_set = set()
all_nodes = set(graph.keys())
node_distances = create_distance_dict(graph)
node_distances[source] = 0
while explored_set != all_nodes:
current_node = min_distance(node_distances, explored_set)
explored_set.add(current_node)
update_distances(graph, node_distances, current_node)
return node_distances
def min_distance(distances_dict, explored_set):
""" Helper function returns lowest distance node not yet explored """
minimum = float("infinity")
for node in distances_dict.keys():
if node not in explored_set and distances_dict[node] <= minimum:
minimum, min_index = distances_dict[node], node
return min_index
def update_distances(graph, distances_dict, current_node):
""" Helper function updates neighbor's distances """
for n in graph[current_node]:
if distances_dict[n[0]] > distances_dict[current_node] + n[1]:
distances_dict[n[0]] = distances_dict[current_node] + n[1]
基于 bfs 的搜索示例
def search(graph, source, nodeDistances):
nodeDistances[source] = 0
queue = deque([source])
while len(queue) != 0:
n = queue.popleft()
for m in graph[n]:
# Iterate each node connected to n
if m and nodeDistances[m[0]] > nodeDistances[n] + m[1] :
# Compare current m score and update if n + n-m edge is shorter
nodeDistances[m[0]] = nodeDistances[n] + m[1]
# add m to search queue
queue.extend([m[0]])
return nodeDistances
两个示例都使用了 Graph 和 nodeDistances 结构:
nodeDistances = {
1: 0,
2: float("infinity"),
3: float("infinity"),
4: float("infinity"),
5: float("infinity"),
6: float("infinity"),
7: float("infinity"),
8: float("infinity"),
}
graph = {
1: [(2,1),(8,2)],
2: [(1,1),(3,1)],
3: [(2,1),(4,1)],
4: [(3,1),(5,1)],
5: [(4,1),(6,1)],
6: [(5,1),(7,1)],
7: [(6,1),(8,1)],
8: [(7,1),(1,2)],
}
【问题讨论】:
-
Dijkstra 的算法不过是 BFS,它使用优先级队列而不是普通队列。
-
@ShreyashSSarnayak 不,BFS 一次评估一个步骤,而 Djikstra 的算法评估加权边缘。它们不是一回事
-
@NoticeMeSenpai 请看wikipedia page
-
@ShreyashSSarnayak 请看一下:stackoverflow.com/questions/3818079/…
-
@NoticeMeSenpai 一个通用的 BFS 可以做到这一点。但这是在他检查更新距离
nodeDistances[m[0]] > nodeDistances[n] + m[1]的地方修改的。这将给出最短路径。
标签: python algorithm graph dijkstra