实际上,BGLL算法就是在CNM算法的基础之上,再进一步,通过将CNM算法的结果中处于同一个社团的节点看作一个节点,再使用CNM算法进行社团划分,照此步骤反复迭代,每一次迭代记作一个pass,直到无法继续划分为止(就是在节点合并后,Q也不再增加)。从而尽量减轻因CNM算法的贪心策略造成的社团划分效果不佳,CNM算法实现可参考前文《CNM算法C++实现》

下文示例数据下载链接:facebook_combined

#include<iostream>
#include<cstring>
#include<fstream>
#define N 10000
#define INF 100000000
using namespace std;int flag,nn,n,M,row,col,A[N][N],B[N][N],book[N],root[N],term[N];
float delta_Q[N][N],a[N],Q,now_Q_change;
void readData();
void initialize();
float themax();
void update_Q_delta();
void printResult();
void solve(int nn);
void formB();int main()
{cin>>nn;fstream readfile;readfile.open("C:\\Users\\lenovo\\Desktop\\网络科学导论cpp代码\\facebook_combined.txt",ios::in);if(!readfile.is_open ())cout << "Open file failure" << endl;flag=1;Q=0;int t=0;int v1,v2;while (!readfile.eof())            // 若未到文件结束一直循环{readfile >> v1 >> v2;//cout<<v1<<" "<<v2<<endl;B[v1][v2]=1;B[v2][v1]=1;}readfile.close();   //关闭文件while (flag==1){flag=0;cout<<"第"<<++t<<"次pass"<<endl;solve(nn);}return 0;
}void solve(int nn)
{M=0;n=nn;memset(book,0,sizeof(book));memset(a,0,sizeof(a));readData();initialize();now_Q_change=themax();//cout<<"now_Q_change是:"<<now_Q_change<<endl;while (now_Q_change>0.0000001){flag=1;//cout<<"(row,col):("<<row<<","<<col<<")"<<endl;book[col]=1;root[col]=row;//cout<<"root["<<col<<"]:"<<row<<endl;cout<<"now_Q_change:"<<now_Q_change<<endl;Q+=now_Q_change;update_Q_delta();now_Q_change=themax();//cout<<"now_Q_change是:"<<now_Q_change<<endl;}printResult();return ;
}void readData()
{for (int i=1;i<=n;i++)root[i]=-1;for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){A[i][j]=B[i][j];if (A[i][j]&&i>j)M+=A[i][j];}}/*for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){cout<<A[i][j]<<" ";}cout<<endl;}*/for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (A[i][j]!=0){a[i]+=A[i][j];}delta_Q[i][j]=-INF;}}for (int i=1;i<=n;i++){a[i]/=(2*M);//cout<<"a["<<i<<"]:"<<a[i]<<endl;}return;
}void initialize()
{float temp=0.5;temp/=M;for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (A[i][j]>0){delta_Q[i][j]=temp-a[i]*a[j];}elsedelta_Q[i][j]=0;}}/*for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){cout<<A[i][j]<<" ";}cout<<endl;}*/return ;
}float themax()
{float curmax=-INF;for (int i=1;i<=n;i++){if (book[i]==1)continue;for (int j=1;j<=n;j++){if (book[j]==1)continue;if (curmax<delta_Q[i][j]){curmax=delta_Q[i][j];row=i;col=j;}}}//cout<<"(row,col):("<<row<<","<<col<<")"<<endl;return curmax;
}void update_Q_delta()
{//row行消失,只更新col行和col列,col列用col行对称过去即可for (int i=1;i<=n;i++){if (book[i]==1||col==i)continue;if (A[col][i]!=0&&A[row][i]!=0){delta_Q[col][i]=delta_Q[col][i]+delta_Q[row][i];}else if (A[col][i]!=0&&A[row][i]==0){delta_Q[col][i]=delta_Q[col][i]-2*a[row]*a[i];}else if (A[col][i]==0&&A[row][i]!=0){delta_Q[col][i]=delta_Q[row][i]-2*a[col]*a[i];}}for (int i=1;i<=n;i++){if (book[i]==1)continue;delta_Q[i][col]=delta_Q[col][i];}a[col]+=a[row];return ;
}void printResult()
{int seq=0;cout<<"Q值为:"<<Q<<endl;for (int i=1;i<=n;i++){cout<<"节点"<<i<<"的根为:"<<root[i]<<endl;if (root[i]==-1){term[i]=++seq;}}for (int i=1;i<=n;i++){int now=i;while (root[now]!=-1){now=root[now];}cout<<"节点"<<i<<"的根是节点:"<<now<<endl;term[i]=term[now];}//至此,seq变量表示新矩阵大小是seq*seq的nn=seq;formB();return ;
}void formB()
{memset(B,0,sizeof(B));for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){if (term[i]!=term[j])//就是说i和j在同一个社团内,他们要形成同一个节点{B[term[i]][term[j]]+=A[i][j];//B[term[j]][term[i]]+=A[i][j];}}}/*for (int i=1;i<=n;i++){for (int j=1;j<=n;j++){cout<<B[i][j]<<" ";}cout<<endl;}*/return ;
}

