(netlib已弃用且不再更新和维护,请使用CimNet.)
C++支持的复杂网络生成库
作者:胡鑫涛
版本号:Beta1.0
netlib是Network Library的简称,是C++原生支持的复杂网络库,可以用于生成一些常见的复杂网络,包括:全连接网络、规则网络、度固定的网络、ER随机图、规则格子、立方体网络、蜂窝网络、二维Kagome晶格网络和Scale-free网络等。
这个库使用C++的面向对象性质设计,具有良好的封装性和可移植性,并且组件易于拓展。同时由于这个网络存储使用十字链表实现,其运行效率较MATLAB和Python的类似库要高。
netlib的当前版本只适用于Windows上Dev-Cpp和unix环境(带make指令)的开发环境,支持VS编译及其他环境的库将被纳入开发例程。
下载netlib:netlib.zip
下载DevC++开发环境:Devcpp.exe
netlib包含于netlib文件夹内,由以下文件组成:
| 库文件名 | 作用和功能 |
|---|---|
| _basic_type.h | 定义了基础的节点数据类型。(不建议直接引用) |
| _exception.h | 定义了基本异常类。(不建议直接引用) |
| _ud_net.h | 定义了无向网络基类。(一般不建议直接引用) |
| common_net.h | 定义了普通网络。(详情见:netlib API说明) |
| random.h | 定义了随机数生成的相关函数。(详情见:netlib中的随机数) |
| sfnet.h | 定义了无标度网络。(详情见:netlib API说明) |
| netlib32.a | 32位二进制数据文件。(使用方法:构建包含netlib的工程) |
| netlib64.a | 64位二进制数据文件。(使用方法:构建包含netlib的工程) |
点击这里下载大图:netlib_beta1.0.svg
| 数据类型 | 含义 | 属于头文件 |
|---|---|---|
| Vexid | 节点编号,从0开始计算 | _basic_type.h |
| Vexpair | 一对节点编号,用一个二元数组保存(忽略) | _basic_type.h |
| Vex, *VexArr | 节点,与内部存储有关(忽略) | _basic_type.h |
| Link | 边,与内部存储有关(忽略) | _basic_type.h |
| NeighborArray, NeiArr | 邻居数组,动态存储 | _ud_net.h |
| NetException | 网络异常类(忽略) | _exception.h |
| UndirectedNet, UDNet | 无向网络(忽略) | common_net.h |
| FullConnectedNet, WellMixNet, WMNet, FCNet | 全连接网络 | common_net.h |
| RegularNet, RENet | 规则网络 | common_net.h |
| FixedDegreeNet, FDNet(不建议) | 固定度的网络 | common_net.h |
| ERRandomNet, ERNet | ER随机图 | common_net.h |
| GridNet, Grid | 二维格子(Square Lattice) | common_net.h |
| CubicNet, Cube, CBNet | 立方体网络 | common_net.h |
| HoneycombNet, HCNet | 蜂窝网络 | common_net.h |
| KagomeNet, KGNet | Kagome晶格网络 | common_net.h |
| ScaleFreeNet, SFNet | 无标度网络 | sfnet.h |
netlib包含了随机数库random.h,使用了Mersenne twister随机数生成算法。这个算法是由Makoto Matsumoto(松本 眞)和Takuji Nishimura(西村 拓士)于1997年提出的。
random.h中的函数如下:
double genrand(); /* 指定随机数产生种子 */
double randf(); /* 产生一个范围在(0, 1)中的随机浮点数 */
long randi(unsigned long LIM); /* 产生一个范围在[0, LIM-1]中的随机整数 */
(在程序代码中又可以写作UDNet)
class UndirectedNet{
friend std::ostream& operator<<(std::ostream& out, const UndirectedNet& net); /* 友元,打印网络信息 */
public:
/* 构造与析构 */
explicit UndirectedNet(int vex_num = 0); /* 传入网络总节点个数vex_num以构造网络 */
/* 网络操作 */
bool addLink(Vexid vex1, Vexid vex2); /* 给vex1和vex2之间添加连边 */
bool removeLink(Vexid vex1, Vexid vex2); /* 删除vex1和vex2之间的连边 */
bool buildNeighbors(); /* 性能优化,建议构造网络完毕后添加 */
/* 数据读取 */
int totalVexNum(); /* 返回网络总节点数 */
int totalLinksNum(); /* 返回网络总边数 */
int totalDegree(); /* 返回网络总度数 */
int vexDegree(Vexid vex); /* 传入节点编号,获取该节点的度 */
double avgDegree(); /* 返回网络的平均度 */
NeighborArray &getNeighbors(Vexid vex); /* 传入节点编号,获取该节点的所有邻居 */
std::string links_bidirected(); /* 以字符串形式返回网络的所有连边(双向) */
std::string links_csv(); /* 以逗号分隔值形式描述网络的所有连边(单向) */
std::string details(); /* 以字符串形式返回网络基本信息 */
std::string links_details(); /* 以字符串形式返回网络连边基本信息 */
std::string links_details_horizontal(); /* 以字符串形式返回网络连边基本信息(按十字链表垂直关系) */
bool isLinked(Vexid vex1, Vexid vex2); /* 传入两个节点,若他们之间有连边则返回true,否则返回false */
};
这个类中的方法同样有一下别名:(虽然支持别名,但还是建议使用标准名称)
| 标准名称 | 别名 |
|---|---|
| addLink | addEdge |
| removeLink | removeEdge |
| totalLinksNum | totalEdgesNum |
| links_bidirected | edges_bidirected |
| links_csv | edges_csv |
| links_details | edges_details |
| links_details_horizontal | edges_details_horizontal |
| isLinked | isNeighbor |
| total_links | total_edges |
(在程序代码中又可以写作WellMixNet, WMNet, FCNet)
FullConnectedNet(int vex_num, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| vex_num | 网络的总节点数 |
| silence_mode | 安静模式 |
(注:安静模式传入false则会打印构建网络的进度和网络创建完成的提示,该参数默认值为true,故可以省略,下文不再赘述。)
(在程序代码中又可以写作RENet)
RegularNet(int vex_num, int links_num, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| vex_num | 网络的总节点数 |
| links_num | 每个节点向右连边的个数,传统为2 |
| silence_mode | 安静模式 |
(在程序代码中又可以写作FDNet)
FixedDegreeNet(int vex_num, double avg_degree, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| vex_num | 网络的总节点数 |
| avg_degree | 网络生成后的平均度 |
| silence_mode | 安静模式 |
(在程序代码中又可以写作ERNet)
ERRandomNet(int vex_num, int avg_degree, bool silence_mode = true);
ERRandomNet(int vex_num, double avg_degree, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| vex_num | 网络的总节点数 |
| avg_degree | 平均度,传入的如果是整数,则先生成规则网络再断边重连 |
| silence_mode | 安静模式 |
(在程序代码中又可以写作Grid)
GridNet(int height, int width, int nei_num = 4, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| height | 二维格子的高 |
| width | 二维格子的宽 |
| nei_num | 邻居数,测试正常的有四邻居和八邻居,即传入4或8 |
| silence_mode | 安静模式 |
(在程序代码中又可以写作Cube, CBNet)
CubicNet(int length, int width, int height, bool silence_mode = true);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| length | 立方体的长 |
| height | 立方体的高 |
| width | 立方体的宽 |
| silence_mode | 安静模式 |
(在程序代码中又可以写作HCNet)
HoneycombNet(int honeycomb_width, int honeycomb_height, bool silence_mode = true);
std::string combDetails();
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| honeycomb_width | 蜂窝的宽 |
| honeycomb_height | 蜂窝的高 |
| silence_mode | 安静模式 |
使用combDetails()方法可以打印蜂窝的详细信息。
一个

+-------------------------------- Combs details ------------------------------+
| Comb: 0 Node: 0 1 2 9 8 7 |
| Comb: 1 Node: 2 3 4 11 10 9 |
| Comb: 2 Node: 4 5 0 7 6 11 |
| Comb: 3 Node: 6 7 8 15 14 13 |
| Comb: 4 Node: 8 9 10 17 16 15 |
| Comb: 5 Node: 10 11 6 13 12 17 |
| Comb: 6 Node: 12 13 14 3 2 1 |
| Comb: 7 Node: 14 15 16 5 4 3 |
| Comb: 8 Node: 16 17 12 1 0 5 |
+-------------------------------- End of combs -------------------------------+
(在程序代码中又可以写作KGNet)
KagomeNet(int kagome_width, int kagome_height, bool silence_mode = true);
std::string kagomeDetails();
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| honeycomb_width | Kagome晶格的宽 |
| honeycomb_height | Kagome晶格的高 |
| silence_mode | 安静模式 |
使用kagomeDetails()方法可以打印晶格的详细信息。
一个

+------------------------------- Kagome details -----------------------------+
| Kagome: 0 Node: 1 0 2 4 3 14 |
| 16 12 23 13 9 11 |
| |
| Kagome: 1 Node: 4 3 5 7 6 17 |
| 10 15 26 16 12 14 |
| |
| Kagome: 2 Node: 7 6 8 1 0 11 |
| 13 9 20 10 15 17 |
| |
| Kagome: 3 Node: 10 9 11 13 12 23 |
| 25 21 5 22 18 20 |
| |
| Kagome: 4 Node: 13 12 14 16 15 26 |
| 19 24 8 25 21 23 |
| |
| Kagome: 5 Node: 16 15 17 10 9 20 |
| 22 18 2 19 24 26 |
| |
| Kagome: 6 Node: 19 18 20 22 21 5 |
| 7 3 14 4 0 2 |
| |
| Kagome: 7 Node: 22 21 23 25 24 8 |
| 1 6 17 7 3 5 |
| |
| Kagome: 8 Node: 25 24 26 19 18 2 |
| 4 0 11 1 6 8 |
+------------------------------- End of kagome ------------------------------+
(在程序代码中又可以写作SFNet)
ScaleFreeNet(int total_vex_num, int init_m0, bool silence_mode = true);
bool addLink(Vexid vex1, Vexid vex2);
bool fullConnectInitSFVex();
bool fillSFVex_BAModel(int links_per_vex);
bool fillSFVex_BAModel2(int links_per_vex);
构造网络时需要传入:
| 参数 | 说明 |
|---|---|
| total_vex_num | 网络总结点数 |
| init_m0 | 网络初始包含节点 |
| silence_mode | 安静模式 |
注意:与其他网络不同的是,ScaleFreeNet在声明之后并不会完成创建,而是在调用fillSFNet_BAModel方法后才会完成创建!
创建一个100节点,
ScaleFreeNet net(100, 2);addLink方法初始连接一些节点,或者全连接:net.fullConnectInitSFVex();net.fillSFVex_BAModel(2);(待完成)