图与网络分析—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语言的运行原理.基本语法.数据类型.环境部署等基础知识作了简单介绍,本节将结合具体案例进行验证测试. 案例场景:从互联网下载全国三甲医院数据,以地图作为背景,展现各医院在地图上的分布图.全国 ...
随机推荐
- vue表单校验限制输入数字后小数点两位(包括避开通过中文输入法的那些坑)
<el-form-item label="海运运费系数"> <el-input v-model.trim="ruleForm.oceanFreightC ...
- c++ read and save txt
read and save #include "util/image_util.h" #ifdef USE_PANGOLIN_VIEWER #include "pango ...
- (1)从txt读取GPS数据 真实GPS和slam定位GPS匹配 坐标系ecef和enu转化 计算均方根误差和单帧误差
#!/usr/bin/python # -*- coding: UTF-8 -*- import numpy as np import os #==========================1坐 ...
- redis面试题汇总
1redis持久化机制 redis是一个支持持久化的内存数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化,当redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的 2缓 ...
- arduino问题记录
1.tx.rx只能写,不能读 2.Arduino中文社区
- Dubbo调用 Mybatis 实体类一对多时,报错
添加fetchType="eager"属性 ,急加载 作为笔记,供个人参考
- Markdown基础语法练习
Markdown语法学习 标题 三级标题 四级标题 字体 hello,world! 两端各两个*****号 hello,world! 两端各一个*****号 hello,world! 两端各三个*** ...
- Android Studio查看指定APP日志
1.启动Android Studio 2.View->Tool Windows->Terminal 3.在底部输入monitor 4.Android Devices Monitor新窗 ...
- Javascript 事件派发 dispatcher
基本使用 基础事件 let event = new Event("click") //新建click事件 node.addEventListener("click&quo ...
- dosbox debugger
通过中断看程序运行过程 最终目的是要找到数据保存位置,如何保存到文件的.