文章目录

  • (一)、题目
  • (二)、导库
  • (三)、绘制带权无向图
  • (四)、获得最短路径
  • (四)、实现最短路径高亮
  • (五)、完整代码
  • (六)、结果展示

关于Python数据分析在数学建模中的更多相关应用:Python数据分析在数学建模中的应用汇总(持续更新中!)

(一)、题目

本题采用带权无向图作为例子。要求实现:

  • 绘制带权无向图
  • 获得从源结点到目的结点的最短路径
  • 所有结点两两之间的最短路径
  • 实现最短路径高亮

(二)、导库

最短路径问题主要使用的库是:

  • networkx——内置常用的图与复杂网络分析算法
  • matplotlib——使用matplotlib库进行绘图
import networkx as nx     #内置常用的图与复杂网络分析算法
import matplotlib.pyplot as plt    #使用matplotlib库进行绘图

(三)、绘制带权无向图

主要步骤:

  • 初始化源节点、目的结点以及权
  • 创建一个无向图,并将结点以及边添加到其中
  • 生成结点位置(设置布局,取消轴线)
  • 绘制结点、边、权
#初始化图
s = [0,0,1,1,7,7,2,8,2,6,2,3,3,5]   #源结点
t = [1,7,7,2,8,6,8,6,5,5,3,5,4,4]   #目的结点
w = [4,8,3,8,1,6,2,6,4,2,7,14,9,10] #权#无向图的构建
G = nx.Graph()      #创建一个无向图
for i in range(0,len(s)):   #遍历每一条边G.add_edge(s[i], t[i], weight = w[i])   #为图G添加边,并且附上权重weight#生成节点位置
pos=nx.spring_layout(G)     #设置布局
plt.xticks([])     #取消x轴的刻度
plt.yticks([])      #取消y轴的刻度#把节点画出来
nx.draw_networkx_nodes(G,pos,node_color='r',node_size=500,alpha=0.8) #显示每一个结点 #把边画出来
nx.draw_networkx_edges(G,pos,width=3.0,alpha=0.5,edge_color='b')  #显示每一条边#把节点的标签画出来
nx.draw_networkx_labels(G,pos,font_size=16)     #显示每一个结点上的数字 #把边权重画出来
edge_labels = nx.get_edge_attributes(G,'weight')    #获取每一条边的权重
nx.draw_networkx_edge_labels(G, pos, edge_labels)   #为图添加上权重

(四)、获得最短路径

主要内容:

  • 使用迪杰斯特拉算法获得从源结点(source)到目的结点的最短路径长度
  • 使用迪杰斯特拉算法获取从源结点(source)到目的结点的最短路径
  • 使用贝尔曼-福特算法获得从源结点(source)到目的结点的最短路径长度
  • 使用贝尔曼-福特算法获取从源结点(source)到目的结点的最短路径
  • 使用迪杰斯特拉算法获得每两个节点之间的最短路径长度
  • 使用迪杰斯特拉算法获得每两个节点之间的最短路径
def get(G):#使用迪杰斯特拉算法获得从源结点(source)到目的结点的最短路径长度length1=nx.dijkstra_path_length(G, 0, 4)#使用迪杰斯特拉算法获取从源结点(source)到目的结点的最短路径path1=nx.dijkstra_path(G, 0, 4)#使用贝尔曼-福特算法获得从源结点(source)到目的结点的最短路径长度length2=nx.bellman_ford_path_length(G,0,4)#使用贝尔曼-福特算法获取从源结点(source)到目的结点的最短路径path2=nx.bellman_ford_path(G,0,4)#使用迪杰斯特拉算法获得每两个节点之间的最短路径长度length3 = dict(nx.all_pairs_dijkstra_path_length(G))#使用迪杰斯特拉算法获得每两个节点之间的最短路径path3 = dict(nx.all_pairs_dijkstra_path(G))

(四)、实现最短路径高亮

主要步骤:

  • 获取源节点到目标结点的最短路径
  • 利用循环获得每一条边
  • 在原图的基础上修改边的颜色,实现最短路径高亮
#实现最短路径的高亮answer = []for i in range(0,len(path1)-1):answer.append((path1[i],path1[i+1]))nx.draw_networkx_edges(G,pos,edgelist=answer,width=3.0,alpha=0.5,edge_color='y')

(五)、完整代码

主要步骤:

  • 获取源节点到目标结点的最短路径
  • 利用循环获得每一条边
  • 在原图的基础上修改边的颜色,实现最短路径高亮
# -*- coding: utf-8 -*-
"""
Created on Thu Aug  1 11:26:04 2019@author: lenovo
"""import networkx as nx     #内置常用的图与复杂网络分析算法
import matplotlib.pyplot as plt    #使用matplotlib库进行绘图#初始化图
s = [0,0,1,1,7,7,2,8,2,6,2,3,3,5]   #源结点
t = [1,7,7,2,8,6,8,6,5,5,3,5,4,4]   #目的结点
w = [4,8,3,8,1,6,2,6,4,2,7,14,9,10] #权#无向图的构建
G = nx.Graph()      #创建一个无向图
for i in range(0,len(s)):   #遍历每一条边G.add_edge(s[i], t[i], weight = w[i])   #为图G添加边,并且附上权重weight#生成节点位置
pos=nx.spring_layout(G)     #设置布局
plt.xticks([])     #取消x轴的刻度
plt.yticks([])      #取消y轴的刻度#把节点画出来
nx.draw_networkx_nodes(G,pos,node_color='r',node_size=500,alpha=0.8) #显示每一个结点 #把边画出来
nx.draw_networkx_edges(G,pos,width=3.0,alpha=0.5,edge_color='b')  #显示每一条边#把节点的标签画出来
nx.draw_networkx_labels(G,pos,font_size=16)     #显示每一个结点上的数字 #把边权重画出来
edge_labels = nx.get_edge_attributes(G,'weight')    #获取每一条边的权重
nx.draw_networkx_edge_labels(G, pos, edge_labels)   #为图添加上权重def get(G):#使用迪杰斯特拉算法获得从源结点(source)到目的结点的最短路径长度length1=nx.dijkstra_path_length(G, 0, 4)#使用迪杰斯特拉算法获取从源结点(source)到目的结点的最短路径path1=nx.dijkstra_path(G, 0, 4)#使用贝尔曼-福特算法获得从源结点(source)到目的结点的最短路径长度length2=nx.bellman_ford_path_length(G,0,4)#使用贝尔曼-福特算法获取从源结点(source)到目的结点的最短路径path2=nx.bellman_ford_path(G,0,4)#使用迪杰斯特拉算法获得每两个节点之间的最短路径长度length3 = dict(nx.all_pairs_dijkstra_path_length(G))#使用迪杰斯特拉算法获得每两个节点之间的最短路径path3 = dict(nx.all_pairs_dijkstra_path(G)) #实现最短路径的高亮answer = []for i in range(0,len(path1)-1):answer.append((path1[i],path1[i+1]))nx.draw_networkx_edges(G,pos,edgelist=answer,width=3.0,alpha=0.5,edge_color='y') get(G)
plt.show()

(六)、结果展示

Python实现迪杰斯特拉算法和贝尔曼福特算法求解最短路径相关推荐

  1. 算法系列——贝尔曼福特算法(Bellman-Ford)

    本系列旨在用简单的人话讲解算法,尽可能避免晦涩的定义,读者可以短时间内理解算法原理及应用细节.我在努力! 本篇文章编程语言为Python,供参考. 贝尔曼福特算法(Bellman-Ford) 典型最短 ...

  2. 算法:贝尔曼-福特算法

    算法:贝尔曼-福特算法 1.简介 贝尔曼-福特算法(Bellman–Ford algorithm)是一个查找最短路径算法主要优点是支持负权重,但时间复杂度较高,还会有负权环的问题. 如果不需要权重应该 ...

  3. Bellman ford算法(贝尔曼·福特算法)

    Bellman - ford算法是求含负权图的单源最短路径的一种算法,效率较低,代码难度较小.其原理为连续进行松弛,在每次松弛时把每条边都更新一下,若在n-1次松弛后还能更新,则说明图中有负环,因此无 ...

  4. python写算法求最短路径,Python实现迪杰斯特拉算法并生成最短路径的示例代码

    def Dijkstra(network,s,d):#迪杰斯特拉算法算s-d的最短路径,并返回该路径和代价 print("Start Dijstra Path--") path=[ ...

  5. 贝尔曼-福特算法(Bellman-Ford)最短路径问题

    贝尔曼-福特算法(Bellman-Ford) 一.贝尔曼-福特算法(Bellman-Ford) 二.代码实现 一.贝尔曼-福特算法(Bellman-Ford) 贝尔曼-福特算法与迪科斯彻算法类似,都以 ...

  6. 算法-贝尔曼-福特算法

    算法-贝尔曼-福特算法 注:该文是本博主记录学习之用,没有太多详细的讲解,敬请谅解! 一.简介 贝尔曼-福特算法(Bellman–Ford algorithm )用于计算出起点到各个节点的最短距离,支 ...

  7. JavaScript实现bellmanFord贝尔曼-福特算法(附完整源码)

    JavaScript实现bellmanFord贝尔曼-福特算法 bellmanFord.js完整源代码 bellmanFord.js完整源代码 export default function bell ...

  8. C++实现bellman ford贝尔曼-福特算法(最短路径)(附完整源码)

    C++实现bellman ford贝尔曼-福特算法 实现bellman ford贝尔曼-福特算法的完整源码(定义,实现,main函数测试) 实现bellman ford贝尔曼-福特算法的完整源码(定义 ...

  9. 了解贝尔曼·福特算法

    文章目录 为什么在现实生活中会有负权重的边? 为什么我们要留意负权重? 贝尔曼·福特算法如何工作 贝尔曼·福特伪码 Bellman Ford vs Dijkstra C示例 贝尔曼·福特算法的复杂度 ...

最新文章

  1. 开源轻量级办公系统Sandbox介绍以及配套开发文档连载
  2. 求一颗二叉树中两个节点的最低公共父节点
  3. 【知识必备】浅淡MVP在Android项目中的实战演习,让代码结构更简单~
  4. 76.数据库操纵语言DML 定义语言 DDL 控制语言DCL
  5. CCNA实验(9) -- Frame Relay
  6. mysql rowid踢重_MySQL中主键与rowid的使用陷阱总结
  7. 数据结构-二叉树、搜索树、平衡二叉树详解及C语言实现
  8. python可以下载百度文库_Python
  9. 设计模式之工厂模式(工厂方法模式 和 抽象工厂模式)
  10. mysql engine 外键_Mysql 外键设置
  11. 放苗机器人_智能化种植系统所用苗盘摆收机器人的制作方法
  12. java判断简体和繁体字_java获取系统语言(区分简体中文和繁体中文)
  13. 计算机网络实验报告实验台,计算机控制实验台
  14. 最新搜狗微信文章数据采集方法(无需代理)
  15. 扇贝单词英语版_产品分析报告
  16. The Windows account sa does not exist and cannot be provisioned as a SQL Server system administrator
  17. kali linux 入侵教程,kali linux 入侵wordpress wpscan工具使用方法
  18. git stash 暂存恢复和文件误删恢复
  19. MinIO对象生命周期管理解析
  20. 基于思维导图的研究生创新能力培养

热门文章

  1. 去掉快捷方式图标的标志
  2. Redis五种基本以及三种高级数据结构
  3. NKOI 1507 做错的括号
  4. java2503_Win8安装程序出现2502,2503错误该怎么处理
  5. 行业资讯 | 入门revit软件需要理清哪些概念。
  6. 4. 无线体内纳米网:电磁传播模型和传感器部署要点
  7. 微信小程序:授权问题(scope.userInfo【废弃】)
  8. 算法实战应用案例精讲-【图像处理】Pillow图像处理(python代码实战)
  9. Cocos2d-JS tiledMap 45度角地图坐标计算
  10. 朝辞白帝彩云间,千里江陵一日还