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

📄 statistic.txt

📁 用c++和MPI写的并行遗传算法
💻 TXT
字号:


/////////统计单个矩阵在单点变异下的路径长度的分布//////////////////////////////////

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#define num_gene 10

#define population 500

#define max_itter 100

#define generation 10000

#define num_c 0.75

#define delt 100

#define tao  10

#define AA 100

#define NN 10







float S0[num_gene];

float S[num_gene];

float Sopt[num_gene];

int length_0;



void geneS0(float SS[])//产生初始基因组向量

{



	int i;

	

		for(i=0;i<num_gene;i++)

	{

		if(rand()%2==0)

		    SS[i]=1;

		

	    else

			SS[i]=-1;

	

	

	}

}



float gasdev()//产生正态分布随机数的函数

{



	static int iset=0;

	static float gset;

	float fac, r, v1, v2;

	

	if(iset==0)

	{

		do

		{

			v1=2.0*rand()/32767-1;

			v2=2.0*rand()/32767-1;

			r=v1*v1+v2*v2;

	

		}

		while(r>=1.0);



		fac=sqrt(-2.0*log(r)/r);

		gset=v1*fac;

		iset=1;

		return v2*fac;

	}

	else

	{

		iset=0;

		return gset;

	}

}





void initial(float ** matr)//初始化网络的函数

{



	int i,imax,j,k,l;

	imax=num_c*num_gene*num_gene;

	

	float Stemp[num_gene];

	float ph,alpha;

	float means[tao][num_gene];

	float mean[num_gene];

	

	

		

loop:

	for(j=0;j<num_gene;j++)

	{

		for(k=0;k<num_gene;k++)

		{

			matr[j][k]=0;

		}

	}

	for(i=0;i<imax;i++)

	{

		do

		{

		j=num_gene*rand()/RAND_MAX;

		k=num_gene*rand()/RAND_MAX;

		}while(j==num_gene||k==num_gene||matr[j][k]!=0);

		matr[j][k]=gasdev();

	

	}//产生初始矩阵

	

	

    for(i=0;i<num_gene;i++)

	 {

		 S[i]=S0[i];

		

	 }

		 

	 for(l=0;l<100;l++)

	 {

		

		 for(j=0;j<num_gene;j++)

			{

			    Stemp[j]=S[j];

				

			}

			

		    for(j=0;j<num_gene;j++)

			{

				

			    S[j]=0;

			    for(k=0;k<num_gene;k++)

				{

						

				    S[j]+=matr[j][k]*Stemp[k];

				}

			

				S[j]=2/(exp(S[j]*(-AA))+1)-1;

			

				means[l%tao][j]=S[j];

			

				



			}

		

			

		

			if(l<9)

		    continue;

	      

						for(k=0;k<num_gene;k++)//tao步之内S平均值

						{

							mean[k]=0;

							for(j=0;j<tao;j++)

							{

								mean[k]=mean[k]+means[j][k]/tao;

						

							}

						

						

						}

			

			   

				    ph=0;

				

				    for(j=0;j<tao;j++)

					{

						for(k=0;k<num_gene;k++)

						{

							alpha=means[j][k]-mean[k];

					       

					        ph+=alpha*alpha/(4*num_gene);

						}

					}

					

					ph=ph/tao;

			

					

					

					if(ph<0.0001)

					{

						if(l<15||l>30) 

						{

							cout<<l<<" steps; failed."<<endl;

							goto loop;

						}

					

						for(j=0;j<num_gene;j++)

						{

							Sopt[j]=mean[j];

						

						}

						cout<<"done"<<endl;

						break;

					}

					

					if(l==99)

					{

						cout<<"x"<<endl;

						goto loop;

					}

	 }

		 

     length_0=l;





}





/*void initialS0(float S2[], float ** &vector)//将所有基因向量用S0初始化

{

	int i,j;

	vector=new float*[population];

	for(i=0;i<population;i++) vector[i]=new float [num_gene];

	for(i=0;i<population;i++)

	{

		for(j=0;j<num_gene;j++)

		{

			vector[i][j]=S2[j];

		

		}

	}

}

*/



void subsequence(float *** &matr,int pa[])

