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

📄 gapop1.cpp

📁 用VC++变得实数编码遗传算法,还挺不错的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		//min=0 x=1 1 f4
    case 5:
		for(i=1;i<=5;i++) s1+=i*cos((i+1)*t1+i);//-10<=x(i)<=10
		for(i=1;i<=5;i++) s2+=i*cos((i+1)*t2+i);
		s=s1*s2; 
		ss=s;
		break;
		//min=-186.731 x=  f5
    case 6:
		s1=t1*t1+t2*t2; //-100<=x(i)<=100
		s2=50*pow(s1,0.1);
		s=pow(s1,0.25)*(sin(s2)*sin(s2)+1.0);
		ss=s;
		break;
		//min=0 x= 0 0  f6
    case 7:
		s1=t1*t1+t2*t2; //-100<=x(i)<=100
		s2=sqrt(s1);s2=sin(s2)*sin(s2)-0.5;
		s1=1.0+0.001*s1;
		s=0.5+s2/(s1*s1);
		ss=s;s=-s;
		break;
		//min=0 x=0 0  f7
    case 8:
		for(i=1;i<=n1;i++) //-1.28<=x(i)<=1.28 n=30
			s+=i*pow(x[i-1],4);
		ss=s;
		break;
		//min=0 x(i)=0  f8
    case 9:
		for(i=0;i<5;i++) //-65.536<=x(i)<=65.536
		{
			a[0][5*i]=-32;a[0][5*i+1]=-16;
			a[0][5*i+2]=0;a[0][5*i+3]=16;
			a[0][5*i+4]=32;
		}
		for(i=0;i<5;i++) 
		{
			a[1][5*0+i]=-32;a[1][5*1+i]=-16;
			a[1][5*2+i]=0;a[1][5*3+i]=16;
			a[1][5*4+i]=32;
		}
		for(i=0;i<25;i++)
		{
			s1=i+1+pow((t1-a[0][i]),6)+pow((t2-a[1][i]),6);
			s2=s2+1./s1;
		}
		s=0.002+s2;	
		ss=s;s=-s;
		break;
		//max=1.002,x=-32 -32 f9
    case 10:
		s=(20+t1+10*sin(10*t1)+8*cos(3*t1));  // 0<=t1<=10.
		ss=s;
		break;
		// max=46.732  x=8.32966  f10
		// min=3.1874977   x=1.0951176	
	case 11:
		s=sqrt(t1*t1+t2*t2);//0<x,y<4 n=2
		s1=4.-((t1-2.)*(t1-2.)+(t2-2.)*(t2-2.));
		ne=1;
        per=new double[ne];pel=new double[ne];
		ga1.nE(1);
		ga1.vecpe(0,s1);
        per[0]=4.;pel[0]=(t1-2.)*(t1-2.)+(t2-2.)*(t2-2.);
		ss=s;
		//s=s+s1*s1*100;
		//s=s1;
		if(fabs(s1)>0.0000001) { s=s-s1*s1*10;valid=0; }
		s=-s;
		break;
		//min=0.688      x= 0.586 0.586              f11
    case 12:
		s=t1*sin(10*3.1415926*t1)+2.0;  //-1<=t1<=2 f12
		//s=-s;
		ss=-s;
		break;
		//min=0.0497402     x=1.95052
		//max=3.85027              x=1.85055
    case 13:
		s=(3.0/(0.05+t1*t1+t2*t2))*(3.0/(0.05+t1*t1+t2*t2))+(t1*t1+t2*t2)*(t1*t1+t2*t2); //-5.12<=x,y<=5.12
		ss=s;s=-s;
		break;
		//max=3600 x=0 y=0
	case 14:
		nle=5;
	    ga1.nLe(nle);
		pler=new double[nle];plel=new double[nle];
		pler[0]=1.;pler[1]=-1.;pler[2]=34.8;pler[3]=29.1;pler[4]=-4.1;
		plel[0]=x[0]+x[1]-x[2];
		plel[1]=-x[0]+x[1]-x[2];
		plel[2]=12*x[0]+5*x[1]+12*x[2];
		plel[3]=12*x[0]+12*x[1]+7*x[2];
        plel[4]=-6*x[0]+x[1]+x[2];
        ss=(3*x[0]+x[1]-2*x[2]+0.8)/(2*x[0]-x[1]+x[2])+
			(4*x[0]-2*x[1]+x[2])/(7*x[0]+3*x[1]-x[2]);
		for(i=0;i<nle;i++)
			ga1.vecple(i,plel[i]-pler[i]);
		s=-ss;
		for(i=0;i<nle;i++)
			if(ga1.vecple(i)<0)
			{
				s+=(curgen+100)*10*ga1.vecple(i)*ga1.vecple(i);
				valid=0;
			}
		break;
        // xi>=0 max=2.471428 x=1 0 0
    default:
		break;
    }
	delete []x; 
	ga1.Fitness(s);
	ga1.Objv(ss);
	ga1.Valid(valid);
	ga1.State(state);
	if(ne>0 ) {delete []per;delete []pel;}
    if(nle>0 ) {delete []pler;delete []plel;}
	//cout<<ga1.State()<<endl;;
