第七章 狄克斯特拉算法

来源:互联网 发布:千寻软件下载 编辑:程序博客网 时间:2024/06/08 04:53

第七章 狄克斯特拉算法

7.1使用狄克斯特拉算法

7.2术语

7.3换钢琴

7.4负权边

7.5实现

7.6小结

7.1使用狄克斯特拉算法

从第六章的问题,引入,如果我们不只是算从A到B的最短路径,还要算最快到达,完成其中每一段路径都需要时间,我们给每段路径都加上时间,每条边乘上时间算最后的总和,才知道哪一条路径是最快的----图论里的问题

就是从无全图变为有权图

7.2术语

狄克斯特拉算法不能算有环的图,会进入无限死循环

1.权重,每条边关联数字的图,这些数字称为权重,图称为加权图,没有权重的图称为非加权图

计算加权图的最短路径使用狄克斯特拉算法,计算非加权图的最短路径使用广度优先搜索

2.环

有环的路径不会是最短路径

狄克斯特拉算法只能计算有向无环图

7.3换钢琴

举了例子

最短路径并不一定是指物理距离,可能是某种度量指标

7.4负权边

不能计算负权边(为什么呢?)导致这种算法不管用,计算负权边的算法是贝尔曼福德算法

7.5实现

graph={}graph["start"]={}graph["start"]["a"]=6graph["start"]["b"]=2graph["a"]={}graph["a"]["fin"]=1graph["b"]={}graph["b"]["a"]=3graph["b"]["fin"]=5graph["fin"]={}infinitely = float("inf")costs={}costs["a"]=6costs["b"]=2costs["fin"]=infinitelyparents={}parents["a"]="start"parents["b"]="start"parents["fin"]=Noneprocessed=[]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_nodenode=find_lowest_cost_node(costs)print(node)while node is not None:    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)    print(costs)         

7.6小结

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


原创粉丝点击