主要的最优(最短)路径算法:

一、深度优先算法;二、广度优先算法;三、Dijstra最短路径;四、floyd最短路径(待);

一、深度优先算法

  图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

  它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

  无向无权值网络

data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]

   

 def depth_first_search(data, data_index):   # 有向、无向都可以满足要求
d1 = [data_index[0]]
index_now = 0 for i in range(len(data_index) - 1): # 只需要再寻找剩余的数值即可
state = 1
for j in range(len(data[index_now])): # 遍历可行路径
if data[index_now][j] == 1: # 如果该路径可行,则直接判断
if data_index[j] not in d1: # 判断原始输出中是否已有
d1.append(data_index[j])# 无,则加入
index_now = j
state = 0
break
if state:
for k in d1[-2::-1]: # 到达叶子后的操作
index_now = data_index.index(k)
for j in range(len(data[index_now])): # 遍历可行路径
if data[index_now][j] == 1: # 如果该路径可行,则直接判断
if data_index[j] not in d1: # 判断原始输出中是否已有
d1.append(data_index[j]) # 无,则加入
index_now = j
break
if index_now != data_index.index(k):
break # print(d1)
return d1 if __name__ == "__main__":
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]
data_w = [[0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0]]
data_index = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
# print(data_index.index('F'))
d1 = depth_first_search(data_w, data_index)
print(d1)

输入(无向图):

data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]

输出:

['A', 'C', 'B', 'D', 'F', 'G', 'E']

二、广度优先算法

  

  广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。

  它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

  换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的顶点。

   

 def breadth_first_search(data, data_index):  # 无向图、有向图都可以的
d1 = [data_index[0]]
index_now = [0]
while len(d1) != len(data_index):
index_mid = []
for i in index_now: # i 为当前 父节点
for j in range(len(data[i])): # 查询父节点的子节点
if data[i][j] == 1:
if data_index[j] not in d1:
d1.append(data_index[j])
index_mid.append(j)
index_now = index_mid
print(d1)
return d1 if __name__ == "__main__":
data = [[0, 0, 1, 1, 0, 1, 0], [0, 0, 1, 0, 0, 0, 0], [1, 1, 0, 1, 0, 0, 0], [1, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 1, 1, 0]]
data_w = [[0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0]]
data_index = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
# print(data_index.index('F'))
d1 = breadth_first_search(data_w, data_index)
# print(d1)

输入(有向图):

data_w = [[0, 1, 0, 0, 0, 0, 0], [0, 0, 1, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0, 0], [0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0]]

输出:

['A', 'B', 'C', 'E', 'F', 'D', 'G']

三、Dijstra最短路径(迪杰斯特拉算法)

参考视频:https://www.bilibili.com/video/av25829980?from=search&seid=7854146334299589449

  迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

  OSPF协议 :Open Shortest Path First开放式最短路径优先,底层是迪杰斯特拉算法,是链路状态路由选择协议,它选择路由的度量标准是带宽,延迟。

       

 def priority_queue(data, d0):  # 自建优先队列格式
state = 1
for i in range(len(data)):
if d0[1] < data[i][1]:
data.insert(i, d0)
state = 0
break
if state:
data.append(d0)
return data def dijkstra_search(data, data_index, index):
parent = {} # 字典映射,更新前级节点
queue = [] # 优先队列
queue_out = [[data_index[index], data[index][index], 0]] # 输出队列 while len(queue_out) < len(data_index):
root_node = data_index.index(queue_out[-1][0]) # 当前最优节点
# print(root_node)
for i in range(len(data_index)): # 遍历所有的可能性
if data[root_node][i] != -1: # 检查是否可直连,是
if data_index[i] not in [x[0] for x in queue_out]:
queue = priority_queue(queue,
[data_index[i], data[root_node][i] + queue_out[-1][1], queue_out[-1][0]])
# print(queue) # 检查优先队列的情况 [['C', 1], ['B', 5]] for i in range(len(queue)): # 0,1
# print(queue[i][0])
if queue[i][0] not in [x[0] for x in queue_out]:
parent[queue[i][0]] = queue[i][-1]
queue_out.append(queue[i])
del queue[i]
break # print(queue)
# print('queue_out',queue_out)
return queue_out, parent if __name__ == "__main__": data_weight = [[0, 5, 1, -1, -1, -1], [5, 0, 2, 1, -1, -1], [1, 2, 0, 4, 8, -1], [-1, 1, 4, 0, 3, 6],
[-1, -1, 8, 3, 0, -1], [-1, -1, -1, 6, -1, -1]]
data_index = ['A', 'B', 'C', 'D', 'E', 'F']
# print(data_index.index('F'))
d1, d2 = dijkstra_search(data_weight, data_index, 3)
print(d1)
print(d2) target = 'A'
for i in d1:
if i[0] == target:
print('路径最短距离为:', i[1]) key = target
d3 = [target]
while key in d2.keys():
d3.insert(0, d2[key])
key = d2[key]
print('最优路线为:', d3)

输入:

