CNM算法C++实现

博主第一次写社团划分的算法,原本CNM算法应该是通过维护一个大根堆来实现的,因为对这个算法还没那么熟,所以用的普通方法和邻接矩阵来实现的。不过不管怎么说,算法的基于贪婪策略,根据模块度划分社团的核心思想一定是不变的。公式的话,应该已经有不少文章介绍,大家可以参考,我就只贴代码了。

#include
#include
#define N 110
#define INF 100000000
using namespace std;

int n,M,row,col,A[N][N],book[N],root[N];
float delta_Q[N][N],a[N],Q,now_Q_change;
void readData();
void initialize();
float themax();
void update_Q_delta();
void printResult();

int main()
{
    cin>>n;
    Q=0;
    memset(book,0,sizeof(book));
    readData();
    initialize();
    now_Q_change=themax();
    //cout<<"now_Q_change是:"<0)
    {
        //cout<<"(row,col):("<>A[i][j];
            if (A[i][j]&&i>j)
                M++;
        }
    }
    for (int i=1;i<=n;i++)
    {
        for (int j=1;j<=n;j++)
        {
            if (A[i][j]!=0)
            {
                a[i]++;
            }
            delta_Q[i][j]=-INF;
        }
    }
    for (int i=1;i<=n;i++)
    {
        a[i]/=(2*M);
    }
    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];
            }
            else
                delta_Q[i][j]=0;
        }
    }
    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

测试数据及结果:

CNM算法C++实现_第1张图片

你可能感兴趣的:(复杂网络,C++,算法)