结果的话由于实在太长,所以只截取了部分关键结果(相邻两次迭代连接处),最终一共是迭代了五次。

BGLL算法 C++实现相关推荐

  1. 社团发现算法-BGLL算法(附代码实现)

    一.社团发现算法 人们发现许多实际网络均具有社团结构, 即整个网络由若干个社团组成,社团之间的连接相对稀疏.社团内部的连接相对稠密.社团发现则是利用图拓扑结构中所蕴藏的信息从复杂网络 中解析出其模块化 ...

  2. bgll算法 matlab,一种复杂网络社区检测的方法与流程

    本发明涉及一种社区检测方法,具体说是一种复杂网络社区检测的方法. 背景技术: 过去几年中已有许多社区检测方法相继提出,其中应用最广泛的是基于模块度的最优化方法.然而,模块度最优化本质上是一个典型的NP ...

  3. 基于模块度的社团检测算法

    一.CNM算法 该算法是基于贪婪算法思想的社团结构检测算法,该算法的计算复杂度为O(nlog2^22n),算法代码可以从网上搜到.CNM算法采用堆数据结构计算和更新模块度,具体描述如下: (1)初始化 ...

  4. 模块度计算python代码_LPA算法C++实现及模块度计算

    前言 这学期开始看社团检测的东西,了解了一些经典算法.比如GN算法,BGLL算法(又叫Louvain, 因为该算法是作者在Louvain大学时提出的),LPA算法,等等. 我先看的LPA(毕竟算法思想 ...

  5. golang通过RSA算法生成token,go从配置文件中注入密钥文件,go从文件中读取密钥文件,go RSA算法下token生成与解析;go java token共用

    RSA算法 token生成与解析 本文演示两种方式,一种是把密钥文件放在配置文件中,一种是把密钥文件本身放入项目或者容器中. 下面两种的区别在于私钥公钥的初始化, init方法,需要哪种取哪种. 通过 ...

  6. 通用解题法——回溯算法(理解+练习)

    积累算法经验,积累解题方法--回溯算法,你必须要掌握的解题方法! 什么是回溯算法呢? 回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就&quo ...

  7. 伍六七带你学算法 进阶篇-生命游戏

    有趣的算法题–生命游戏 难度-中等 根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机. 想要体验生命游戏的小伙伴可以到这里-->生命游戏 进入 ...

  8. 伍六七带你学算法 进阶篇-排序算法

    给定一个整数数组 nums,将该数组升序排列. 示例 1: 输入:[5,2,3,1] 输出:[1,2,3,5] 示例 2: 输入:[5,1,1,2,0,0] 输出:[0,0,1,1,2,5] 各排序算 ...

  9. 伍六七带你学算法 入门篇-卡牌分组

    力扣-914. 卡牌分组 难度-简单 这是一道非常有趣的题,提交通过率令人深思 ,思考它是不是一道简单的题- 开始正题: 给定一副牌,每张牌上都写着一个整数. 此时,你需要选定一个数字 X,使我们可以 ...

  10. 伍六七带你学算法 入门篇-最小的k个数

    java面试题-最小的k个数 难度-简单 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:a ...

最新文章

  1. SpringBoot 实战定时任务 Scheduled
  2. python 引用(import)文件夹下的py文件的方法
  3. c#的chart标题_C#中CHART画图
  4. MySQL索引覆盖扫描(覆盖索引)
  5. [SCOI 2010]传送带
  6. iis7+php7.1配置,IIS7.X配置PHP运行环境小结
  7. 怎样让WinForms下DataGrid可以像ASP.NET下的DataGrid一样使用自定义的模板列
  8. linux修改rm指令执行(数据安全)
  9. 从初级程序员逆袭为技术大牛,你需要懂这 10 项技术!
  10. 8位可控加减法电路设计_100以内加减法速算方法,口算速度快一倍
  11. ShaderForge - 纹理旋转
  12. 昆明市盘龙区打造铸牢中华民族共同体意识盘龙江示范带
  13. 10019---初探JVM
  14. 渤海船舶职业学院计算机应用,我院在第十一届全国大学生计算机应用能力与信息素养大赛中取得佳绩...
  15. 插入SD卡,复制粘贴不了,原来是这个原因造成的
  16. php答题抽奖源码,PHP转盘抽奖接口实例
  17. 百度飞桨(3)—— 手势识别
  18. aliyun-go-live-sdk
  19. 目标检测:已经标注的图片缩放后,对标注数据的处理
  20. java控件数组_多维控件数组

热门文章

  1. 2.口袋西游寻路call
  2. 背包问题九讲[转载]
  3. 什么是恶意软件?病毒,蠕虫,特洛伊木马等有害程序
  4. 坚持每一天,不忘初心,正经的前端学习(705)
  5. matlab鲍威尔法(Powell)
  6. 抽象代数 01.02 半群与群
  7. AngularJS-模块化
  8. 自动采集电影网站PHP源码
  9. Popclip插件:任务自动添加进 Microsoft ToDo的任务列表
  10. AD9中元件无法显示的问题解决