python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径
python深度优先与广度优先的遍历算法区别
首先要理解搜索步,一个完整的搜索步包括两个处理:
a) 获得当前位置上,有几条路可供选择
b) 根据选择策略,选择其中一条路,并走到下个位置
广度优先:就是,从初始点出发,把所有可能的路径都走一遍,如果里面没有目标位置,则尝试把所有两步能够到的位置都走一遍,看有没有目标位置;如果还不行,则尝试所有三步可以到的位置。这种方法,一定可以找到一条最短路径,但需要记忆的内容实在很多,要量力而行。
Dijkstra算法图文详解
求最短路径需要引进heapq模块,该模块提供了堆排序算法以及优先队列
详情请查看下列原文
Python标准库模块之heapq
以下为求最短路径 例题
1、计算下图任意两点的最短路径。
实现代码
import heapq
import math
graph={"v1":{"v2":2,"v3":8,"v4":1},"v2":{"v1":2,"v3":6,"v5":1},"v3":{"v1":8,"v2":6,"v4":7,"v5":5,"v6":1,"v7":2},"v4":{"v1":1,"v3":7,"v7":9},"v5":{"v2":1,"v3":5,"v6":3,"v8":2,"v9":9},"v6":{"v3":1,"v5":3,"v7":4,"v9":6},"v7":{"v3":2,"v4":9,"v6":4,"v9":3,"v10":1},"v8":{"v5":2,"v9":7,"v11":9},"v9":{"v5":9,"v6":6,"v7":3,"v8":7,"v10":1,"v11":2},"v10":{"v7":1,"v9":1,"v11":4},"v11":{"v8":9,"v9":2,"v10":4}
}
#初始化起点的距离 到自身为零 到其他节点为无穷大
def init_distance(graph,s): #传入图像 和起点distance={s:0}for vertex in graph:if vertex !=s:distance[vertex]=math.inf #除到本身都为无穷大return distance
def dijkstra(graph,s):pqueue=[] #创建一个队列# 先添加一个起点到队列 和后面加入的排序 # 此方法把 队列里面的元素按照优先排列 调用heapop时返回优先级最高的 比如数值最小的heapq.heappush(pqueue,(0,s)) seen=set() #储存出现过的点parent={s:None} #标记此节点的上一个节点 此节点为起点 则父节点为None distance=init_distance(graph,s)while (len(pqueue)>0):pair=heapq.heappop(pqueue) #返回一个数值最小的元组 dist=pair[0] #提取距离vertex=pair[1] #提取节点seen.add(vertex) #添加出现过的节点nodes=graph[vertex].keys() #提取与vertex相连的节点# print(nodes)#核心算法for w in nodes:if w not in seen:if dist+graph[vertex][w]<distance[w]:#把路径短的添加到队列 并排序heapq.heappush(pqueue,(dist+graph[vertex][w],w))parent[w]=vertex #记录父节点distance[w]=dist+graph[vertex][w] #更新起点到w节点的距离return parent,distance
#测试代码
start, end = input("请输入起止节点用空格分开:").split()
parent,distance=dijkstra(graph,start)
print("父节点列表:",parent)
print("{}到各点的距离:".format(start),distance)
print("{}到{}的距离:".format(start,end),distance[end])
运行结果
如果要求出路径,可以根据父节点parent列表求出路径
实现代码
def distance_path(graph,s,end):parent, distance = dijkstra(graph, s)path=[end] while parent[end] !=None:path.append(parent[end])end=parent[end]path.reverse() return path
测试代码
#测试代码
start, end = input("请输入起止节点用空格分开:").split()
parent,distance=dijkstra(graph,start)
path=distance_path(graph,start,end)
print("{}到{}的路径:".format(start, end), path)
运行结果
谢谢请关注。
python基于广度优先(BFS)的迪杰斯特拉(Dijkstra)算法 求最短路径相关推荐
- 迪杰斯特拉(Dijkstra)算法解决最短路径问题
Dijkstra 算法介绍 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法.迪杰斯特拉(Dijkstra)算法是最经典的最短路径算法之一,用 ...
- java数据结构和算法——迪杰斯特拉(Dijkstra)算法
目录 一.迪杰斯特拉(Dijkstra)算法介绍 二.迪杰斯特拉(Dijkstra)算法过程 三.迪杰斯特拉(Dijkstra)算法--应用场景(最短路径问题) 四.迪杰斯特拉(Dijkstra)算法 ...
- 059.迪杰斯特拉(Dijkstra)算法的原理以及解决最短路径问题
1. 迪杰斯特拉(Dijkstra)算法的原理 1.1. 算法应用场景-最短路径问题 1.2. 基本介绍 1.3. 步骤详解 1.4. 思路解析 1.5. 图解步骤 2. 迪杰斯特拉(Dijkstra ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法
最短路径算法-迪杰斯特拉(Dijkstra)算法 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思 ...
- Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法
1.Java迪杰斯特拉(Dijkstra)算法与弗洛伊德(Floyd)算法 1.1 迪杰斯特拉(Dijkstra)算法 1.1.1 迪杰斯特拉(Dijkstra)算法介绍 迪杰斯特拉(Dijkstra ...
- 数据结构——图——迪杰斯特拉(Dijkstra )算法
数据结构--图--迪杰斯特拉(Dijkstra )算法 这是一个按路径长度递增的次序产生最短路径的算法.它的思路大体是这样的. 比如说要求图7-7-3中顶点v0到顶点v1的最短距离,没有比这更简单的了 ...
- 数据结构与算法(7-4)最短路径(迪杰斯特拉(Dijkstra)算法、弗洛伊德(Floyd)算法)
目录 一.最短路径概念 二.迪杰斯特拉(Dijkstra)算法(单源最短路径) 1.原理 2.过程 3.代码 三.弗洛伊德(Floyd)算法(多源最短路径) 1.原理 2.存储 3.遍历 4.代码 参 ...
- java实现迪杰斯特拉(Dijkstra)算法求解最短路问题
迪杰斯特拉(Dijkstra)算法是由荷兰计算机科学家狄克斯特拉于1959年提出的.是寻找从一个顶点到其余各顶点的最短路径算法,可用来解决最短路径问题. 迪杰斯特拉算法采用贪心算法的策略,将所有顶点分 ...
- 迪杰斯特拉(Dijkstra)算法详解
迪杰斯特拉(Dijkstra)算法详解 在讲解迪杰斯特拉算法之前先讲解一下什么是最短路径: [图一] 假如我要求从A点到D点的最短路径,我们用肉眼可以很快速找出A–>C–>E–>D就 ...
最新文章
- sql server:alter database name
- 分子克隆基础:什么是质粒
- java handler的用法_Handler和内部类的正确用法
- 1.4- 定时任务总结之九句箴言
- python设置文件权限_Python os.chmod() 方法
- lightbox的一个ajax效果
- 黑客、蠕虫和网络恐怖主义简史(组图)
- 计算机在微表情的应用,一种有效的微表情自动识别方法
- 直通输出设备 android kodi,PVE直通核显搭建LibreELEC KODI HTPC实现HDMI输出
- IEEE文献高级检索
- 《京东话费充值系统架构演进实践》读后感
- (三)Linux vi 文本编辑器,用户管理,组管理,Sudo命令,时间管理
- Unity 调用C# Speech类将文字转换为语音
- 公众号怎么设置滑动文字_微信公众号滑动文字怎么制作内容呢?
- 单例模式《单例模式概念、什么时候能用到单例模式、单例模式的好处》
- 关于 webview 截图 部分显示空白的处理
- rk3399 中间层移除短按power息屏待机+永不深度睡眠
- 《方块方舟》自定义服务器工具,新闻-方块方舟官网-ARK正版授权-开放式体素沙盒生存游戏...
- 线下商店如何转型做新零售 怎么样顺利开展新零售模式?
- imperva CDN的优势有哪些
热门文章
- nginx: [error] invalid PID number ““ in “/app/nginx-1.16.0/logs/nginx.pid“
- Android开发经验谈-很少有人会告诉你的Android开发基本常识,经验谈android
- mysql如何用_如何使用mysql
- java 刻度尺,jQuery实现腾讯信用界面(自制刻度尺)样式
- mysql从一台电脑迁移_mysql数据库迁移到另一台电脑上
- 二手车交易价格预测 (数据分析)————task(2)
- 读源码:PopupWindow
- 从零学习 InfiniBand-network架构(七) ——IB协议中数据如何传输
- HEVC代码学习13:predInterSearch函数
- folder.htt