狄克斯特拉算法(Dijkstra’s algorithm)

找出最快的路径使用算法——狄克斯特拉算法(Dijkstra’s algorithm)。

使用狄克斯特拉算法

步骤

(1) 找出最便宜的节点,即可在最短时间内前往的节点。

(2) 对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销。

(3) 重复这个过程,直到对图中的每个节点都这样做了。

(4) 计算最终路径。

术语

权重(weight):

狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重(weight)。

加权图/非加权图(weighted graph)

带权重的图称为加权图( weighted graph),不带权重的图称为非加权图(unweighted graph)。

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

可从一个节点出发,走一圈后又回到这个节点。

无向图意味着两个节点彼此指向对方,其实就是环!

狄克斯特拉算法只适用于有向无环图(directed acyclicgraph,DAG)。

负权边

不能将狄克斯特拉算法用于包含负权边的图

狄克斯特拉算法这样假设:对于处理过的海报节点,没有前往该节点的更短路径。这种假设仅在没有负权边时才成立。

实现

示例:求起点到终点的最短路径

  1. #创建所有节点和路径的散列表
  2. graph={'start': {'a': 6, 'b': 2}, 'a': {'fin': 1}, 'b': {'a': 3, 'fin': 5}, 'fin': {}}
  3.  
  4. #创建已知节点花销的散列表
  5. costs={'a': 6, 'b': 2, 'fin': float("inf")} #float('inf') 表示正无穷
  6.  
  7. #储存父节点的散列表
  8. parents={'a': 'start', 'b': 'start', 'fin': None}
  9.  
  10. #存储已访问过节点的列表
  11. processed=[]
  12.  
  13. #定义一个寻找最小花销的函数
  14. def find_lowest_cost_node(costs):
  15. lowest_cost = float("inf")
  16. lowest_cost_node = None
  17. for node in costs: #遍历所有节点
  18. cost = costs[node]
  19. if cost < lowest_cost and node not in processed: #寻找花销最小,且没有访问过的点
  20. lowest_cost = cost
  21. lowest_cost_node = node
  22. return lowest_cost_node
  23.  
  24. node = find_lowest_cost_node(costs) #找到花销最小的节点
  25. while node is not None: #这个while循环在所有节点都被处理过后结束
  26. cost = costs[node]
  27. neighbors = graph[node]
  28. for n in neighbors.keys(): #遍历当前节点的所有邻居
  29. new_cost = cost + neighbors[n] #该节点到达该邻居的花销总和
  30. if costs[n] > new_cost: #如果经当前节点前往该邻居更近
  31. costs[n] = new_cost #更新该邻居的花销
  32. parents[n] = node #同时将该邻居的父节点设置为当前节点
  33. processed.append(node) #将当前节点标记为处理过
  34. node = find_lowest_cost_node(costs) #找出接下来要处理的节点,并循环
  35.  
  36. print(parents)

  

小结

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

【算法】狄克斯特拉算法(Dijkstra’s algorithm)的更多相关文章

  1. 关于狄克斯特拉算法(dijkstra)总结

    1,2,4是四个定点其他的是距离,从2到4最直接的就是2-4,但是不是最近的,需要舒展一下2-1-4,这样只有8.所以才是最短的.这个过程就是狄克斯特拉算法.下面进入正题:   我们这里定义图的编号为 ...

  2. 狄克斯特拉算法(Python实现)

    概述 狄克斯特拉算法--用于在加权图中找到最短路径 ps: 广度优先搜索--用于解决非加权图的最短路径问题 存在负权边时--贝尔曼-福德算法 下面是来自维基百科的权威解释. 戴克斯特拉算法(英语:Di ...

  3. 狄克斯特拉(Dijkstra)算法

    引入 从A点到B点的最短路径是什么?求最短路径的两种算法:Dijkstra算法和Floyd算法. 网图:带权图. 非网图最短路径:两顶点间经过的边数最少的路径.(非网图也可被理解为各边权值为1的网图. ...

  4. 算法-迪杰斯特拉算法(dijkstra)-最短路径

    迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...

  5. 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)

    一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...

  6. 数据结构与算法——迪杰斯特拉(Dijkstra)算法

    tip:这个算法真的很难讲解,有些地方只能意会了,多思考多看几遍还是可以弄懂的. 应用场景-最短路径问题 战争时期,胜利乡有 7 个村庄 (A, B, C, D, E, F, G) ,现在有六个邮差, ...

  7. 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

    文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...

  8. [链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]

    最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...

  9. [算法导论]迪克斯特拉算法 @ Python

    class Graph: def __init__(self): self.V = [] self.w = {} class Vertex: def __init__(self, x): self.k ...

随机推荐

  1. react暴露webpack配置文件

    在react中安装create-react-app脚手架新建项目,但是新建的项目中没有配置文件. webpack的配置文件webpack.base.conf.js隐藏在了node_modules文件夹 ...

  2. [Android] Android 使用Greendao gradle 出现 Error:Unable to find method 'org.gradle.api.tasks.TaskInputs.file(Ljava/lang/Object;)

    Android 使用Greendao gradle 出现 Error:Unable to find method 'org.gradle.api.tasks.TaskInputs.file(Ljava ...

  3. Java根类Object的方法说明

    Java中的Object类是所有类的父类,它提供了以下11个方法: public final native Class<?> getClass() public native int ha ...

  4. 利用openpyxl模块来操作Excel

    python 读写 excel 有好多选择,但是,方便操作的库不多,在我尝试了几个库之后,我觉得两个比较方便的库分别是 xlrd/xlwt.openpyxl. 之所以推荐两个库是因为这两个库分别操作的 ...

  5. 原型理解:prototype

    这一系列的链接的原型对象就是原型链(prototype chain) 1.所有对象都有同一个原型对象,都可通过Object.prototype获得对象引用 2.new出来的构造函数对象原型就是构造函数 ...

  6. js监听浏览器返回事件

    $(function(){ pushHistory(); window.addEventListener("popstate", function(e) { window.loca ...

  7. Linux 脚本/脚本实现思路

  8. 使用 JavaScript 将网站后台的数据变化实时更新到前端

    问:难道只能设置定时器每隔一秒通过 Ajax 向后台请求数据来实现吗? 答: 1. nodejs的 http://socket.io 支持上述 李宏训 所说的三种方式,另外还支持 Flash Sock ...

  9. SpringMVC中JSONP的基本使用

    @RequestMapping("/check/{param}/{type}") @ResponseBody public Object checkData(@PathVariab ...

  10. CentOS 7安装Redis

    第一步:安装gcc依赖 先通过gcc -v是否有安装gcc,如果没有安装,执行命令 yum install -y gcc(yum install -y gcc-c++) 第二步:下载redis安装包 ...