python代码实现狄克斯特拉算法

狄克斯特拉算法找最短路径问题:

之前我们了解过,用广度优先搜索,找出段数最少的路径,但是要找出最快的路径该怎么做呢,为此我们可以用现在提到的算法,狄克斯特拉算法。

我们知道,狄克斯特拉算的辅助图形必须是有向无环加权图,这也就决定了该算法的使用条件。

那什么是有向无环加权图呢?下面举个例子说明一下

python代码实现狄克斯特拉算法_第1张图片python代码实现狄克斯特拉算法_第2张图片

另外,值得注意的是:狄克斯特拉算法同样不适用于含有负权边的图,即是,图上的数字不能为负值。

python代码实现狄克斯特拉算法_第3张图片

要实现算法需要一下准备工作,首先需要三个散列表,就是python的字典。

python代码实现狄克斯特拉算法_第4张图片

然后我们来看一下代码流程

python代码实现狄克斯特拉算法_第5张图片

接下来直接上代码:

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) <---找出接下来要处理的节点,并循环

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(数据分析,数据分析)