igraph包是一个用来解决图与网络问题以及对其进行可视化的包,前几天数学建模做图论的作业我就是用的这个包,这篇博客就写一下如何解决图论中的最短路问题,最大流问题和最小生成树问题,以及图的可视化。
需要声明,我是在看了这个文档(密码为jyhn)之后才写的这篇博客,但该文档之中有些内容已经过时
首先自然要创建一个图的对象,igraph包中创建图的对象的函数是
make_graph(edges, ..., n = max(edges), isolates = NULL,directed = TRUE,dir = directed, simplify = TRUE)
edges
参数为边组成的向量,这个向量中的元素既可以是数字也可以是字符,也可以是literals参数(但不经常用)。比如如果是数字,c(1,2)
表示一条从点1到点2的边,c(1,2,2,3)
表示两条边,一条从1到2,另一条从2到3,注意图中的点的编号不能用0来命名,否则会报错,至于原因就不太清楚啦;字母的原理与数字相同n
为最大边数,只在edges
参数中的元素是数字的时候有用,但我还是不太清楚这个参数的实质作用是什么,好像一般情况下用不到。isolates
为孤立的点组成的向量,但只有在edges
参数中的元素是字符时才有用,比如make_graph(c('a','b','b','c'),isolates = c('d','e'))
这个图有两条边ab,bc,还有两个孤立的点d和e.directed
为一个布尔型参数,TRUE
表示有向图,FALSE
表示无向图,dir
参数与directed
参数是一样的,但两者不能同时出现(为什么不干脆去掉一个。。。汗)。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,...)
edge.label
参数控制点的标签,vertex.label
参数控制边的标签...
为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'))