📄 statistic.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 + -