⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 random.cpp

📁 复杂网络建随机网模拟建网代码
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
#define N 1000
int edge[N][N];
double SumDegree=0;            //总度数
int degree[N];             //各点度
double result[2][N/2];
void SaveTo(int);
int quan[N];
int total;

/*---------------------按照幂律分布加权--------------------------*/
void AddPower(int n)
{
	int i,j,k=1;
	double t=1.0,a[10],Rand;
	for(i=1;i<10;i++)
	{
		t+=pow(t+i,-3.0);
	}
	for(i=0;i<10;i++)
		a[i]=(pow(1.0+i,-3.0))/t;
	Rand=(double)rand()/RAND_MAX;
	t=a[0];
//	for(i=0;i<10;i++)cout<<a[i]<<endl;
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
		{
			if(edge[i][j]==1)
			{
				while(Rand>t)
					t+=a[k++];
				edge[j][i]=edge[i][j]=k;
				k=1;
				Rand=(double)rand()/RAND_MAX;
				t=a[0];
			}
		}
}
/*-----------------生成规则网时判断有无边函数----------------------*/
int det(int i,int j,int n)         
{
	if(i-j>=-2&&i-j<=2&&i-j!=0)return 1;
	else if(i-j>2)
	{
		if(n-(i-j)<=2)return 1;
		else return 0;
	}
	else if(i-j<-2)
	{
		if((n+i-j)<=2)return 1;
		else return 0;
	}
	return 0;
}

/*--------------------统计各点的度-----------------*/
void EveryDegree(int n)
{
	int i,j,t=0;
	SumDegree=0;
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			t+=edge[i][j];
		degree[i]=t;
		SumDegree+=t;
		t=0;
	}
}  	
/*-----------由小到大排列度和节点度重---------*/
void sort(int *ge,int t,int n)                 //total总点数
{
	int i,j,k;
	total=t;
	for(i=0;i<total-1;i++)
		for(j=i+1;j<total;j++)
			if(ge[i]==ge[j])
			{
				for(k=j;k<total-1;k++)
					ge[k]=ge[k+1];
				total--;
				j--;
			}
		for(i=0;i<total-1;i++)
			for(j=0;j<total-i-1;j++)
				if(ge[j]>ge[j+1])
				{
					k=ge[j];
					ge[j]=ge[j+1];
					ge[j+1]=k;
				}
        for(i=0;i<total;i++)
		{
			result[0][i]=ge[i];
			double t=0.0;
			for(j=0;j<n;j++)
				if(ge[i]==degree[j])t++;
			result[1][i]=t/n;
		}
}

void Ra(int i,int n)
{
	int rad=(int)rand()%2+1,lay=0;//rad记录挪动i行的哪条边
	lay=(int)rand()%n;
	while(lay==i||edge[i][lay]==1)
		lay=(int)rand()%n;                     //随机确定挪动边将放的位置
	if(i<n-2)
	{
		while(edge[i][i+rad]==0)
		{
			rad=(int)rand()%2+1;
		}
    	edge[i][i+rad]=0;
	    edge[i+rad][i]=0;
    	edge[i][lay]=1;
    	edge[lay][i]=1;
	}
	else 
		if(i==n-2)
		{
			if(rad==1&&edge[i][i+rad]==1)
			{
                  edge[i][i+rad]=0;
	              edge[i+rad][i]=0;
    	          edge[i][lay]=1;
    	          edge[lay][i]=1;
			}
			else
				if(rad==1&&edge[i][i+rad]==0)
				{
				    while(lay==1||edge[1][lay]==1)
					    lay=(int)rand()%n;
					edge[1][n-1]=0;
					edge[n-1][1]=0;
					edge[1][lay]=1;
					edge[lay][1]=1;
				}
				else
					if(rad==2&&edge[1][n-1]==1)
					{
						while(lay==1||edge[1][lay]==1)
					    lay=(int)rand()%n;
						edge[1][n-1]=0;
				    	edge[n-1][1]=0;
			    		edge[1][lay]=1;
				    	edge[lay][1]=1;
					}
					else
					{
						edge[i][i+1]=0;
						edge[i+1][i]=0;
						edge[i][lay]=0;
						edge[lay][i]=0;					
					}
		}
		else  
		{
			while(edge[0][lay]==1)
				lay=(int)rand()%n;
			while(edge[0][n-rad]==0)
				rad=(int)rand%2;
			edge[0][n-rad]=0;
			edge[n-rad][0]=0;
			edge[0][lay]=1;
			edge[lay][0]=1;
		}						
}

