无标度网络的C++代码实现

article/2025/8/30 18:21:49

前言

        上一篇文章中给出了ER随机网络的C++代码实现,这篇文章让我们来说一下另一个科研中用的非常广泛的网络——无关联无标度网络,即SF, UCM网络模型。

背景

        BA无标度网络的发展及算法

        无标度网络的发展要追溯到20世纪末,由Barabási和Albert提出的BA无标度网络模型,他们说明了一些大型网络,例如万维网和基因网络,其度分布满足幂律性它是一个度分布满足幂律分布 𝑃 (𝑘) ∼ 𝑘-3 的网络。 BA 的构建与随机网络不同,它是一种不断增长的网络,并且它新增加的节点并不是完全随机的连接向原网络中的任意节点,而且存在一种优先依附的关系。BA无标度网络的具体生成方法如下:
        1. 给定网络总体大小 𝑁,从一个三元组或一个存在 𝑚0 个节点的简单图开始。

         2. 网络增长:每次增加一个节点,并与原有网络中的 𝑚 个节点进行连接。连接满足优先性,且 𝑚 ≤ 𝑚0。

        3. 优先依附:新节点与原有节点 𝑖 会优先考虑原有网络中度较大的节点,节点 𝑖连接到原网络中其它节点的概率为:

         BA 网络由于优先依附的存在,实际上是一个同构 (关联) 网络,通常用来描述“富人更富”、马太效应及累计优势等现象,这也是它备受科学家青睐的原因。

        无关联无标度网络的发展及算法

        此外,无标度网络发展出了另一种形式,它不单解决了 BA 网络幂律指数固定为3的问题,同时去掉了优先依附效应,构建出了一种无关联无标度网络。 Michele Catanzaro 和 Marián Boguñá 等人给出的构建无关联配置模型的算法可以描述为:

        1. 给定网络的大小 𝑁,同时根据给出的网络度分布为每个节点分配度,并且限制节点度 ,其中 m 为网络中的最小度,而 为网络最大度,取值为正整数。

         2. 节点的度意味着节点拥有个存根 (stubs),将节点 1 ∼ 𝑁 号的存根进行排序,每次随机选取两个存根进行连边,直到所有存根选取完,就构建了网络。注意,无关联配置模型的构建应当保证存根总数量为偶数,存根的选择需避免网络产生重连边与自连边。同时,若出现剩余几个存根之间互有连接时,应当放弃本次网络构建,从第一步重新开始。

         无标度网络顾名思义,其网络节点之间的度呈现无关联性。同样,网络的性质不做过多阐述,复杂网络的任意一本书中都有很详细的描述。

C++代码实现

 BA无标度网络

#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <fstream>
#include <cmath>
#include "mt19937ar.c"
#include <vector>
#include <algorithm>using namespace std;int main()
{int Network_Size = 10000;double r;                                                   //用来判断连边的随机数long int m0;cout << "初始连通网络的节点数m0:";cin >> m0;                                                  //取m0个点构成连通网络long int m;                                                 //新节点连接旧节点的m条边数cout << "请输入增加的节点所连接旧节点的边数:";cin >> m;if(m > m0){cout << "m不能大于m0,输入错误";exit(1);}long int t = Network_Size - m0;cout << "步长t = " << t << endl;vector<double> sequence(Network_Size,0);vector<double> degree(Network_Size,0);vector<double> statistics(Network_Size,0);double Sum_degree = 0;vector<double> Probability_degree(Network_Size,0);double probability_degree_distribute = 0;vector<double> Probability_Sum(Network_Size+1,0);vector<vector<int> > adjlist(Network_Size);ofstream outfile_BA_adjacent_matrix;       //输出邻接矩阵到文本文件ofstream outfile_BA_degree;                //输出度分布到文本文件outfile_BA_adjacent_matrix.open("BA_adjacent_matrix.txt");outfile_BA_degree.open("BA_degree.txt");unsigned long idum;idum=(unsigned long)time(NULL);init_genrand(idum);for(int i = 0; i < m0; i++){for(int j = i + 1; j < m0; j++){if(i != j){adjlist[i].push_back(j);degree[i]++;adjlist[j].push_back(i);degree[j]++;}}}for(int i = 0; i < m0; i++){for(int j = 0; j < adjlist[i].size(); j++){cout << adjlist[i][j] << ' ';}cout << endl;}Sum_degree = m0 * (m0 - 1);double temp = 0;for(int i = 0; i < m0; i++)               //m0个节点组成的联通网络中每个节点的优先概率{Probability_degree[i] = degree[i]/Sum_degree;temp = temp + Probability_degree[i];Probability_Sum[0] = 0;Probability_Sum[i + 1] = temp;Probability_Sum[m0] = 1;}for(int i = m0; i < Network_Size; i++)   //增长{int u = m;for(;;){if(u == 0){break;}r = genrand_real2();int judge = 0;for(int p = 0; p < i; p++){if(r < Probability_Sum[p + 1] ){for(int k = 0; k < adjlist[p].size(); k++){if(adjlist[p][k] == i){judge = 1;break;}}if(judge == 1){break;}adjlist[p].push_back(i);degree[p]++;adjlist[i].push_back(p);degree[i]++;Sum_degree = Sum_degree + 2;u--;double Sum = 0;                         //更新for(int w = 0; w <= i; w++){Probability_degree[w] = degree[w]/Sum_degree;Sum = Sum + Probability_degree[w];Probability_Sum[0] = 0;Probability_Sum[w + 1] = Sum;Probability_Sum[i] = 1;}break;}}}}for(int i = 0; i < NetWork_Size; i++){outfile_BA_adjacent_matrix << '\t' << endl;for(int j = 0; j < adjlist[i].size(); j++){outfile_BA_adjacent_matrix << adjlist[i][j] <<' ';}outfile_BA_adjacent_matrix << endl;}for(int i = 0; i < Network_Size; i++){sequence[i] = i;for(int j = 0; j < Network_Size; j++){if(sequence[i] == degree[j]){statistics [i]++;}}probability_degree_distribute = (statistics[i]) / Network_Size;outfile_BA_degree << sequence[i] << '\t' << probability_degree_distribute << endl;}return 0;
}

  无关联无标度网络

