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

📄 gapop1.cpp

📁 用VC++变得实数编码遗传算法,还挺不错的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		fo1<<"popsize="<<popsize<<"  maxgen="<<maxgen<<"  pcross="<<pcross<<"  pmutation="<<pmutation;
		fo1<<" garealn="<<garealn<<endl;
		fo1<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
		fo1<<"no:\t"<<"hb\t"<<"lb\n";
		for(i=0;i<garealn;i++) fo1<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";	
		fo1<<"\n****************************************************************\n";
	}

	if(f2==1)
	{
		fo2<<"\n****************************************************************\n";
		fo2<<"\npop info:\n";
		fo2<<"popsize="<<popsize<<"  maxgen="<<maxgen<<"  pcross="<<pcross<<"  pmutation="<<pmutation;
		fo2<<" garealn="<<garealn<<endl;
		fo2<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
		fo2<<"no:\t"<<"hb\t"<<"lb\n";
		for(i=0;i<garealn;i++) fo2<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
		fo2<<"\n****************************************************************\n";
	}
    if(f4==1)
	{
		fo4<<"\n****************************************************************\n";
		fo4<<"\npop info:\n";
		fo4<<"popsize="<<popsize<<"  maxgen="<<maxgen<<"  pcross="<<pcross<<"  pmutation="<<pmutation;
		fo4<<" garealn="<<garealn<<endl;
		fo1<<"cross and mutation opt:"<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
		fo4<<"no:\t"<<"hb\t"<<"lb\n";
		for(i=0;i<garealn;i++) fo4<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";	
		fo4<<"\n****************************************************************\n";
		avigen();
		fo4<<curgen<<"\t"<<avigareal;
	}

	if(f1==1) fo1<<"0\n";
	if(f1==1) for(i=0;i<popsize;i++) fo1<<garealpop[i];
	if(f3==1)
	{	
		fo3<<"\n****************************************************************\n";
		fo3<<"\npop info:\n";
		fo3<<"popsize="<<popsize<<"  maxgen="<<maxgen<<"  pcross="<<pcross<<"  pmutation="<<pmutation;
		fo3<<" garealn="<<garealn<<endl;
		fo3<<"no:\t"<<"hb\t"<<"lb\n";
		for(i=0;i<garealn;i++) fo3<<"no"<<i<<":\t"<<pophb[i]<<"\t"<<poplb[i]<<"\n";
		fo3<<"\n****************************************************************\n";
		fo3<<"\n\ninit pop:\n\n";
		for(i=0;i<popsize;i++) fo3<<garealpop[i];
		
	}
    int neclit=4<popsize/3?4:popsize/3;//
	ncross=(int)(pcross*popsize+1)/2;
	if(ncross*2>popsize) ncross-=popsize%2;
	nc=new int[ncross*2];
