文章目录
- Requirement
- Snap操作手册
- Basic Types
- Vector Types
- Hash Table Types
- Pair Types
- Graph and Networks Types(graph和network类型)
- Node and Edge Operation
Requirement
- 需要提前安装用于操作图网络的snap库,这个库中有很多现成的图数据库,很方便。
- 用于图网络显示的两个库分别是
- Gnuplot用于网络结构性质的绘制
- Graphviz:用于绘制和可视化小图标记
Snap操作手册
Basic Types
- Snap中的基础类型是TInt,TFlt和TStr.这些snap中的基础类型能够自动转成python中对应的基础类别int,float,str.总的来说,没有必要使用snap中特定的基础数据类型,因为snap会自动将数据转成相关类型
Vector Types
-
在snap中vector的仅仅只能保存同一类型的数据,和python中的vector一样,可以通过索引改变特定位置的元素,也可以添加新的值。声明方式基本上都是数据类型后面加个V,会自动生成对应类型的vector.
-
基本上是和python中的vector操作完全一样的,再加上二者是可以相互转换的,所以并没有必要专门学一下。
Hash Table Types
- 就是键值对,不同于python中的就是所有的key必须要是同样的数据类型,这里哈希表的命名方式和python中的不同,需要在构造函数中就指明是那种类型的数据是key,那种类型的数据是value
- 下面的代码中是声明了一个key为int,value是str类型的字典。如果要声明一个key为int,value为int的字典,那么只需要写一次就行了,TIntH()即可
Pair Types
- 这里是数据对,相当于c++中的pair数据差不多,(value1,value2)为一个数据单位。声明方式为“T数据类型1数据类型2Pr”,这里需要指明你需要替代的数据类型1和数据类型2
- 具体实现如下,基本上除了声明之后,就只用的到两个函数,分别是GetVal1和GetVal2
Graph and Networks Types(graph和network类型)
- Snap支持graphs和networks,graphs单纯描述拓扑结构,其中节点拥有唯一的整数标记,节点与节点之间是通过有向边,或者无向边进行连接。网络network是节点或者边带有数据的graph。节点和边上的参数是通过模板参数进行传递的,这样能够处理很多数据。
- SNAP中的graph如下
- TUNGraph:无相图,无序节点对之间最多只有可能有一条边
- TNGraph:有向图,有序节点对之间有一条边
- network结构如下
- TNEANet:有向 多重图,并且节点和边上还有相关的属性
- 一般来说在snap中并不直接使用这些实例,而是使用指向这些实例的智能指针。在python中实际使用的是PUNGraph,PNGraph 和 PNEANet三个类型分别指代TUNGraph,TNGraph和TEANet.
Node and Edge Operation
- 创建graph和net
G1 = snap.TUNGraph.New()
G2 = snap.TNGraph.New()
N1 = snap.TNEANet.New()
- 增加节点和边
# 增加节点
G1.AddNode(1)
G1.AddNode(5)
G1.AddNode(32)
# 增加边,前提是节点一定要存在
G1.AddEdge(1,5)
G1.AddEdge(5,1)
G1.AddEdge(5,32)
遍历节点和边
-
使用迭代器单纯遍历节点
-
使用迭代器遍历边
-
遍历每一个节点的连结的边
-
使用的相关函数
- GetId():返回节点的编号
- GetOutDeg():返回节点的出度
- GetInDeg():返回节点的入度
- GetOutNId(e)返回第e个边的终点
- GetInNId(e)返回第e个边的起点
- IsOutNId(n):判定节点n是否拥有出边
- IsInNId(n):判定节点n是否拥有入边
- IsNbrNId(n):判断节点n是否为邻居节点
-
上述几个代码还是比较重要的,在图的遍历过程中需要。
Saving and Loading Graphs
- 使用snap你可以将网络保存为不同的格式,虽然snap会将函数保存为紧凑的二进制格式,但是也可以使用不同的文本、xml等格式来保存和加载图片。
- 这里感觉对我没什么用,因为我主要是操作network,但是这里主要都是给的graph
- 使用二进制保存和加载网络模型
- 使用文本加载和保存网络模型
# 将文本保存为txt格式
G4.SaveEdgeList("test.txt", "Save as tab-separated list of edges")
# 加载txt文件的格式
G5 = snap.LoadEdgeList(snap.TNGraph, "test.txt", 0, 1)
Graph Manipulation (图操作和处理)
- Snap支持一些常规的图操作,比如说找到最大的若链接部分,对节点的增删改查等操作
# 随机生成对应的graph图
G6 = snap.GenRndGnm(snap.TNGraph, 10000, 5000)
# 将有向图转为无向图,但是无向图转为有向图是不行的
G7 = G6.ConvertGraph(snap.TUNGraph)
# 找到途中最大的弱链接部分
WccG = G6.GetMxWcc()
# 使用森林火灾模型生成网络模型
G8 = snap.GenForestFire(1000,0.35,0.35)
# 获取特定节点构成的子图,这里是直接提出这几个节点作为子图
SubG = G8.GetSubGraph([0,1,2,3,4])
# 删除所有出度为3,入度为2的节点
G8.DelDegKNodes(3,2)
Computing Structural Properties (计算结构属性)
- snap拥有很多函数支持计算网络模型的结构属性,同时支持network和graph
- 设计一个二元数组,来获取链接图的分布,二元数组的构成是(链接图的节点数量,当前的总数)
- 计算整个网络图的度数分布,主要是出度的分布
-
获取图的邻接矩阵的特征向量,并以一个vector的形式返回
-
获取图直径的近似
- 图的直径:任意两个顶点之间的距离的最大值
- 图的直径:任意两个顶点之间的距离的最大值
-
获取图的聚合系数
-
更具体的,这里自己看相关的参考手册