data_weight = [[0, 5, 1, -1, -1, -1], [5, 0, 2, 1, -1, -1], [1, 2, 0, 4, 8, -1], [-1, 1, 4, 0, 3, 6], [-1, -1, 8, 3, 0, -1], [-1, -1, -1, 6, -1, -1]]
data_index = ['A', 'B', 'C', 'D', 'E', 'F']
d1, d2 = dijkstra_search(data_weight, data_index, 0)

输出:

路径最短距离为: 10
最优路线为: ['A', 'C', 'B', 'D', 'F']

四、floyd最短路径

!!!还没看这个算法!!!

最优路径算法合集(附python源码)(原创)的更多相关文章

  1. 【合集】TiDB 源码阅读系列文章

    [合集]TiDB 源码阅读系列文章 (一)序 (二)初识 TiDB 源码 (三)SQL 的一生 (四)INSERT 语句概览 (五)TiDB SQL Parser 的实现 (六)Select 语句概览 ...

  2. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  3. 微信小程序自动化测试最佳实践(附 Python 源码)

    本文为霍格沃兹测试学院测试大咖公开课<微信小程序自动化测试>图文整理精华版. 随着微信小程序的功能和生态日益完善,很多公司的产品业务形态逐渐从 App 延升到微信小程序.微信公众号等.小程 ...

  4. 新浪微博登陆以及发送微博(附python源码)

    原文链接(本人):https://blog.csdn.net/A5878989/article/details/76275855 说明 本文主要记录分析新浪微博登陆以及发送文字和图片微博的详细过程 分 ...

  5. 量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python)(转)

    量化交易中VWAP/TWAP算法的基本原理和简单源码实现(C++和python) 原文地址:http://blog.csdn.net/u012234115/article/details/728300 ...

  6. 三种排序算法python源码——冒泡排序、插入排序、选择排序

    最近在学习python,用python实现几个简单的排序算法,一方面巩固一下数据结构的知识,另一方面加深一下python的简单语法. 冒泡排序算法的思路是对任意两个相邻的数据进行比较,每次将最小和最大 ...

  7. [算法1-排序](.NET源码学习)& LINQ & Lambda

    [算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...

  8. python源码书籍

    <Python源码剖析>一书现在很难买到,目前大部分都是电子书. 为了更好地利用Python语言,无论是使用Python语言本身,还是将Python与C/C++交互使用,深刻理解Pytho ...

  9. tomcat集群实现源码级别剖析

    随着互联网快速发展,各种各样供外部访问的系统越来越多且访问量越来越大,以前Web容器可以包揽接收-逻辑处理-响应整个请求生命周期的工作,现在为了构建让更多用户访问更强大的系统,人们通过不断地业务解耦. ...

随机推荐

  1. SOP - Validation

    Table of Contents目录表1 Roles and Responsibilities related to validation与验证相关的1个角色和职责2 Introduction2引言 ...

  2. ajax 与jsp servlet

    jQuery的Ajax实现异步传输List.Map_GOOD 分类: JAVA WEB前端2013-08-29 18:35 6296人阅读 评论(0) 收藏 举报 javajquerylistjson ...

  3. Android中 实现队列方式处理优先级信息

    需求:当界面在处理消息A时,突然接收到消息B,需要立马显示B的信息,然后再继续显示消息A,或者接收到消息C,再显示完消息A后再显示消息C: 原理很简单 在一个轮询中,查询消息列表中的元素,先处理优先级 ...

  4. Mac OS mysql数据库安装与初始化

    一.官网下载mysql 二.安装并启用 三.数据库初始化 192:bin zhuyajing$ ./mysql -u root -p Enter password: Welcome to the My ...

  5. XMLHttpRequest状态码及相关事件

    1.创建一个XMLHttpRequest对象 2.对XMLHttpRequest对象进行事件的监听(定义监听事件的位置不影响 3.对XMLHttpRequest对象的状态码 状态   名称 描述 0 ...

  6. 学以致用二十九-----python3连接mysql

    在前面安装好mysql后,在一个项目中需要连接mysql,python是3.6版本 python3连接mysql需要安装pymysql模块 可以通过pip安装 查看pip 版本 pip --versi ...

  7. PIO学习

    边沿捕获 PIO可以对输入进行边沿捕获,它可以捕获上升沿.下降沿和双沿,当检测到边沿时PIO会把它存在edgecapture 寄存器之内: 打开Synchronously capture 时,会生成一 ...

  8. 计算机网络四:网卡与MAC地址

    网卡与MAC地址 ㈠网卡 1.网卡定义 网卡是工作在OSI的数据链路层的网络组件,是局域网中连接计算机和传输介质(网线或WIFI信号)的接口,不仅能实现与局域网传输介质之间的物理连接和电信号匹配,还涉 ...

  9. 网络操作系统 第十章 DNS服务器管理与配置

    1.什么是域名系统?描述域名解析的过程. 1)域名系统:Domain Name System缩写DNS,是因特网的一项核心服务 域名系统作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方 ...

  10. 开机后Android应用自动启动

    一.需求 在应用开发过程中,有客户提出在设备开机后自动启动应用. 二.实现方法 实现方案:安卓系统每次开机的时候都会发送一个广播,监听这个广播,广播事件触发启动应用程序. 监听音频广播而不是启动广播, ...