//    ga1.Fitness(s);
	//ga1.Fitness(fitnessfunc(s));
}

/*double gapop1::fitnessfunc()
{
	return objv;
}*/

void gapop1::cross(double p1, double p2, double& r1, double& r2)
{
	double r;
	r=poprand();
	r1=p1*r+p2*(1-r);
	r2=p1*(1-r)+p2*r;
}

void gapop1::cross(gareal& p1, gareal& p2, gareal& r1, gareal& r2)
{
	/*opt1=0-4 
	all-garealn r-rand rp-randpart
	0-all,1-r>0,2-rp>0,3-a+r0.5,4-a+rp0.5
    
	opt2=0-10 
	ac-arithmetic crossover bc-blend crossover fc-flat crossover r-rand
    0-ac,1-bc,2-fc,3-ac+bc0.5,4-ac+fc0.5,5-fc+bc0.5,6-ac+bc-r,7-ac+fc-r,8-bc+fc-r,9-ac+bc+fc-r
	*/
	double v1,v2,t1,t2,s1,s2;
	int i,k;
	int *pn,n;
	pn=new int[garealn];
	n=0;
    switch (crossopt.opt1)
	{
	case 0: for(i=0;i<garealn;i++) pn[i]=1;break;
	case 1: 
		{
			for(i=0;i<garealn;i++) 
			{if(poprand()>0.5) {pn[i]=1;n++;}}
			if(n==0) pn[rand()%garealn]=1;
			break;
		}
	case 2:
		{
			int k=rand()%garealn;
			for(i=0;i<=k;i++) pn[i]=1;
			break;
		}
	case 3: 
		{
			if(curgen/maxgen<0.5)
			{
				for(i=0;i<garealn;i++) pn[i]=1;break;
			}
			else
			{
				for(i=0;i<garealn;i++) 
				{if(poprand()>0.5) {pn[i]=1;n++;}}
				if(n==0) pn[rand()%garealn]=1;
			}
			break;
		}
	case 4: 
		{
			if(curgen/maxgen<0.5)
			{
				for(i=0;i<garealn;i++) pn[i]=1;break;
			}
			else
			{
				int k=rand()%garealn;
				for(i=0;i<=k;i++) pn[i]=1;
				break;
			}
			break;
		}
	default:for(i=0;i<garealn;i++) pn[i]=1;break;
	}
	r1=p1;r2=p2;
	for(i=0;i<garealn;i++)
	{
		if(pn[i]==0) continue;
		v1=p1.vecReal(i);
		v2=p2.vecReal(i);
        switch (crossopt.opt2)
		{
			case 0: k=0;break;
			case 1: k=1;break;
			case 2: k=2;break;
			case 3: if(curgen*1.0/maxgen<0.5)k=0; else k=1;break;
			case 4: if(curgen*1.0/maxgen<0.5)k=0; else k=2;break;
			case 5: if(curgen*1.0/maxgen<0.5)k=1; else k=2;break;
			case 6: if(poprand()<=0.5) k=0; else k=1;break;
			case 7: if(poprand()<=0.5) k=0; else k=2;break;
			case 8: if(poprand()<=0.5) k=1; else k=2;break;
			case 9: k=rand()%3;break;
			default:k=0;break;
		} 
		if(k==0)
		{
			double r=poprand();
			if(poprand()>0.5) 
				r=-0.25+1.5*r;
			else r=-1.25+1.5*r;
			t1=v1*r+v2*(1-r);
			t2=v1*(1-r)+v2*r;
			
			/*double rr1=poprand();
			double rr2=poprand();
			t1=v1*(1-rr1)+v2*rr2;
			t2=v2*(1-rr2)+v1*rr1;
			*/
			
			/*double r=poprand();
			double s1=0.;
			double s2=0.;
			double tt=pophb[i]-poplb[i];
			if((v1-v2)>0.001*tt)
			{
			s1=(pophb[i]-v2)/(v1-v2);
			s2=(poplb[i]-v2)/(v1-v2);
			r=s2+(s1-s2)*r;
			}
			else if((v1-v2)<-0.001*tt)
			{
			s1=(pophb[i]-v1)/(v2-v1);
			s2=(poplb[i]-v1)/(v2-v1);
			r=s2+(s1-s2)*r;
			}
			else r=-0.25+1.5*r;
			t1=v1*r+v2*(1-r);t2=v1*(1-r)+v2*r;
			//t1=v1+(v2-v1)*r;t2=v2+(v1-v2)*r;*/
		}
		else 
		{
            double r1=0.5;
			if(k==2) r1=0.0;
			if(v1<v2) 
			{
				s1=v1-r1*(v2-v1);
				s2=v2+r1*(v2-v1);
			}
			else
			{
                s1=v2-r1*(v1-v2);
				s2=v1+r1*(v1-v2);
			}
			t1=s1+poprand()*(s2-s1);
            t2=s1+poprand()*(s2-s1);
		}
		s1=pophb[i];s2=poplb[i];
		t1=t1<=s1?t1:s1;t1=t1>=s2?t1:s2;
		t2=t2<=s1?t2:s1;t2=t2>=s2?t2:s2;
		
		r1.vecReal(i,t1);
		r2.vecReal(i,t2);
	}
	r1.State(-1);
	r2.State(-1);
}

