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

📄 yichuansuanfayouhua.cpp

📁 遗传算法求解函数最优解小程序
💻 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 + -