首页 > 编程语言 > 详细

算法——狄克斯特拉算法

时间:2019-05-25 22:14:15      阅读:114      评论:0      收藏:0      [点我收藏+]

狄克斯特拉算法

算法——狄克斯特拉算法

狄克斯特拉算法(Dijkstra‘s algorithm):寻找最快的路径,而不是段数最少的路径。

狄克斯特拉算法用于每条边都有关联数字的图,这些数字叫做权重(weight)。
带权重的图叫加权图(weighted graph),不带权重的图叫做非加权图(unweighted graph)。
计算非加权图可以使用广度优先搜素,计算加权图可以使用狄克斯特拉算法。
狄克斯特拉算法只适用于有向无环图(directed acyclic graph,DAG)。
如果有负权边,就不能使用狄克斯特拉算法,而要使用贝尔曼-福德算法(Bellman-Ford algorithm)。

步骤:
1)找出最短时间内可以到达的点
2)更新该节点的邻居的开销
3)重复这个过程,直到对图中的所有节点都做了
4)计算最终路径

要点:
广度优先搜索用于在非加权图中查找最短路径
狄克斯特拉算法用于在加权图中查找最短路径
仅当权重为正时狄克斯特拉算法才管用
如果图中包含负权边,请使用贝尔曼-福德算法
# dijkstra 狄克斯特拉算法


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


if __name__ == __main__:
    graph = {}
    graph[start] = {}
    graph[start][a] = 6
    graph[start][b] = 2
    graph[a] = {}
    graph[a][fin] = 1
    graph[b] = {}
    graph[b][a] = 3
    graph[b][fin] = 5
    graph[fin] = {}

    infinity = float(inf)
    costs = {}
    costs[a] = 6
    costs[b] = 2
    costs[fin] = infinity

    parents = {}
    parents[a] = start
    parents[b] = start
    parents[fin] = None

    processed = []

    node = find_lowest_cost_node(costs)  # 在未处理的节点中找出开销最小的节点
    while node is not None:  # 这个while循环在所有节点都被处理过后结束
        print(node)
        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)

 

算法——狄克斯特拉算法

原文:https://www.cnblogs.com/noonjuan/p/10923973.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!