图与网络分析—R实现(四)
三 最短路问题
最短路问题(short-path problem)是图论理论的一个经典问题。寻找最短路径就是在指定网络中两结点间找一条距离最小的路。最短路不仅仅指一般地理意义上的距离最短,还可以引申到其它的度量,如时间、费用、线路容量等。可用来解决管路铺设、线路安装、厂区布局和设备更新等实际问题。
1. 最短路问题的描述
若网络中的每条边都有一个数值(长度、成本、时间等),则找出两节点(通常是源节点和汇节点)之间总权和最小的路径就是最短路问题。对最短路问题的研究早在上个世纪60年代以前就卓有成效了,其中对赋权图的有效算法是由荷兰著名计算机专家E.W.Dijkstra在1959年首次提出的,该算法能够解决两指定点间的最短路,也可以求解图G中一特定点到其它各顶点的最短路。后来海斯在Dijkstra算法的基础之上提出了海斯算法。但这两种算法都不能解决含有负权的图的最短路问题。因此由Ford提出了Ford算法,它能有效地解决含有负权的最短路问题。

2. 最短路问题算法
最短路问题Dijkstra算法:
Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T。初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0)。
(1)若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大。初始时,集合T只有顶点s。
(1)从dis数组选择最小值,则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,OK,此时完成一个顶点,
(1)需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值。
(1)一直从dis中找出最小值,重复上述动作,直到T中包含了图的所有顶点。
3. 最短路问题R程序
library("igraph")
#赋权图的构建
library(igraph)
m <- matrix( c(1,2,6, 1,3,5, 1,4,4, 1,6,4, 3,6,4, 3,7,3, 4,7,3, 5,8,5, 6,8,4, 7,8,6) ,ncol = 3,byrow = T)
h <- make_graph(t(m[,1:2]),directed = TRUE)
E(h)$weight=m[,3]
plot(h,edge.label = E(h)$weight)

#最短路的计算
shortest_paths(h,1,8,weights = graph_attr(h,'weight')) #节点1到节点8的最短路
shortest_paths(h,1,weights = graph_attr(h,'weight')) #节点1到其他个点的最短路
$vpath
$vpath[[1]]
+ 3/8 vertices, from 51a970d:
[1] 1 6 8 #节点1到节点8最短路为1—6—8
4. 最短路问题R计算结果
$vpath
$vpath[[1]]
+ 1/8 vertex, from 51a970d:
[1] 1
$vpath[[2]]
+ 2/8 vertices, from 51a970d:
[1] 1 2
$vpath[[3]]
+ 2/8 vertices, from 51a970d:
[1] 1 3
$vpath[[4]]
+ 2/8 vertices, from 51a970d:
[1] 1 4
$vpath[[5]]
+ 0/8 vertices, from 51a970d:
$vpath[[6]]
+ 2/8 vertices, from 51a970d:
[1] 1 6
$vpath[[7]]
+ 3/8 vertices, from 51a970d:
[1] 1 4 7
$vpath[[8]]
+ 3/8 vertices, from 51a970d:
[1] 1 6 8
5. 计算结果可视化
#最短路的计算
pa<-shortest_paths(h,1,8,weights = graph_attr(h,'weight')) #节点1到节点8的最短路
#V(h)[1]$color <- 'green'
#V(h)[6]$color <- 'green'
#V(h)[8]$color <- 'green'
E(h)$color <- 'blue'
E(h, path=pa$vpath[[1]])$color <- 'red'
plot(h, edge.label=E(h)$weight)


6. 最短路问题的应用
城市网络运用最短路原理,解决交通运输管理系统的问题,具有非常重要的现实意义。根据实时交通状况,赋予城市路网中每段线路以时间权值,利用最短路原理,计算出车辆运行时间最短的路线并汇总,通过新媒体及时向广大群众发布信息,指导广大群众选择行驶路线,进一步提高现有道路通行能力,提高道路服务水平,满足现代化高速发展的需求。
舰船通道利用图论的经典理论和人群流量理论研究舰船人员通道路线的优化设计及最优线路选择。对船舶通道进行路网抽象,建立网络图,然后根据人群流动的相关理论,选取不同拥挤情况下的人员移动速度,从而确定各条路段(包括楼梯)的行程时间。以行程时间作为通道网络的路权,得出路阻矩阵以选择一对起点/终点的最短时间路线为目标,建立最短路径问题的数学模型,利用经典的Floyd算法确定最短路径。将此方法应用于某舰艇多层甲板的通道网络中,计算结果并进行讨论,最后在此研究的基础上对通道设计相关问题的深化和拓展进行了探讨和总结,并提出设想。
图与网络分析—R实现(四)的更多相关文章
- PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...
- UML类图中类与类的四种关系图解
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Linux/Centos下使用mtr做路由图进行网络分析
工具作用: mtr可以做路由图供我们分析哪里出现故障或者是否存在有网络拥塞的情况 1. 首先安装mtr 工具 使用yum 安装 : yum install mtr -y 2. 使用 我经常在工 ...
- Scrum立会报告+燃尽图(Final阶段第四次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...
- Scrum立会报告+燃尽图(十月十三日总第四次):前期宣传相关工作
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2194 Scrum立会master:刘欣 一.小组介绍 组长:付佳 组员: ...
- Scrum立会报告+燃尽图(Beta阶段第四次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2386 项目地址:https://coding.net/u/wuyy694 ...
- scrum立会报告+燃尽图(第二周第四次)
此作业要求参考: https://edu.cnblogs.com/campus/nenu/2018fall/homework/2249 一.小组介绍 组名:杨老师粉丝群 组长:乔静玉 组员:吴奕瑶.公 ...
- R实战读书笔记四
第三章 图形入门 本章概要 1 创建和保存图形 2 定义符号.线.颜色和坐标轴 3 文本标注 4 掌控图形维数 5 多幅图合在一起 本章所介绍内容概括例如以下. 一图胜千字,人们从视觉层更易获取和理解 ...
- 社交网络分析的 R 基础:(一)初探 R 语言
写在前面 3 年的硕士生涯一转眼就过去了,和社交网络也打了很长时间交道.最近突然想给自己挖个坑,想给这 3 年写个总结,画上一个句号.回想当时学习 R 语言时也是非常戏剧性的,开始科研生活时到处发邮件 ...
- R(四): R开发实例-map分布图
前几章对R语言的运行原理.基本语法.数据类型.环境部署等基础知识作了简单介绍,本节将结合具体案例进行验证测试. 案例场景:从互联网下载全国三甲医院数据,以地图作为背景,展现各医院在地图上的分布图.全国 ...
随机推荐
- <魔域之书> Roguebook 存档修改器
魔域之书 这个多周目游戏还挺不错的,游戏是Unity3d做的,网上没有找到现成的修改器,自己用CE修改的话,由于是基于虚拟机的游戏,在Dnsyp中看了,源码,游戏数据都存在不同的 Observable ...
- Python中RSA的PKCS#1、PKCS#8,MD5加密
一.Python-RSA RSA库只支持PKCS#1的密钥格式 需要安装第三方库rsa pip install rsa python-rsa官方地址:https://stuvel.eu/python- ...
- QT动态库的创建和使用
QT动态库的创建和使用 步骤一: 创建一个库文件 Library 步骤二:进行动态库封装方法的实现 注意事项:要注意共享类均需要包含导出的宏定义 这个宏定义和导出向导的宏定义一致 宏定义: 向导文件: ...
- snpEFF注释的vcf文件转化成maf文件
利用一个perl语言写的工具:snpeffTomaf 一行代码即可实现非常方便 github地址链接:https://github.com/tsy19900929/snpeffToMaf 将此仓库中的 ...
- 创建sqlSession对象操作数据库
1.加载核心配置文件 //加载mybatis核心配置文件,获取SqlSessionFactory String resource = "mybatis-config.xml"; I ...
- operations使用研究
简介 operations支持在peer或者orderer运行过程中,提供基于restful接口的运维服务.包括健康检查.日志level管理.指标metrics接口等.首先利用test-network ...
- 4、jmeter的断言技术
断言:从反馈的结果来个需求匹配,是不是想要的内容 注:断言必要的时候才用 用过了会影响速度 1.操作步骤: 去选择自己想要响应的文本或者代码或者信息等等..... 2.断言相应大小的字节 3.断言响 ...
- Js:当前日期格式化与比较大小
//日期格式转换 getCurrentTime() { var date = new Date();//当前时间 var year = date.getFullYear() //返回指定日期的年份 v ...
- vim的visual模式和列编辑
有三种方式进入visual模式: 1> 在普通模式下输入v(小写),底部提示信息为VISUAL,编辑粒度为字符 通过方向键或者HJKL调整选择的字符范围. 输入d,删除选中字符: 输入y,复制当 ...
- Nginx自带的变量
$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符 ...