#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <fstream>
#include <cmath>
#include "mt19937ar.c"
#include <vector>
#include <algorithm>using namespace std;int Network_Size = 1000;        //网络规格int edge = 0;                   //边的数量int main()
{double random_number;int m0 = 5;                     //网络中的最小度double r = 3.5;                          //幂double Sum = 0;double degree_Sum = 0;vector<int> degree(Network_Size);vector<double> probability_degree_distribution(Network_Size);vector<double> Probability_Sum(Network_Size);vector<vector<int> > adjlist(Network_Size);unsigned long idum;idum = (unsigned long)time(NULL);init_genrand(idum);ofstream outfile_UCM_adjacent_matrix;       //输出邻接矩阵到文本文件outfile_UCM_adjacent_matrix.open("UCM_adjlist.txt");ofstream out_degree;out_degree.open("UCM_degree.txt");for(int i = m0; i < Network_Size; i++){probability_degree_distribution[i] = pow(i,-r);Sum = Sum + probability_degree_distribution[i];}for(int i = m0; i < Network_Size; i++)                        //归一化{probability_degree_distribution[i] = probability_degree_distribution[i]/Sum;}double temp_1 = 0;for(int i = m0; i < Network_Size; i++){temp_1 = temp_1 + probability_degree_distribution[i];Probability_Sum[i] = temp_1;}for(int i = 0; i < Network_Size; i++){random_number = genrand_real2();for(int j = m0; j < Network_Size; j++){if(random_number < Probability_Sum[m0]){degree[i] = m0;break;}else if(random_number > Probability_Sum[(int)sqrt(Network_Size)]){degree[i] = (int)sqrt(Network_Size);break;}else if((random_number > Probability_Sum[j] && random_number < Probability_Sum[j + 1]) && Probability_Sum[j+1] <= Probability_Sum[(int)sqrt(Network_Size)]){degree[i] = j;break;}}}for(int i = 0; i < Network_Size; i++){degree_Sum = degree_Sum + degree[i];}if((int)degree_Sum % 2 != 0){degree[0]++;degree_Sum++;}vector<int> stabs(degree_Sum);int k = 0;for(int i = 0; i < Network_Size; i++){for(int j = 0; j < degree[i]; j++){stabs[k] = i;k++;}}int degree_Sum2 = degree_Sum;sort(stabs.begin(),stabs.end(),greater<int>());for(;;){int judge = 0;if(degree_Sum2 == 0){break;}int i = genrand_int32() % degree_Sum2;int j = genrand_int32() % degree_Sum2;if(stabs[i] == stabs[j]){continue;}if(stabs[i] != stabs[j]){for(int k = 0; k < adjlist[stabs[i]].size(); k++){if(adjlist[stabs[i]][k] == stabs[j]){judge = 1;break;}}if(judge == 1){continue;}else{adjlist[stabs[i]].push_back(stabs[j]);adjlist[stabs[j]].push_back(stabs[i]);stabs[i] = stabs[degree_Sum2-1];stabs[j] = stabs[degree_Sum2-2];degree_Sum2 = degree_Sum2 - 2;}}}for(int i = 0; i < Network_Size; i++){out_degree << degree[i] << endl;}for(int i = 0; i < Network_Size; i++){outfile_UCM_adjacent_matrix << i << '\t';for(int j = 0; j < adjlist[i].size(); j++){outfile_UCM_adjacent_matrix << adjlist[i][j] << ' ';}outfile_UCM_adjacent_matrix << endl;}return 0;
}

        注意:"mt19937ar.c"为高精度随机种子生成器,也可以将替换为C++自带的随机种子;"mt19937ar.c"在上一篇ER随机网络的文章中给出了用法与代码。同时,无关联无标度网络的代码中并没有去除最后剩下几条边互相不能链接的情况,这时可能会造成死循环,通常我的做法是再生成一次网络,或者可以在代码中再添加一层循环,来判断是否出现这种情况,但这样就降低了生成效率。

结尾

        网络生成及实现部分还需要大家对网络多进行理解,多去看代码才能提高语言转化能力。网络部分就此结束,后面的文章将会分享流行病中的一些动力学实现过程。我的计划是将我在科研中做的一些基础代码开源,当然,我不能保证我的代码百分百正确,所以希望在有问题时,各位能私信我进行更正。


http://chatgpt.dhexx.cn/article/BlbtibyM.shtml

相关文章

聊聊BA无标度网络以及其作用

病毒传播为什么如此迅速&#xff1f; 我不是医学专业的&#xff0c;所以我无法从专业的视角去解释病毒到底是什么&#xff0c;它们的行为我也不懂&#xff0c;但是我可以从另一个专业的视角&#xff0c;给大家普及一下病毒传播的承载介质&#xff0c;即 网络 。 我不可能去描…

基于Matlab的无标度网络仿真

1.问题描述&#xff1a; 无标度网络具有严重的异质性&#xff0c;其各节点之间的连接状况&#xff08;度数&#xff09;具有严重的不均匀分布性&#xff1a;网络中少数称之为Hub点的节点拥有极其多的连接&#xff0c;而大多数节点只有很少量的连接。少数Hub点对无标度网络的运行…

BA无标度网络的仿真实现

复杂网络&#xff08;Complex Network&#xff09;&#xff0c;是指具有自组织、自相似、吸引子、小世界、无标度中部分或全部性质的网络。特征&#xff1a;小世界、集群即集聚程度的概念、幂律的度分布概念。 BA模型是由巴拉巴西&#xff08;Albert-Lszl Barabsi&#xff09;与…

BA无标度网络模型

BA无标度网络模型于1999年提出&#xff0c;具有如下特性&#xff1a;&#xff08;1&#xff09;网络的规模是不断扩大的&#xff1b;&#xff08;2&#xff09;新的节点更倾向于与那些具有较高连接度的节点相连接。 BA无标度网络模型构造算法 &#xff08;1&#xff09;从具有…

Matlab实现无标度网络生成及其分析

文章目录 引言社会网络分类Barabsi-Albert无标度网络生成算法MATLAB代码实现无向的无标度网络生成代码BAgraph_undir有向的无标度网络生成代码BAgraph_dir 无标度网络的节点度统计分析无向的无标度网络节点频率统计算法有向的无标度网络节点频率统计算法 完整的分析代码代码实现…

networkx学习(五)无标度网络

networkx学习(五)无标度网络 参考:参考来源,《巴拉巴西网络科学》 无标度网络: 对于随机网络和规则网络,度分布区间非常狭窄,大多数节点都集中在节点度均值< k >的附近,说明节点具有同质性,因此< k >可以被看作是节点度的一个特征标度。而在节点度服从幂…

无标度网络的生成模型

1999 年 Barabsi 和 Albert 提出了无标度网络模型&#xff08;简称 BA 模型&#xff09;。无标度网络的重要特征为&#xff1a; 无标度网络的节点度分布服从幂律分布。 无标度网络的度分布 p ( d ) p(d) p(d) 满足 p ( d ) ∼ d − α &#xff0c; p(d)\sim d^{-\alpha}&…

无标度网络(scale-free network)

无标度网络具有严重的异质性&#xff0c;其各节点之间的连接状况&#xff08;度数&#xff09;具有严重的不均匀分布性&#xff1a;网络中少数称之为Hub点的节点拥有极其多的连接&#xff0c;而大多数节点只有很少量的连接。少数Hub点对无标度网络的运行起着主导的作用。从广义…

无标度网络模型

网络节点的度没有明显的特征长度我们就称之为无标度网络。 一、BA无标度网络模型 1、模型概述 ER随机图和WS小世界模型忽略了实际网络的两个重要特性&#xff1a; &#xff08;1&#xff09;增长特性&#xff1a;即网络的规模是不断扩大的。例如每个月都会有大量的新的科研文…

2019年互联网公司月饼哪家强?阿里、百度、网易等14家中秋月饼盘点

