netlib - Network Library (弃用)

(netlib已弃用且不再更新和维护,请使用CimNet.)

C++支持的复杂网络生成库
作者:胡鑫涛
版本号:Beta1.0

什么是netlib?

netlib简介

netlib是Network Library的简称,是C++原生支持的复杂网络库,可以用于生成一些常见的复杂网络,包括:全连接网络、规则网络、度固定的网络、ER随机图、规则格子、立方体网络、蜂窝网络、二维Kagome晶格网络和Scale-free网络等。

netlib的优势

这个库使用C++的面向对象性质设计,具有良好的封装性和可移植性,并且组件易于拓展。同时由于这个网络存储使用十字链表实现,其运行效率较MATLAB和Python的类似库要高。

获取netlib

netlib的当前版本只适用于Windows上Dev-Cpp和unix环境(带make指令)的开发环境,支持VS编译及其他环境的库将被纳入开发例程。
下载netlib:netlib.zip
下载DevC++开发环境:Devcpp.exe

netlib的组成

netlib文件结构

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类结构

Classes UML
点击这里下载大图:netlib_beta1.0.svg

netlib API说明

基础类型

数据类型 含义 属于头文件
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中的随机数

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]中的随机整数 */

支持的网络

UndirectedNet - 无向网络

(在程序代码中又可以写作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

FullConnectedNet - 全连接网络

(在程序代码中又可以写作WellMixNet, WMNet, FCNet

FullConnectedNet(int vex_num, bool silence_mode = true);

构造网络时需要传入:

参数 说明
vex_num 网络的总节点数
silence_mode 安静模式

(注:安静模式传入false则会打印构建网络的进度和网络创建完成的提示,该参数默认值为true,故可以省略,下文不再赘述。)

RegularNet - 规则网络

(在程序代码中又可以写作RENet

RegularNet(int vex_num, int links_num, bool silence_mode = true);

构造网络时需要传入:

参数 说明
vex_num 网络的总节点数
links_num 每个节点向右连边的个数,传统为2
silence_mode 安静模式

FixedDegreeNet - 固定度的网络(有潜在的算法错误,弃用)

(在程序代码中又可以写作FDNet

FixedDegreeNet(int vex_num, double avg_degree, bool silence_mode = true);

构造网络时需要传入:

参数 说明
vex_num 网络的总节点数
avg_degree 网络生成后的平均度
silence_mode 安静模式

ERRandomNet - ER随机图

(在程序代码中又可以写作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 安静模式

GridNet - 二维格子

(在程序代码中又可以写作Grid

GridNet(int height, int width, int nei_num = 4, bool silence_mode = true);

构造网络时需要传入:

参数 说明
height 二维格子的高
width 二维格子的宽
nei_num 邻居数,测试正常的有四邻居和八邻居,即传入48
silence_mode 安静模式

CubicNet - 立方体网络

(在程序代码中又可以写作Cube, CBNet

CubicNet(int length, int width, int height, bool silence_mode = true);

构造网络时需要传入:

参数 说明
length 立方体的长
height 立方体的高
width 立方体的宽
silence_mode 安静模式

HoneycombNet - 蜂窝网络

(在程序代码中又可以写作HCNet

HoneycombNet(int honeycomb_width, int honeycomb_height, bool silence_mode = true);
std::string combDetails();

构造网络时需要传入:

参数 说明
honeycomb_width 蜂窝的宽
honeycomb_height 蜂窝的高
silence_mode 安静模式

使用combDetails()方法可以打印蜂窝的详细信息。
一个

3×3


Honeycomb Network

+-------------------------------- 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 -------------------------------+

KagomeNet - Kagome晶格网络

(在程序代码中又可以写作KGNet

KagomeNet(int kagome_width, int kagome_height, bool silence_mode = true);
std::string kagomeDetails();

构造网络时需要传入:

参数 说明
honeycomb_width Kagome晶格的宽
honeycomb_height Kagome晶格的高
silence_mode 安静模式

使用kagomeDetails()方法可以打印晶格的详细信息。
一个

3×3


Kagome Network

+------------------------------- 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 ------------------------------+

ScaleFreeNet - 无标度网络

(在程序代码中又可以写作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节点,

m=m0=2

  1. 声明一个Scale-free网络:
    ScaleFreeNet net(100, 2);
  2. 使用addLink方法初始连接一些节点,或者全连接:
    net.fullConnectInitSFVex();
  3. 开始按

    m=2

    逐节点生成网络:
    net.fillSFVex_BAModel(2);

netlib在博弈模拟程序中的应用

(待完成)