狄克斯特拉算法找最短路径问题:
之前我们了解过,用广度优先搜索,找出段数最少的路径,但是要找出最快的路径该怎么做呢,为此我们可以用现在提到的算法,狄克斯特拉算法。
我们知道,狄克斯特拉算的辅助图形必须是有向无环加权图,这也就决定了该算法的使用条件。
那什么是有向无环加权图呢?下面举个例子说明一下
另外,值得注意的是:狄克斯特拉算法同样不适用于含有负权边的图,即是,图上的数字不能为负值。
要实现算法需要一下准备工作,首先需要三个散列表,就是python的字典。
然后我们来看一下代码流程
接下来直接上代码:
def find_lowest_cost_node(costs):
lowest_cost = float("inf")
lowest_cost_node = None
for node in costs: <---------遍历所有的节点
cost = costs[node]
if cost < lowest_cost and node not in processed: <----如果当前节点的开销更低且未处理过
lowest_cost = cost <--------将其视为开销最低的节点
lowest_cost_node = node
return lowest_cost_node
这是找出获取花费最低节点的函数
node = find_lowest_cost_node(costs) <------在未处理的节点中找出开销最小的节点
while node is not None: <-----这个while循环在所有节点都被处理过后结束
cost = costs[node]
neighbors = graph[node]
for n in neighbors.keys(): <---遍历当前节点的所有邻居
new_cost = cost + neighbors[n]
if costs[n] > new_cost: <------如果经当前节点前往该邻居更近,
costs[n] = new_cost <----就更新该邻居的开销
parents[n] = node <-----同时将该邻居的父节点设置为当前节点
processed.append(node) <------将当前节点标记为处理过
node = find_lowest_cost_node(costs) <---找出接下来要处理的节点,并循环