void gapop1::cross(gareal& p1, gareal& p2)
{
	double r,v1,v2,t1,t2;
	int i;
	//r1=p1;r2=p2;
	for(i=0;i<garealn;i++)
	{
		v1=p1.vecReal(i);
		v2=p2.vecReal(i);
		r=poprand();
		t1=v1*r+v2*(1-r);
		t2=v1*(1-r)+v2*r;
		p1.vecReal(i,t1);
		p2.vecReal(i,t2);
	}
	p1.State(-1);
	p2.State(-1);
}
double gapop1::mutation(double p1, double hb,double lb)
{
	double v,t,r;
	int b;
	t=curgen*1.0/maxgen;
	if(t>1.) t=0.999;
	b=3;
	r=poprand();
	//v=lb+r*(hb-lb); //均匀变异

	//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异

	v=p1;//非均匀变异
	if (rand()%2==0)
		v=v+(hb-v)*pow(r*(1-t),b);
	else 
		v=v-(v-lb)*pow(r*(1-t),b);

	return v;
}

void gapop1::mutation(gareal& p1, gareal& r1)
{
	/*opt1=0-5 
	all-garealn r-rand rp-randpart
	0-all,1-one,2-r>0,3-rp>0,4-a+r0.5,5-a+rp0.5
    
	opt2=0-10 
	nu-nonuniform u-uniform g-gaussian r-rand
    0-nu,1-u,2-g,3-u+nu0.5,4-g+nu0.5,5-u+g+nu0.33,6-u+nu-r,7-g+nu-r,8-g+u-r,9-nu+u+g-r
	*/
	double v,t,r,hb,lb;
	int b,k,i;
	int *pn,n;
	t=curgen*1.0/maxgen;
	if(t>1.) t=0.999;
	b=3;
	r1=p1;
	pn=new int[garealn];
	n=0;
	switch (mutopt.opt1)
	{
	case 0: for(i=0;i<garealn;i++) pn[i]=1;break;
	case 1: 
		{
			for(i=0;i<garealn;i++) 
			{if(poprand()>0.5) {pn[i]=1;n++;}}
			if(n==0) pn[rand()%garealn]=1;
			break;
		}
	case 2:
		{
			int k=rand()%garealn;
			for(i=0;i<=k;i++) pn[i]=1;
			break;
		}
	case 3: 
		{
			if(curgen/maxgen<0.5)
			{
				for(i=0;i<garealn;i++) pn[i]=1;break;
			}
			else
			{
				for(i=0;i<garealn;i++) 
				{if(poprand()>0.5) {pn[i]=1;n++;}}
				if(n==0) pn[rand()%garealn]=1;
			}
			break;
		}
	case 4: 
		{
			if(curgen/maxgen<0.5)
			{
				for(i=0;i<garealn;i++) pn[i]=1;break;
			}
			else
			{
				int k=rand()%garealn;
				for(i=0;i<=k;i++) pn[i]=1;
				break;
			}
			break;
		}
	default:for(i=0;i<garealn;i++) pn[i]=1;break;
	}

	/*for(int j=0;j<garealn;j++)
	{
		if(poprand()>0.5) 
		{
			pn[j]=1;
			n++;
		}
	}
	if(n==0) pn[rand()%garealn]=1;*/

	for( i=0;i<garealn;i++)
	{
		
        /*r=poprand();
		hb=pophb[i];lb=poplb[i];
		//v=lb+r*(hb-lb); //均匀变异
        
		//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异

		v=p1.vecReal(i);//非均匀变异
		if (rand()%2==0)
			v=v+(hb-v)*pow(r*(1-t),b);
		else 
			v=v-(v-lb)*pow(r*(1-t),b);*/
        
		if(pn[i]==0) continue;
		r=poprand();
		hb=pophb[i];lb=poplb[i];
		//k=0;
        switch (mutopt.opt2)
		{
			case 0: k=0;break;
			case 1: k=1;break;
			case 2: k=2;break;
			case 3: if(curgen*1.0/maxgen<0.5)k=0; else k=1;break;
			case 4: if(curgen*1.0/maxgen<0.5)k=0; else k=2;break;
			case 5: 
				{
					if(curgen*1.0/maxgen<1.0/3.0) k=1; 
					else if(curgen*1.0/maxgen<2.0/3.0) k=2;
					else k=0;
					break;
				}
			case 6: if(poprand()<=0.5) k=0; else k=1;break;
			case 7: if(poprand()<=0.5) k=0; else k=2;break;
			case 8: if(poprand()<=0.5) k=1; else k=2;break;
			case 9: k=rand()%3;break;
			default:k=0;break;
		} 
		if(k==1) v=lb+r*(hb-lb); //均匀变异

	    else if(k==2) v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异

		else
		{
			v=p1.vecReal(i);//非均匀变异
			if (rand()%2==0)
				v=v+(hb-v)*pow(r*(1-t),b);
			else 
				v=v-(v-lb)*pow(r*(1-t),b);
        }
        v=v<=hb?v:hb;v=v>=lb?v:lb;
		r1.vecReal(i,v);
	}
	r1.State(-1);

       
}