{



	int i, j,k,a,b,c,l,d;

	double cr;

    float fitness,ph,phi,alpha,meanpath;

	

	float means[tao][num_gene];

	float mean[num_gene];



	float test[num_gene][num_gene];



   





	meanpath=0;





	for(i=0;i<population;i++)

	{

	

        

		do

		{

loopa:		a=population*rand()/RAND_MAX;

			b=population*rand()/RAND_MAX;

			for(j=0;j<num_gene;j++)

			{

				if(a==population||b==population) goto loopa;

				if(rand()%2==0)

					c=a;

				else 

					c=b;

			

				for(k=0;k<num_gene;k++)

				{

					

				

					if(c>499||c<0||j>=num_gene||k>=num_gene||j<0||k<0)cout<<"aa"<<c<<" "<<j<<" "<<k<<endl;

					test[j][k]=matr[c][j][k];

				

				

				}

	

			}//杂交

	



			for(j=0;j<num_gene;j++)

			{

				for(k=0;k<num_gene;k++)

				{

				        	cr=rand()/32767.00;

						

					if(test[j][k]!=0&&(cr<0.1/(num_c*num_gene*num_gene)))

					{

						test[j][k]=gasdev();

					

					}

				}

			}//变异

		

			for(j=0;j<num_gene;j++)

			{



			   means[9][j]=S0[j];

			}

			

 //////////////以下对产生的子代网络进行稳定性判断///////////



			for(l=0;l<max_itter;l++)

			{

			

		        

		        for(j=0;j<num_gene;j++)

				{

			        means[l%tao][j]=0;

			        for(k=0;k<num_gene;k++)

					{

				        means[l%tao][j]+=test[j][k]*means[(l+9)%tao][k];

						

					}

			    	means[l%tao][j]=2/(exp(means[l%tao][j]*(-AA))+1)-1;

				

				}

				

					if(l<9)

						continue;



						for(k=0;k<num_gene;k++)//tao步之内S平均值

						{

							mean[k]=0;

							for(j=0;j<tao;j++)

							{

								

								mean[k]=mean[k]+means[j][k]/tao;

						

							}

							

						}

						

				

			   

				    ph=0;

				

				    for(j=0;j<tao;j++)

					{

						for(k=0;k<num_gene;k++)

						{

							alpha=means[j][k]-mean[k];

					        ph+=alpha*alpha/(4*num_gene);

                          

						}

					}

					

					ph=ph/tao;

				



				

			    if(ph<0.0001||l==max_itter-1)

				{

					

			     	pa[i]=l+1;

			

			        break;

				}

			}//////////////////以下计算适应函数F.

				ph=0;

				for(j=0;j<num_gene;j++)

				{

					alpha=means[l%tao][j]-Sopt[j];

					ph+=alpha*alpha/(4*num_gene);

				}

				fitness=exp(-ph/delt);

				do

				{

					cr=gasdev();

				}while(cr<(-1)||cr>1);

		//	cout<<"failed."<<endl;

		}while( pa[i]==max_itter||fitness<=cr);//没达到稳态或者适应值大于一随机数的子代被舍弃;

	

		for(j=0;j<num_gene;j++)

		{

			for(k=0;k<num_gene;k++)

			{

		

				matr[i][j][k]=test[j][k];

			}

		}

	

	}





}



void perturbation(float*** &matr, float dis[])

{

	int i,j,k,n,l,a;

	int x,y;

	int i1,i2,i3,i4;

	float ph,phi;

	float alpha;

	float temp;

	float means[tao][num_gene];

	float mean[num_gene];



	/*matr=new float **[population];

	for(i=0;i<population;i++) matr[i]=new float *[num_gene];

	for(i=0;i<population;i++)

	{

		for(j=0;j<num_gene;j++)

		{

			matr[i][j]=new float [num_gene];

		}

	}*/

	for(i=0;i<population;i++)

	{

	

		dis[i]=0;

		

	    



		for(n=0;n<NN;n++)

		{

			

			

			do

			{

				x=(num_gene-1)*rand()/RAND_MAX;

				y=(num_gene-1)*rand()/RAND_MAX;

		

			}while(matr[i][x][y]==0);

			temp=matr[i][x][y];

			

			matr[i][x][y]=gasdev();

	

			for(j=0;j<num_gene;j++)

			{



			   means[9][j]=S0[j];

			}

        

		    for(l=0;l<max_itter;l++)

			{

			

		        for(j=0;j<num_gene;j++)

				{

			        means[l%tao][j]=0;

			        for(k=0;k<num_gene;k++)

					{

				        means[l%tao][j]+=matr[i][j][k]*means[(l+9)%tao][k];

						

					}



			    	means[l%tao][j]=2/(exp(means[l%tao][j]*(-AA))+1)-1;



				

				}

		

				matr[i][x][y]=temp;

					if(l<9)

						continue;



						for(k=0;k<num_gene;k++)//tao步之内S平均值

						{

							mean[k]=0;

							for(j=0;j<tao;j++)

							{

								

								mean[k]=mean[k]+means[j][k]/tao;

							

							}

							

						}

						

	



				    ph=0;

				

				    for(j=0;j<tao;j++)

					{

						for(k=0;k<num_gene;k++)

						{

							alpha=means[j][k]-mean[k];

					        ph+=alpha*alpha/(4*num_gene);

                            

						}

					}

				

					ph=ph/tao;

				

						

				if(ph<0.0001||l==max_itter-1)

				{

			

					phi=0;

				

					for(k=0;k<num_gene;k++)

						{

							alpha=mean[k]-Sopt[k];

					        phi+=alpha*alpha/(4*num_gene);

                          

						}

				

					dis[i]=dis[i]+phi/NN;



				

			        break;

				}

			}

		

		}

	

	}

}





void main()