//	nmutation=int(ceil(pmutation*popsize*garealn));
	nmutation=int(ceil(pmutation*popsize));
	nm=new int[nmutation];
	rn=new int[popsize+1];
	n=ncross*2+nmutation+popsize;
	nmove=int(pmove*popsize);
	pop=new gareal[n+1];
	popn=new int[n+1];
	popfit=new double[n+1];
	popmove=new gareal[nmove+1];
    //maxgen
	for(curgen=1;curgen<=maxgen;curgen++)
	{
        //cout<<curgen<<"************************\n";
        if(ng==1) printf("gen:%d***************************\n",curgen);
		//cross
		if(f3==1)fo3<<"\ngen:"<<curgen<<endl;
		if(f3==1)fo3<<"\ncross\n\n";
		if(neclit>=ncross*2)
		{
			//for(i=0;i<ncross*2;i++) nc[i]=i;
			poprandn(ncross*2,ncross*2,nc);
		}
		else
		{
			poprandn(popsize,ncross*2-neclit,nc);
            for(i=0;i<neclit;i++) nc[ncross*2-i-1]=i;
			//for(i=0;i<ncross;i++) 
			{
		//		if(nc[i]==nc[2*ncross-i]) nc[i]=(rand()%popsize+nc[i])%popsize;
			}
		}
		//poprandn(popsize,ncross*2,nc);
		//for(i=0;i<ncross*2;i++) nc[i]=rn[i];
        if(f3==1) fo3<<"ncross="<<ncross<<"\n"<<endl;
		for(i=0;i<ncross;i++)
		{
			j=nc[2*i];k=nc[2*i+1];
			//j=nc[i];k=nc[2*ncross-i-1];
			if(j==k) j=(rand()%popsize+j)%popsize;
			cross(garealpop[j],garealpop[k],pop[2*i],pop[2*i+1]);
			if(f3==1)fo3<<"\n"<<j<<"\t"<<k<<"\t"<<2*i<<"\t"<<2*i+1<<endl;
            if(f3==1)fo3<<garealpop[j]<<garealpop[k]<<pop[2*i]<<pop[2*i+1];

			//objfunc(pop[2*i]);
			//objfunc(pop[2*i+1]);
		}
		
		//mutation
		if(f3==1)fo3<<"\nmutation:\n\n";
		if(f3==1) fo3<<"nmutation="<<nmutation<<"\n"<<endl;
		j=ncross*2;
		//poprandn(popsize*garealn,nmutation,nm);
		//popsort(nmutation,nm);
		poprandn(popsize,nmutation,nm);
		if(nmutation>0) 
		{
			//for(i=0;i<nmutation;i++)	nm[i]=rn[i];
			for(i=0;i<nmutation;i++)
			{
				k=nm[i];
				if(k<j) 
				{
					mutation(pop[k],pop[j+i]); 
					if(f3==1)fo3<<pop[k]<<pop[j+i];
				}
				else 
				{
					mutation(garealpop[k],pop[j+i]);
					if(f3==1)fo3<<garealpop[k]<<pop[j+i];
				}

			//	k=nm[i]/garealn;
			//	int mi=nm[i]%garealn;
			/*	if(f3==1)fo3<<"\n"<<k<<"\t"<<mi<<"\n";
				if(i>0&&k==nm[i-1]/popsize)
				{
					mutation(pop[j+i-1],mi,pop[j+i]);
					//mutation(pop[j+i-1],pop[j+i]);
					if(f3==1)fo3<<pop[j+i-1]<<pop[j+i];
				}
				else
				{
					if(k<j) 
					{
						mutation(pop[k],mi,pop[j+i]); 
						if(f3==1)fo3<<pop[k]<<pop[j+i];
					}
					else 
					{
						mutation(garealpop[k],mi,pop[j+i]);
						if(f3==1)fo3<<garealpop[k]<<pop[j+i];
					}
				}*/
				//objfunc(pop[j+i]);*/
			}
		}
		/*else 
		{
			k=rn[0];%
			mutation(garealpop[k],pop[j]);
			objfunc(pop[j]);
		}*/
        
		//
		k=2*ncross+nmutation;
		//compute fitness
        /*for(i=0;i<k;i++)
		{
			if(curgen>maxgen/3) 
			{
				if(i==0) objfunc(pop[i]);
				else
				{
					j=compare(pop[i],pop,i);
					if(j==-1)  objfunc(pop[i]);
					else 
					{
						pop[i]=pop[j];
						pop[i].State(1);
					}
				}
			}
			else
				objfunc(pop[i]);
		}*/
        objfunc(pop,k);
		for(i=0;i<popsize;i++)
			pop[k+i]=garealpop[i];//popcopy(garealpop[i],pop[k+i]);
		for(i=0;i<n;i++)
			popfit[i]=pop[i].Fitness();
		/*for(i=0;i<n;i++) cout<<popfit[i]<<"\t";
        cout<<endl;*/
        if(f3==1) fo3<<"\n pop fitness:\n";
        if(f3==1)for(i=0;i<n;i++) fo3<<popfit[i]<<"\t";
		if(f3==1)fo3<<"\n";

		popsort(popfit,n,popn);
        if(f3==1) fo3<<"\n pop fitness sort:\n";
        if(f3==1)for(i=0;i<n;i++) fo3<<popn[i]<<"\t";
		if(f3==1)fo3<<"\n";

        /*cout<<"***************************"<<endl;
		for(i=0;i<n;i++) cout<<popfit[i]<<"\t";
        cout<<endl;*/


		curbestgareal=pop[popn[0]];
		if(bestgareal.Fitness()>curbestgareal.Fitness())
		{
			//popcopy(curbestgareal,bestgareal); 
			bestgareal=curbestgareal;
			bestgen=curgen;
		}

		//select 

		if(f3==1)fo3<<"\n\nselect popsize:\n\n";
		for(i=0;i<neclit;i++)
		{
			j=popn[i];
			//popcopy(pop[j],garealpop[i]);
			garealpop[i]=pop[j];
		}
		poprandn(n-neclit,popsize-neclit,rn);
	
		if(f3==1)
		{
			fo3<<"s1:\n";
			for(i=0;i<popsize-neclit;i++) fo3<<rn[i]<<"\t";
			fo3<<endl;
			popsort(popsize-neclit,rn);
			fo3<<"s2:\n";
			for(i=0;i<popsize-neclit;i++) fo3<<rn[i]<<"\t";
			fo3<<endl;
			fo3<<"last:\n";
		}
		for(i=0;i<popsize-neclit;i++)
		{
			j=rn[i]+neclit;
			//popcopy(pop[j],garealpop[i+neclit]);
			garealpop[neclit+i]=pop[popn[j]];
			if(f3==1) fo3<<popn[j]<<"\t";
		}
		if(f3==1) fo3<<endl;
		//
        //popcopy(pop[popn[0]],curbestgareal); //curbestgareal=pop[0];

		/*for(i=0;i<popsize;i++) //
		{
			j=popn[i];
			garealpop[i]=pop[j];
		}*/
        
        // move
		/*
		if(curgen%genmove==0)
		{
			for(i=0;i<nmove;i++)
				popmove[i]=newinv();
			objfunc(popmove,nmove);
			for(i=0;i<nmove;i++)
				garealpop[popsize-i-1]=popmove[i];
			for(i=0;i<popsize;i++) popfit[i]=garealpop[i].Fitness(); //
			popsort(popfit,popsize,popn);//
		}*/

        if(f2==1) fo2<<curgen<<"\t"<<bestgen<<"\t"<<bestgareal;
		//output();
		if(f1==1) 
		{
			if(curgen%50==0)
			{
				fo1<<curgen<<"\n";
				for(i=0;i<popsize;i++) fo1<<garealpop[i];
			}
		}
        if(f3==1)
		{
			fo3<<"\nselect pop info:\n\n";
			for(i=0;i<popsize;i++) fo3<<garealpop[i];
			fo3<<"\ncurbest gareal: "<<curbestgareal;
			fo3<<"\nbest gareal: "<<bestgareal;
		}
        if(f4==1)
		{
			avigen();
			fo4<<curgen<<"\t"<<avigareal;
		}
		if(curgen%10==0) wlast();
	}
	if(f1==1)fo1.close();
	if(f2==1)fo2.close();
    if(f3==1)	fo3.close();
    if(f4==1)	fo4.close();
	delete []rn;
	delete []nc;
	delete []nm;
	delete []pop;
	delete []popn;
	delete []popfit;
	delete []popmove;
}

void gapop1::output()
{
	fstream fout;
	int i;
	if(curgen==0)
		fout.open("ga313.txt",ios::out);//ios::in|
	else
		fout.open("ga313.txt",ios::app);//ios::in|ios::out|
    if(curgen%1==0)
	{


		fout<<"当前代数";
		for(i=0;i<garealn;i++) 	fout<<" 当前代最佳值"<<i;
		fout<<"当前代最佳适用值"<<" 当前代最佳目标函数值"<<endl;
		fout<<curgen<<"\t"<<curbestgareal;

		fout<<"最佳代数";
		for(i=0;i<garealn;i++) 	fout<<" 最佳值"<<i;
		fout<<"最佳适用值"<<"最佳目标函数值"<<endl;
		fout<<bestgen<<"\t"<<bestgareal;

	/*	fout<<"个体号";
		for(i=0;i<garealn;i++) fout<<"\t数值"<<i;
		fout<<"\t适用值"<<"\t目标函数值"<<endl;
		

		for(i=0;i<popsize;i++)
		{
			fout<<i<<"\t";
			//for(int j=0;j<garealn;j++) fout<<garealpop[i].vecReal(j)<<"\t";
			//fout<<garealpop[i].Fitness()<<endl;
			fout<<garealpop[i];
		}*/
	}
    //fout<<curgen<<"\t"<<bestgareal;
	fout.close();
}

void gapop1::popsort(double *s1,int n,int *r1)//[0]=min
{
	int i,j,*s;
	double *ss,t;
	ss=new double[n];
	s=new int[n];
	for(i=0;i<n;i++) ss[i]=s1[i];
	for(i=0;i<n;i++) s[i]=1;

	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(s1[i]>s1[j])
			{
				t=s1[i];
				s1[i]=s1[j];
				s1[j]=t;
			}
		} 
	}
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			if(s1[i]==ss[j]&&s[j]==1) { r1[i]=j;s[j]=0;break;}
	delete []ss;
	delete []s;
}

void gapop1::popsort(int n,int *s1)//[0]=min
{
	int i,j,t;
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(s1[i]>s1[j])
			{
				t=s1[i];
				s1[i]=s1[j];
				s1[j]=t;
			}
		} 
	}
}

/*void gapop1::popcopy(gareal &p1, gareal &p2)
{
	p2=p1;
}*/

void gapop1::sgapop()
{

}

double gapop1::bintoreal(double vh, double vl, int n, char *cbin)
{
	//double tt[]={1.,2.,4.,8.,16.,32.,64.,128.,256.,512.,1024.,2048.,4096.,8192.,16384.,32768.,65536.};
	double r=0.;
//	int nw=16;
	double s1,s2;
	s1=0.;
	if(n>64) return 0.;
	double t=0.5;
    for(int i=n-1;i>=0;i--)
	{
		t=t*2.;
		if(cbin[i]!='\0') s1=s1+int(cbin[i]-'0')*t;
	//		if(n<=nw) s1=s1+int(cbin[i]-'0')*tt[n-i-1];
	//		else s1=s1+int(cbin[i]-'0')*tt[nw]*tt[n-nw-i-1];
	}
    //if(n<nw+1) s2=tt[n];
	//else s2=tt[nw]*tt[n-nw];
	s2=t*2.;
	r=s1/s2;
	r=vl+(vh-vl)*r;
    return r;
}