一年一度的中秋节日马上到来&#xff0c;"八月十五月儿圆&#xff0c;中秋月饼香又甜"&#xff0c;没有月饼的中秋节是不完整的。而在互联网公司&#xff0c;月饼已然成为福利和文化的象征。特别是一些互联网大厂&#xff0c;在月饼设计上特别用心。今天&#xff0c;…

黑芝麻智能与上汽通用五菱签署战略合作协议;亚马逊广告发布一系列全新广告解决方案 | 全球TMT...

国内市场 黑芝麻智能与上汽通用五菱签署战略合作协议。双方在车规级自动驾驶计算芯片、视觉感知算法等方面展开紧密合作。上汽通用五菱和黑芝麻智能将基于华山二号A1000系列自动驾驶计算芯片、FAD全自动驾驶平台、山海人工智能开发平台等一系列开发工具&#xff0c;结合黑芝麻智…

如何处理投递的邮件被趋势RBL拦截的问题

外发邮件时&#xff0c;对方未收到&#xff0c;查询日志&#xff0c;报错如下&#xff1a; ……..blocked_using_Trend_Micro_RBL._Please_see…… 亚信安全使用的垃圾邮件地址库为国际的MAPS库&#xff0c;您可以通过&#xff1a;https://www.ers.trendmicro.com/ 右侧的IP Re…

持续保持逆势增长,亚信科技带给我们哪些启示?

面对逆境仍然能够持续保持业绩稳步增长&#xff0c;亚信科技可以带给我们哪些启示和借鉴&#xff1f; 逆势增长的亚信科技 众所周知&#xff0c;由于三年疫情带来的巨大冲击以及各种“黑天鹅”事件频发&#xff0c;近年来许多企业的财务报表都乏善可陈。 然而就是在这样复杂的外…

从雅虎被黑事件看在线数据的保护

根据最近雅虎被黑事件我们都能了解些什么&#xff1f;10 大最常见密码&#xff0c;其中“123456”终于胜过了 2011 年人民群众最喜爱的密码冠军“password”&#xff0c;而按照键盘上字母排列顺序的“qwert”也再次入围。 当您注册网站服务时&#xff0c;是否也会使用常见的单…

JVM——垃圾回收算法

1. 概述 垃圾收集&#xff0c;不是Java语言的伴生产物。早在1960年&#xff0c;第一门开始使用内存动态分配和垃圾收集技术的Lisp语言诞生。 关于垃圾收集有三个经典问题&#xff1a; 哪些内存需要回收&#xff1f; 什么时候回收&#xff1f; 如何回收&#xff1f; 1.1. 面…

安全世界 5正当时:亚信安全2020第五空间战略发展高峰论坛举行

点击上方关注我们! 11月15日&#xff0c;由亚信安全主办的“安全世界 5正当时”2020第五空间战略发展高峰论坛在北京盛大举行。来自政府、运营商、金融和能源等关键信息基础设施行业的负责人&#xff0c;生态合作伙伴出席本次活动&#xff0c;“共启安全数字世界”&#xff0c;…

趋势科技年度巨献 《2020》反黑大片

《2020》是趋势科技根据 ICSPA 的「2020 项目」报告所改编成的影片,描述一个不久即将发生的未来世界。这些影片以虚构的故事呈现该报告当中所描绘的社会变迁与科技演进,我们将告诉您移动及云安全技术的演进如何影响人与人之间以及人与世界的互动,还有人们如何工作以及如何认…

亚信安全走过“融合、突破”元年 探索网络安全的未来

2016年12月16日&#xff0c;云与大数据安全技术厂商亚信安全在京召开“亚信安全1周年暨2017战略媒体沟通会”。本次会议指明了不断演化的全球网络威胁及国家网络安全战略驱动下的产业发展源动力&#xff0c;回顾总结了亚信安全在2016年成立元年对核心竞争力塑造的融合之力&…

摆脱科技僵尸,回归生龙活虎

你身旁有这样无法抗拒尝试新科技的家人吗?半夜不睡觉,守着闪烁蓝光的手机、平板和其他夜猫子一起按赞、分享、留言和发短信。如果这听起来很像你或你的家人&#xff0c;这里有简单四步计划来帮助你减少科技消耗。 1.在你准备拥抱枕头前的3到4小时,停止所有的网络活动 英国睡眠…

亚信安全走过“融合、突破”元年 透露人工智能创新技术战略

近日&#xff0c;亚信安全在京召开“亚信安全1周年暨2017战略媒体沟通会”。本次会议指明了不断演化的全球网络威胁及国家网络安全战略驱动下的产业发展源动力&#xff0c;回顾总结了亚信安全在2016年成立元年对核心竞争力塑造的融合之力&#xff0c;突破之道。同时&#xff0c…