{

	srand((unsigned)time(NULL));

    int i,j,k,l,m,n,a,b,c,ttao;

	float temp;

    float meandis;

	float Stemp[num_gene];

	int path[max_itter];

	int pa;

	float means[tao][num_gene];

	float mean[num_gene];

	float ph,alpha;



	for(i=0;i<max_itter;i++)

	{

		path[i]=0;

	}

	ofstream out("d:\\statastic\\single-2.dat", ios::out);



	geneS0(S0);

    



	float matrix[num_gene][num_gene];



   // initial(matrix);///////////////////////////////////////////////////////////////////

	loop:

	for(j=0;j<num_gene;j++)

	{

		for(k=0;k<num_gene;k++)

		{

			matrix[j][k]=0;

		}

	}

	for(i=0;i<num_c*num_gene*num_gene;i++)

	{

		do

		{

		j=num_gene*rand()/RAND_MAX;

		k=num_gene*rand()/RAND_MAX;

		}while(j==num_gene||k==num_gene||matrix[j][k]!=0);

		matrix[j][k]=gasdev();

	

	}//产生初始矩阵

	

	

    for(i=0;i<num_gene;i++)

	 {

		 S[i]=S0[i];

		

	 }

		 

	 for(l=0;l<100;l++)

	 {

		

		 for(j=0;j<num_gene;j++)

			{

			    Stemp[j]=S[j];

				

			}

			

		    for(j=0;j<num_gene;j++)

			{

				

			    S[j]=0;

			    for(k=0;k<num_gene;k++)

				{

						

				    S[j]+=matrix[j][k]*Stemp[k];

				}

			

				S[j]=2/(exp(S[j]*(-AA))+1)-1;

			

				means[l%tao][j]=S[j];

			

				



			}

		

			

		

			if(l<9)

		    continue;

	      

						for(k=0;k<num_gene;k++)//tao步之内S平均值

						{

							mean[k]=0;

							for(j=0;j<tao;j++)

							{

								mean[k]=mean[k]+means[j][k]/tao;

						

							}

						

						

						}

			

			   

				    ph=0;

				

				    for(j=0;j<tao;j++)

					{

						for(k=0;k<num_gene;k++)

						{

							alpha=means[j][k]-mean[k];

					       

					        ph+=alpha*alpha/(4*num_gene);

						}

					}

					

					ph=ph/tao;

			

					

					

					if(ph<0.0001)

					{

						if(l<15||l>30) 

						{

							cout<<l<<" steps; failed."<<endl;

							goto loop;

						}

					

						for(j=0;j<num_gene;j++)

						{

							Sopt[j]=mean[j];

						

						}

						cout<<"done"<<endl;

						break;

					}

					

					if(l==99)

					{

						cout<<"x"<<endl;

						goto loop;

					}

	 }

		 

     length_0=l;

	 //////////////////////////////////////////////////////////////////////



cout<<"test begin..."<<endl;

	

	

    for(i=0;i<generation;i++)

	{

		

		do

		{

		j=num_gene*rand()/RAND_MAX;

		k=num_gene*rand()/RAND_MAX;

		}while(j==num_gene||k==num_gene||matrix[j][k]!=0);

        temp=matrix[j][k];

		matrix[j][k]=gasdev();



//////////////以下对产生的子代网络进行稳定性判断///////////



		for(m=0;m<num_gene;m++)

			{



			   means[9][m]=S0[m];

			}

			for(l=0;l<max_itter;l++)

			{

			

		        

		        for(m=0;m<num_gene;m++)

				{

			        means[l%tao][m]=0;

			        for(n=0;n<num_gene;n++)

					{

				        means[l%tao][m]+=matrix[m][n]*means[(l+9)%tao][n];

						

					}

			    	means[l%tao][m]=2/(exp(means[l%tao][m]*(-AA))+1)-1;

				

				}



				if(l<9) 

				{

					ttao=l+1;

                    for(n=0;n<num_gene;n++)//ttao步之内S平均值

						{

							mean[n]=0;

							

							for(m=0;m<ttao;m++)

							{

								

								mean[n]=mean[n]+means[9][n]/(ttao+1)+means[m][n]/(ttao+1);

						

							}

							//cout<<means[9][n]<<" "<<mean[n]<<endl;

							

						}

					//cin>>k;

				}



				else 

				{

					ttao=tao;

						for(n=0;n<num_gene;n++)//tao步之内S平均值

						{

							mean[n]=0;

							

							for(m=0;m<ttao;m++)

							{

								

								mean[n]=mean[n]+means[m][n]/ttao;

						

							}

							

						}

				}		

				

			   

				    ph=0;

				

				    for(m=0;m<ttao;m++)

					{

						for(n=0;n<num_gene;n++)

						{

							alpha=means[m][n]-mean[n];

					        ph+=alpha*alpha/(4*num_gene);

                          

						}

					}

					

					ph=ph/ttao;

				



				

			    if(ph<0.0001||l==max_itter-1)

				{

					

			     	pa=l;

			

			        break;

				}

			}

		path[pa]++;

		matrix[j][k]=temp;

	}



	for(i=0;i<max_itter;i++)

	{

		out<<i<<" "<<path[i]<<endl;

        cout<<i<<" "<<path[i]<<endl;

	

	}



	cout<<"The initial path length is: "<<length_0<<endl;

	out<<"The initial path length is: "<<length_0<<endl;



	

	







cout<<"good."<<endl;

		

}



⌨️ 快捷键说明

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