/*-------------------------保存到文件-----------------------*/
/*void SaveTo(int total)
{
	FILE *fp;
	fp=fopen("Rdat1.txt","w");
	fprintf(fp,"序号      节点的度     节点度重\n ");
	for(int i=0;i<total;i++)
		fprintf(fp,"%-10d%-10lf%10lf\n ",i+1,result[0][i],result[1][i]);
	fclose(fp);
}
*/

void main()
{
	int n=1000,i,j,lines,m,*ge,k=0;
	FILE *fp;
	char ch1[]="oldBA0.txt",ch2[]="newBA0.txt",ch3[]="Radat0.txt";
	double p;
	srand( (unsigned)time(NULL) ); 
	//cout<<"请输入节点个数:";
	//cin>>n;
	cout<<"请输入p的值:"<<endl;
	cin>>p;
	clock_t start,finish;
	start=clock();
////////////////////////////////////////////////////////////
	while(k<10)
	{
		ch1[5]='0'+k;
		ch2[5]='0'+k;
		ch3[5]='0'+k;
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
		{
			if(det(i,j,n))
				edge[i][j]=1;
			else edge[i][j]=0;
		}
	lines=n*2;
	int changelines=int(p*lines);

	while(changelines>=n)
	{
		for(i=0;i<n;i++)
		{
			Ra(i,n);
		}
		changelines-=n;
	}
    m=(int)rand()%(n-changelines);        //随机确定最后小于n的点的随机取点范围
	for(i=m;i<m+changelines;i++)
	{
		Ra(i,n);
	}
	EveryDegree(n);//求各点度

	ge=new int[n];
    for(i=0;i<n;i++)
		ge[i]=degree[i];
    sort(ge,n,n);                    //排序节点度重
/*	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
			cout<<edge[i][j]<<" ";
		cout<<endl;
	}


    for(i=0;i<n;i++)
	     cout<<degree[i]<<endl;*/
/*-----------------------把原矩阵存入文件------------------------------*/
        fp=fopen(ch1,"w");
		fprintf(fp,"%-6d",n);
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				if(i==j)fprintf(fp,"%4d",degree[i]);
				else
					fprintf(fp,"%4d",edge[i][j]);
			}
        fclose(fp);

/*--------------------------结矩阵加权------------------------------------*/
    AddPower(n);

/*--------------------------把加权矩阵存入文件------------------------------------*/
  	for(i=0;i<n;i++)
	{
		quan[i]=0;
		for(j=0;j<n;j++)
			quan[i]+=edge[i][j];	
	}
    fp=fopen(ch2,"w");
		fprintf(fp,"%-6d",n);
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				if(i==j)fprintf(fp,"%4d",quan[i]);
				else
					fprintf(fp,"%4d",edge[i][j]);
			}
        fclose(fp);
/*------------------节点度重信息存入文件-------------------------------------------*/
	fp=fopen(ch3,"w");
	fprintf(fp,"序号      节点的度     节点度重\n ");
	for(int i=0;i<total;i++)
		fprintf(fp,"%-10d%-10lf%10lf\n ",i+1,result[0][i],result[1][i]);
	fclose(fp);
	int ji=(1+k)*10;
	cout<<"已经完成"<<ji<<"%..."<<endl;
	k++;
	}

	finish=clock();
	double Time=double(finish-start)/1000;
	cout<<"程序运行完毕用的时间为"<<Time<<"秒!"<<endl;
	//cout<<"按回车键退出!"<<endl;
	//char ch=getchar();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -