R语言igraph包的使用

igraph包是一个用来解决图与网络问题以及对其进行可视化的包,前几天数学建模做图论的作业我就是用的这个包,这篇博客就写一下如何解决图论中的最短路问题,最大流问题和最小生成树问题,以及图的可视化。

需要声明,我是在看了这个文档(密码为jyhn)之后才写的这篇博客,但该文档之中有些内容已经过时

首先自然要创建一个图的对象,igraph包中创建图的对象的函数是

make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)
  1. 其中edges参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)表示一条从点1到点2的边,c(1,2,2,3)表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同
  2. n为最大边数,只在edges参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。
  3. isolates为孤立的点组成的向量,但只有在edges参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))这个图有两条边ab,bc,还有两个孤立的点d和e.
  4. directed为一个布尔型参数,TRUE表示有向图,FALSE表示无向图,dir参数与directed参数是一样的,但两者不能同时出现(为什么不干脆去掉一个。。。汗)。
  5. simplify参数只有在edges参数使用literals时才有用。

可以用如下语句创建一个图的对象

library(igraph)
m <- matrix( c(0,1,5, 0,2,4, 0,3,3, 1,5,3, 1,4,5, 2,5,3, 2,6,2, 3,6,2, 4,1,5, 4,7,4, 5,7,3, 6,7,5) + 1,ncol = 3,byrow = T)
#创建一个有向图
g <- make_graph(t(m[,1:2]),directed = TRUE)
#创建一个无向图
h <- make_graph(t(m[,1:2]),directed = FALSE)

我们有时候研究的有些图是有权的,怎么给图赋权呢

graph_attr(g,'weight') <- m[,3]
#或
g <- set_graph_attr(g,'weight',m[,3]) 
#也可以用第一个函数获得图的权
graph_attr(g,'weight')#得到g的权

图已经创建好了,怎么把它画出来呢?这时候就要用到万能的plot()函数了,plot()函数是一个泛型函数,如果第一个参数是图对象,那么它实际上调用的是plot.graph()函数

plot(graph_object,edge.label,vertex.label,...)
  1. edge.label参数控制点的标签,
  2. vertex.label参数控制边的标签
  3. ...plot()函数原有的控制大小颜色等的参数和plot.graph()中新增的参数,这些都可以通过帮助文档找到
plot(g)
plot(h)
plot(g,edge.label = graph_attr(g,'weight'))
plot(g,edge.label = graph_attr(g,'weight'),vertex.label = c('A','B','C','D','E','F','G','H'))

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

得到图的对象之后就可以求解最短路,最小生成树和最大流问题了。

#求最大流,source为起点,target为终点,capcity为每条边的最大容量,要注意与边的顺序
#对应
graph.maxflow(g,source = 1,target = 8,capacity = graph_attr(g,'weight'))
#会返回一个列表,里面有各个需要的值
#求最小生成树
mst(g,weights = graph_attr(g,'weight'))
#注意:这里的weights如果缺省,则会使用NULL,并不会使用图自身的权重,感觉这里
#略坑
#求最短路
#shortest_paths(graph, from, to = V(graph), mode = c("out", #"all", "in"),
#  weights = NULL, output = c("vpath", "epath", "both"),
#  predecessors = FALSE, inbound.edges = FALSE)
#最重要的几个参数为graph,from,to,weights,from为起点,to为终点,可以缺
#省,如果缺省则会计算起点到其他所有点的最短路,weights为权重
shortest_paths(g,1,weights = graph_attr(g,'weight'))
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值