📄 yichuansuanfayouhua.cpp
字号:
#include<iostream.h>
#include <math.h>
#include<stdlib.h>
#include<time.h>
double fy(double *x,int n);
double selection(double *y,double fy,double **array,int sn,int m);
double crossover1(double *y,double fy,double **array,int sn,int m);
double crossover2(double **array,int sn,int m,int k);
double mutation(double **array,int sn,int m,int k);
double myrand(double a,double b);
int *shuzi(double p,int k);
double shuju(int *p, int k);
double pi=3.1415926;
double pc=0.95, pm=0.001;
void main()
{
//数据定义部分
int i,j,k,n,m,sn;
double X=0,*Y,*a,*b,Fy,h=0;
double **array,FY=0;
//数据输入部分
cout << "请输入变量维数m:m=";
cin >> m;
cout << m <<endl;
cout << "输入变量范围[a b]:" << endl;
if((a=new double [m])==NULL)
cout << "内存已经分配完。" << endl;
for(i=0;i<m;i++)
cin >> a[i];
if((b=new double [m])==NULL)
cout << "内存已经分配完。" << endl;
for(i=0;i<m;i++)
cin >> b[i];
for(i=0;i<m;i++)
cout <<a[i]<<" "<<b[i]<<endl;
cout << "输入函数sin(n(pi)x)+1.0中的n值:n=";
cin >> n;
cout << n <<endl;
cout << "输入精度值k位十进制:k=";
cin >> k;
//***选择控制参数
int GEN=800;
//***随机生成种群个数
cout << "请输入种群个数: sn=";
cin >> sn;
cout <<sn <<endl;
if((array=new double *[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((array[i]=new double[m])==NULL)
cout << "内存分配已经完。" << endl;
}
srand( (unsigned)time( NULL ) );
for(i=0;i<sn;i++)
{
for(j=0;j<m;j++)
{array[i][j]=myrand(a[j],b[j]);}
// cout <<array[i][j]<<" ";}
// cout<<endl;
}
//***适应值计算
Y = new double [sn];
for(i=0;i<sn;i++)
Y[i]=fy(array[i],n);
Fy=0;
for(i=0;i<sn;i++)
Fy=Y[i]+Fy;
// for(i=0;i<sn;i++)
// cout<<Y[i]<<" ";
// cout <<Fy<<endl;
for(i=0;i<GEN;i++)
{
for(j=0;j<sn;j++)
Y[j]=fy(array[j],n);
Fy=0;
for(j=0;j<sn;j++)
Fy=Y[j]+Fy;
selection(Y,Fy,array,sn,m);
crossover1(Y,Fy,array,sn,m);
crossover2(array,sn,m,k);
mutation(array,sn,m,k);
/* for(j=1;j<sn;j++)
for(t=0;t<m;t++)
if((array[j][t]-array[j-1][t])<=0.000001)
h=1;
if(h==1){
cout << i;
break;}
// evaluation(i);*/
}
cout << " X ";
cout << endl;
for(i=0;i<sn;i++)
for(j=0;j<m;j++)
cout << " "<<array[i][j];
cout << endl;
cout <<" Y ";
cout << endl;
for(i=0;i<sn;i++)
cout << " "<<Y[i];
cout << endl;
/* for(i=0;i<sn;i++)
for(j=0;j<m;j++)
{X=X+array[i][j];}
X=X/sn;
cout << " X = "<< X << endl;
for(i=0;i<sn;i++)
FY=FY+Y[i];
FY=FY/sn;
cout << " FY = "<< FY;
cout << endl;
// cout <<Fy<<endl;*/
delete array;
delete Y;
delete a;
delete b;
}
double fy(double *x ,int n)
{
double y;
y=(*x)*sin(n*pi*(*x))+2.0;
return y;
}
double myrand(double a,double b)
{
double date;
date= rand();
date=a+date*(b-a)/32767;
return date;
}
double selection(double *y,double fy,double **array,int sn,int m)
{
double r,he=0;
double *Pi,*qi,**arr;
int i,j,k;
if((Pi=new double [sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++){
Pi[i]=y[i]/fy;
if(Pi[i]>double(2.5*(1/sn)))
Pi[i]=2.5*Pi[i];
else if(Pi[i]<double((1/sn)/2))
Pi[i]=Pi[i]/2;}
for(i=0;i<sn;i++)
he=he+Pi[i];
for(i=0;i<sn;i++)
Pi[i]=Pi[i]/he;
if((qi=new double [sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
qi[i]=0;
for(i=0;i<sn;i++)
for(j=i;j>=0;j--)
qi[i]=Pi[j]+qi[i];
if((arr=new double *[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((arr[i]=new double[m])==NULL)
cout << "内存分配已经完。" << endl;
}
srand( (unsigned)time( NULL ) );
for(i=0;i<sn;i++)
{
r=myrand(0,1);
if((0 < r)&&( r<= qi[0]))
for(k=0;k<m;k++)
arr[i][k]=array[0][k];
else
{
for(j=1;j<sn;j++)
if((qi[j-1]<r)&&(r<=qi[j]))
for(k=0;k<m;k++){
arr[i][k]=array[j][k];}
}
}
for(i=0;i<sn;i++)
for(k=0;k<m;k++){
array[i][k]=arr[i][k];}
return 1;
delete Pi;
delete qi;
delete arr;
}
double crossover1(double *y,double fy,double **array,int sn,int m)
{
double r;
double **ar;
int i,j,j1,j2,k,l;
if((ar=new double *[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((ar[i]=new double[m])==NULL)
cout << "内存分配已经完。" << endl;
}
srand( (unsigned)time( NULL ) );
for(i=0;i<sn;i++)
{
r=myrand(0,1);
if(r<pc)
{
k=(int)(myrand(0,sn));
l=(int)(myrand(0,m));
for(j1=0;j1<l;j1++){
ar[i][j1]=array[k][j1]; }
for(j2=l;j2<m;j2++){
ar[i][j2]=array[i][j2];}
}
else
for(j=0;j<m;j++){
ar[i][j]=array[i][j];}
}
for(i=0;i<sn;i++)
for(k=0;k<m;k++){
array[i][k]=ar[i][k];}
return 1;
delete ar;
}
/*int *shuzi(double p,int sn,int m,int k)
{
int i,j;
int t,*tt;
double ten=1;
if((tt=new int [k])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;;i++)
{
for(j=0;j<k;j++)
ten=ten*ten;
t=int(p/ten);
if(t>=10)
p=p/10;
else if(t<=0)
p=p*10;
else if((t>0)&&(t<10))
break;
}
tt[0]=t;
ten=1;
for(i=1;i<k;i++)
{
for(j=k-1;j>i;j--)
ten=ten*ten;
p=p-tt[i-1]*ten*10;
tt[i]=int(p/ten);
}
return tt;
}*/
int *shuzi(double p,int k)
{
int i;
int *tt;
if((tt=new int [k])==NULL)
cout << "内存分配已经完。" << endl;
tt[0]=int(p/1);
if(tt[0]>=0)
for(i=1;i<k;i++)
{
p=(p-tt[i-1])*10;
tt[i]=int(p/1);
}
else if(tt[0]<0)
for(i=0;i<k;i++)
{
p=(p+tt[i-1])*10;
}
return tt;
}
double shuju(int *p, int k)
{
double shu=0,t=1;
int i,j;
for(i=0;i<k;i++)
{
t=1;
for(j=i;j>0;j--)
t=t/10;
shu=shu+p[i]*t;
}
return shu;
}
double crossover2(double **array,int sn,int m,int k)
{
double r;
int ***arr1, ***arr2;
int i,j,j1,j2,l1,l2,l3;
if((arr1=new int **[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((arr1[i]=new int*[m])==NULL)
cout << "内存分配已经完。" << endl;
for(j=0;j<m;j++)
{
if((arr1[i][j]=new int[k])==NULL)
cout << "内存分配已经完。" << endl;
}
}
if((arr2=new int **[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((arr2[i]=new int*[m])==NULL)
cout << "内存分配已经完。" << endl;
for(j=0;j<m;j++)
{
if((arr2[i][j]=new int[k])==NULL)
cout << "内存分配已经完。" << endl;
}
}
for(i=0;i<sn;i++)
for(j1=0;j1<m;j1++)
arr1[i][j1]=shuzi(array[i][j1],k);
srand( (unsigned)time( NULL ) );
for(i=0;i<sn;i++)
{
for(j1=0;j1<m;j1++)
{
r=myrand(0,1);
// cout <<endl<<"r="<<r<<endl;
if(r<pc)
{
l1=(int)(myrand(0,sn));
l2=(int)(myrand(0,m));
l3=(int)(myrand(0,k));
for(j2=0;j2<l3;j2++){
arr2[i][j1][j2]=arr1[i][j1][j2];}
for(j2=l3;j2<k;j2++){
arr2[i][j1][j2]=arr1[l1][l2][j2];}
}
else if(r>=pc)
{
for(j2=0;j2<k;j2++)
arr2[i][j1][j2]=arr1[i][j1][j2];
}
}
}
for(i=0;i<sn;i++)
for(j=0;j<m;j++)
array[i][j]=shuju(arr2[i][j],k);
return 1;
delete arr1;
delete arr2;
}
double mutation(double **array,int sn,int m,int k)
{
int i,j,j1,j2,l1,l2,l3;
double r;
int ***arr;
if((arr=new int **[sn])==NULL)
cout << "内存分配已经完。" << endl;
for(i=0;i<sn;i++)
{
if((arr[i]=new int*[m])==NULL)
cout << "内存分配已经完。" << endl;
for(j=0;j<m;j++)
{
if((arr[i][j]=new int[k])==NULL)
cout << "内存分配已经完。" << endl;
}
}
for(i=0;i<sn;i++)
for(j1=0;j1<m;j1++)
arr[i][j1]=shuzi(array[i][j1],k);
srand( (unsigned)time( NULL ) );
for(i=0;i<sn;i++)
{
for(j1=0;j1<m;j1++)
{
for(j2=1;j2<k;j2++){
r=myrand(0.001,0.05);
l1=(int)(myrand(0,sn));
l2=(int)(myrand(0,m));
l3=(int)(myrand(0,k));
if(r<=pm)
arr[i][j1][j2]=int(myrand(0 ,10));}
}
}
for(i=0;i<sn;i++)
for(j=0;j<m;j++)
array[i][j]=shuju(arr[i][j],k);
return 1;
delete arr;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -