狄克斯特拉算法(入门)
来源:互联网 发布:同步带设计软件下载 编辑:程序博客网 时间:2024/06/05 14:11
狄克斯特拉算法可以找出加权图中前往X的最短路径。
注意:
- 其只适用于有向无环图
- 适用于正权边,负权边的将出错(贝尔曼—福德算法适用于负权边)
步骤:
- 找出当前最“便宜”的节点,即可在最短时间内前往的节点
- 对于该节点的邻居,检查是否有经当前节点前往他们的更短的路径,如果有,经更新其开销
- 重复这个过程,直到对图中的每个节点都这样做了
- 计算最终得路径
实例:
# coding=utf-8# 图表graph = {} graph["start"] = {}graph["start"]["a"] = 6 # 开始节点的邻居和邻居的开销graph["start"]["b"] = 2graph["a"] = {} # a节点的邻居和邻居的开销graph["a"]["fin"] = 1 graph["b"] = {} # b节点的邻居和邻居的开销graph["b"]["a"] = 3graph["b"]["fin"] = 5graph["fin"] = {} # 终点的邻居和邻居的开销# 节点的开销散列表infinity = float("inf")costs = {}costs["a"] = 6 # 这时你可能找到更短的路径,但没有影响costs["b"] = 2 costs["fin"] = infinity#print infinity# 父节点的散列表parents = {}parents["a"] = "start"parents["b"] = "start"parents["fin"] = None# 处理过的节点列表processed = []# 查找开销最小的节点def find_lowest_cost_node(costs): lowest_cost = float("inf") # python中表示无穷大 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) # 未处理的节点中找到开销最小的点print 'lowest_cost_node:',nodewhile 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 'lowest_cost_node:',nodeprint "Cost from the start to each node:"print 'parents:',parentsprint costs
结果:
=========== RESTART: C:\Users\LiLong\Desktop\Algorithm\dixstrah.py ===========lowest_cost_node: blowest_cost_node: alowest_cost_node: finlowest_cost_node: NoneCost from the start to each node:parents: {'a': 'b', 'b': 'start', 'fin': 'a'}{'a': 5, 'b': 2, 'fin': 6}>>>
可以看出最短路径:
开销是:6
参考:《算法图解》—Aditya Bhargava
适合入门的看,讲的很基础,很多形象插图
阅读全文
2 0
- 狄克斯特拉算法(入门)
- 算法入门(0)
- 算法入门(一)
- 算法入门(1)
- 算法入门(2)
- 算法入门(1)
- 0005 A*算法入门(寻路)【算法】
- Java小游戏算法入门(扑克牌算法)
- 遗传算法入门(一)
- 遗传算法入门(二)
- 遗传算法入门(三)
- 遗传算法入门(四)
- 算法入门实例(一)
- 遗传算法入门(一)
- 遗传算法入门(二)
- 算法(入门)-选择排序
- (CRC)算法入门引导
- 算法(入门)-插入排序
- 史上最科学!Swift 3 UITableView最佳实践 XIB极速实现UITableViewCell,UITableViewHeaderFooterView
- requests库入门-5-带参数的请求类型
- 微服务的设计原则
- JVM笔记
- 冒泡排序法
- 狄克斯特拉算法(入门)
- Java 割圆术球π
- Linux(64位)下OpenBabel 2.4.1、python2.7和Ipython实战(三)
- MATLAB 视角调整
- 基于注解的DI
- [PTA] 7-22 龟兔赛跑
- linlong 1157
- ISCSI网络存储服务配置
- navicate远程访问ubuntu上的mysql数据库