算法——狄克斯特拉算法

狄克斯特拉算法

算法——狄克斯特拉算法

狄克斯特拉算法(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)

 

posted @ 2019-05-25 21:28  no樂on  阅读(557)  评论(0编辑  收藏  举报