void gapop1::realtobin(double vh, double vl,double v, int n, char *cbin)
{
	double r=0.;
	if(vh!=vl) r=(v-vl)/(vh-vl);
	else r=0.;
    for(int i=0;i<n;i++)
	{	
		r=r*2;
		if(r>=1.) {cbin[i]='1';r=r-1.;}
		else {cbin[i]='0';}
		
	}
}

int gapop1::compare(gareal &g1, gareal &g2)
{
	int i;
	for(i=0;i<g1.nReal();i++)
	{
		if(fabs(g1.vecReal(i)-g2.vecReal(i))>0.0001)  { return 0;break;}
	}

	return 1;
}

int gapop1::compare(gareal *g1, gareal *g2)
{
	int i,r;
	r=1;
	for(i=0;i<g1->nReal();i++)
	{
		if(fabs(g1->vecReal(i)-g2->vecReal(i))>0.0001)  { r=0;break;}
	}
	return r;
}

int gapop1::compare(gareal &g1, gareal *pg, int n)
{
	int i;
	for(i=0;i<n;i++)
	{
		if(compare(g1,pg[i])==1) { return i;break;}
	}
	return -1;
}

void gapop1::objfunc(gareal *ga1, int n)
{
	int i,j,n1,valid,state;
	FILE *output;
	fstream fo;
	double *pler,*plel,*per,*pel;
	int ne,nle;
	double s,ss,r;
	n1=ga1[0].nReal();
	ne=0; per=new double[ne];pel=new double[ne];
	if(testf>0)
	{		
		for(int j=0;j<n;j++) objfunc(ga1[j]);
	}
    else
	{
		output = fopen("da1.txt","w"); //输出数据
		fprintf(output,"%d\n",n);
		for(i=0;i<n;i++)
		{
			for(j=0;j<n1;j++) fprintf(output,"%8.1f",ga1[i].vecReal(j));
			fprintf(output,"\n");
		}
		fclose(output);
		
		//调用ANSYS计算
		int  result=system("ansys100.exe -b -p ane3fl -i opt10main.txt -o EX1_11.txt"); 
		// printf("Solution finished...\n"); 
		
		output = fopen("EX1_11.txt","w");
		fprintf(output,"\n");
		fclose(output);
		
		/*output = fopen("reda.txt","r");
		fscanf(output,"   %f",&t);
		s=(double)t;
		fscanf(output,"   %f",&t);
		s1=(double)t;
		fscanf(output,"   %f",&t);
		s2=(double)t;
		fclose(output);*/
		
		fo.open("rda10.txt",ios::in); //读入数据
		nle=11;
		pler=new double[nle];plel=new double[nle];
		pler[0]=51.8;
		for(i=1;i<nle;i++) pler[i]=172.5;
		for(i=0;i<n;i++)
		{   
		/*	fo>>s>>s1>>s2;
		printf("%d %12.1f %7.3f %7.3f  \n",na,s,s1,s2);
		na++;
		valid=1; state=0;
		ga1[i].nLe(2);
		ga1[i].vecple(0,(51.8-s1));
		ga1[i].vecple(1,(172.25-s2));
		ss=s;
		if(objopt1=1) r=0.5+0.5*curgen/maxgen;
		else r=1.0;
		if(s1>51.8) {s=s+s*(s1-51.8)*s1*r/(2*51.8);valid=0; }
			if(s2>172.25) {s=s+s*(s2-172.25)*s2*r/(2*172.25);valid=0;}*/
			
			valid=1; state=0;
			ga1[i].nLe(nle);
			fo>>ss;
			for(j=0;j<nle;j++) fo>>plel[j];
			printf("%d %12.1f %7.3f \n",na,ss,plel[0]);
			na++;
			if(objopt1=1) r=0.5+0.5*curgen/maxgen;
			else r=1.0;
			s=1.0;
			for(j=0;j<nle;j++)
			{
				ga1[i].vecple(j,pler[j]-plel[j]);
				if(plel[j]>pler[j]) 
				{
					s=s+(plel[j]-pler[j])*plel[j]*r/(nle*pler[j]);
					valid=0; 
				}
			}
			s=s*ss;
			ga1[i].Fitness(s);
			ga1[i].Objv(ss);
			ga1[i].Valid(valid);
			ga1[i].State(state);
		}
		fo.close();
	}
}

void gapop1::newinv(gareal &g1)
{
	double t;

⌨️ 快捷键说明

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