void gapop1::mutation(gareal& p1)
{
	double v,t,r,hb,lb;
	int b;
	t=curgen*1.0/maxgen;
	if(t>1.) t=0.999;
	b=3;
	//r1=p1;
	for(int i=0;i<garealn;i++)
	{
		r=poprand();

		hb=pophb[i];lb=poplb[i];
		//v=lb+r*(hb-lb); //均匀变异

		//v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异

		v=p1.vecReal(i);//非均匀变异
		if (rand()%2==0)
			v=v+(hb-v)*pow(r*(1-t),b);
		else 
			v=v-(v-lb)*pow(r*(1-t),b);
        
		p1.vecReal(i,v);
	}
}

void gapop1::mutation(gareal& p1,int mi, gareal& r1)
{
	double v,t,r,hb,lb;
	int b;
	t=curgen*1.0/maxgen;
	if(t>1.) t=0.999;
	b=3;
	r1=p1;
//	for(int i=0;i<garealn;i++)
//	{
		r=poprand();
        int k=rand()%3;
		//k=0;
		hb=pophb[mi];lb=poplb[mi];
		if(k==0) v=lb+r*(hb-lb); //均匀变异

	    else if(k==1) v=(hb+lb)/2.+(hb-lb)*gauss(12)/6.; //高斯变异

		else
		{
			v=p1.vecReal(mi);//非均匀变异
			if (rand()%2==0)
				v=v+(hb-v)*pow(r*(1-t),b);
			else 
				v=v-(v-lb)*pow(r*(1-t),b);
        }
		v=v<=hb?v:hb;v=v>=lb?v:lb;
		r1.vecReal(mi,v);
		r1.State(-1);
//	}
}

double gapop1::gauss(int n)
{
	int i;
	double s=0.0;
	for(i=0;i<n;i++) s+=poprand();
	return s-n*0.5;
}

void gapop1::poprun()
{
	gareal *pop,gg1,*popmove;
	char ss1[40],ss2[40],ss3[40],ss4[40];
	int *nc,*nm,*rn,*popn,n;//
	int i,j,k,nn;
	double *popfit;
	int f1,f2,f3,f4;
	int ng=1;
	int nmove,genmove;
	double pmove;
	int folast=1;
	f1=1;f2=1;f3=0;f4=1;
	genmove=20;
	pmove=0.2;
	//na=0;
	init();
	//output();
	fstream fo1,fo2,fo3,fo4;
    nn=nrun(1);
	sprintf(ss1,"popgen%d.txt",nn);
	sprintf(ss2,"popbest%d.txt",nn);
    sprintf(ss3,"popgen%d.txt",nn);
    sprintf(ss4,"popavg%d.txt",nn);
	if(f1==1) fo1.open(ss1,ios::out|ios::app);
    if(f2==1)fo2.open(ss2,ios::out|ios::app);
	if(f3==1)fo3.open(ss3,ios::out|ios::app);
	if(f4==1)fo4.open(ss4,ios::out|ios::app);

	if(f1==1)
	{
		fo1<<"\n****************************************************************\n";
		fo1<<"\npop info:\n";

⌨️ 快捷键说明

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