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

📄 gapop1.cpp

📁 用VC++变得实数编码遗传算法,还挺不错的
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	g1.nReal(garealn);
	for(int j=0;j<garealn;j++)
	{
		t=poplb[j]+poprand()*(pophb[j]-poplb[j]);
		//t=poplb[j]+poprand()*(0.5-0.0);
		g1.vecReal(j,t);
	}	
}

gareal& gapop1::newinv()
{
	double t;
    static	gareal g1;
	g1.nReal(garealn);
	for(int j=0;j<garealn;j++)
	{
		t=poplb[j]+poprand()*(pophb[j]-poplb[j]);
		//t=poplb[j]+poprand()*(0.5-0.0);
		g1.vecReal(j,t);
	}	
	return g1;
}

void gapop1::avigen()
{
	int i,j;
	double t;
	t=0.;
    avigareal.nReal(garealn);
	for(i=0;i<garealn;i++)
	{
		t=0.0;
		for(j=0;j<popsize;j++)
		{
			t=t+garealpop[j].vecReal(i);
		}
		avigareal.vecReal(i,t/popsize);
    //    printf("gdsgsd%f \n",avigareal.vecReal(i));
	}
	t=0.0;
	for(j=0;j<popsize;j++) t=t+garealpop[j].Fitness();
	avigareal.Fitness(t/popsize);
	t=0.0;
	for(j=0;j<popsize;j++) t=t+garealpop[j].Objv();
	avigareal.Objv(t/popsize);
    avigareal.nLe(bestgareal.nLe());
    avigareal.nF(bestgareal.nF());
    avigareal.nE(bestgareal.nE());

    if(bestgareal.nF()>0) 
	{
		for(int i=0;i<bestgareal.nF();i++)
		{
			t=0.0;
			for(j=0;j<popsize;j++) t=t+garealpop[j].vecpf(i);
			avigareal.vecpf(i,t/popsize);
		}
	}
	if(bestgareal.nE()>0) 
	{
		for(int i=0;i<bestgareal.nE();i++)
		{
			t=0.0;
			for(j=0;j<popsize;j++) t=t+garealpop[j].vecpe(i);
			avigareal.vecpe(i,t/popsize);
		}
	}
	if(bestgareal.nLe()>0) 
	{
		for(int i=0;i<bestgareal.nLe();i++)
		{
			t=0.0;
			for(j=0;j<popsize;j++) t=t+garealpop[j].vecple(i);
			avigareal.vecple(i,t/popsize);
		}
	}
    avigareal.State(1);
}

void gapop1::wlast()
{
	int i;
	fstream fo1;
    fo1.open("last.txt",ios::out);//|ios::app
	fo1<<popsize<<"\t"<<pcross<<"\t"<<pmutation<<"\n";
	fo1<<crossopt.opt1<<"\t"<<crossopt.opt2<<"\t"<<mutopt.opt1<<"\t"<<mutopt.opt2<<"\n";
	fo1<<curgen<<"\t"<<maxgen<<"\t"<<bestgen<<"\t"<<endl;
	fo1<<objopt1<<endl;
	fo1<<garealn<<endl;
//	fo1<<"no:\t"<<"hb\t"<<"lb\n";
	for(i=0;i<garealn;i++) fo1<<pophb[i]<<"\t"<<poplb[i]<<"\n";
	//if(garealpop[0].nF()>0) fo1<<garealpop[0].nF()<<"\t";
//	if(garealpop[0].nE()>0) 
	fo1<<garealpop[0].nE()<<"\t";
//	if(garealpop[0].nLe()>0) 
	fo1<<garealpop[0].nLe()<<"\t";
    //fo1<<garealpop[0].State()<<"\t";
	fo1<<endl;
	//if(garealpop[0].nE()>0||garealpop[0].nLe()>0) fo1<<garealpop[0].Valid()<<"\n";
    fo1<<bestgareal;
    for(i=0;i<popsize;i++) fo1<<garealpop[i];
	fo1<<time(NULL)<<endl;
	fo1.close();
}

void gapop1::rlast()
{
	int i,j,ne,nle,valid;
	double t;
	char ss1[40];
	time_t t1;
	fstream fo1;
    fo1.open("last.txt",ios::in);//|ios::app
	fo1>>popsize>>pcross>>pmutation;
	fo1>>crossopt.opt1>>crossopt.opt2>>mutopt.opt1>>mutopt.opt2;
	fo1>>curgen>>maxgen>>bestgen;
	fo1>>objopt1;
	fo1>>garealn;

//	cout<<garealn<<endl;
//	fo1>>"no:\t">>"hb\t">>"lb\n";
	for(i=0;i<garealn;i++) fo1>>pophb[i]>>poplb[i];
	//if(garealpop[0].nF()>0) fo1>>garealpop[0].nF()>>"\t";
//	if(garealpop[0].nE()>0) fo1>>garealpop[0].nE()>>"\t";
//	if(garealpop[0].nLe()>0) fo1>>garealpop[0].nLe()>>"\t";
//	if(garealpop[0].nE()>0||garealpop[0].nLe()>0) fo1>>garealpop[0].Valid()>>"\n";
    fo1>>ne>>nle;
	bestgareal.nE(ne);
    bestgareal.nLe(nle);
    bestgareal.nReal(garealn);
    bestgareal.State(1);
    for(j=0;j<garealn;j++)
	{
			fo1>>t;
            bestgareal.vecReal(j,t);
	}
	fo1>>t;
	bestgareal.Fitness(t);
	//cout<<bestgareal.Fitness()<<endl;
	fo1>>t;
	bestgareal.Objv(t);	
	/*if(ga1.nF()>0) 
	{
			for(int i=0;i<ga1.nF();i++)
			{is>>t;ga1.vecpf(i,t);}
	}*/
	if(ne>0) 
	{
			 for( j=0;j<ne;j++)
			 { fo1>>t;bestgareal.vecpe(j,t);}
	}
	if(nle>0) 
	{
			 for( j=0;j<nle;j++)
			 {fo1>>t;bestgareal.vecple(j,t);}
	} 
	if(ne>0||nle>0) 
	{ 
			 fo1>>valid;
			 bestgareal.Valid(valid);
	}

    for(i=0;i<popsize;i++) 
	{
		garealpop[i].nE(ne);
        garealpop[i].nLe(nle);
        garealpop[i].nReal(garealn);
        garealpop[i].State(1);
		for(j=0;j<garealn;j++)
		{
			fo1>>t;
            garealpop[i].vecReal(j,t);
		}
		fo1>>t;
		garealpop[i].Fitness(t);
		//cout<<garealpop[i].Fitness()<<endl;
		fo1>>t;
		garealpop[i].Objv(t);	
		/*if(ga1.nF()>0) 
		{
			for(int i=0;i<ga1.nF();i++)
			{is>>t;ga1.vecpf(i,t);}
		}*/
		if(ne>0) 
		{
			 for( j=0;j<ne;j++)
			 { fo1>>t;garealpop[i].vecpe(j,t);}
		}
		if(nle>0) 
		{
			 for( j=0;j<nle;j++)
			 {fo1>>t;garealpop[i].vecple(j,t);}
		} 
		 if(ne>0||nle>0) 
		 { 
			 fo1>>valid;
			 garealpop[i].Valid(valid);
		 }
	}
	fo1>>t1;
	fo1.close();
	sprintf(ss1,"last%d.txt",t1);
	rename("last.txt",ss1);
}

void gapop1::repoprun()
{
    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;
	rlast();
	if(curgen==maxgen) exit(0);
	int cg=curgen+1;
	//cout<<curgen;
	genmove=20;
	pmove=0.2;
    nn=nrun(0);
	//na=0;
	//init();
	//output();

	fstream fo1,fo2,fo3,fo4;
    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";
		fo1<<"popsize="<<popsize<<"  maxgen="<<maxgen<<"  pcross="<<pcross<<"  pmutation="<<pmutation;
		fo1<<" garealn="<<garealn<<endl;
		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<<"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;
		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";
	}

	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
	na=popsize+curgen*(ncross*2+nmutation);
	for(curgen=cg;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;*/

		//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);//
		}*/


		curbestgareal=pop[popn[0]];
		if(bestgareal.Fitness()>curbestgareal.Fitness())
		{
			//popcopy(curbestgareal,bestgareal); 
			bestgareal=curbestgareal;
			bestgen=curgen;
		}
        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;
}

int gapop1::nrun(int w)
{
    int i=0;
	fstream fo1;
	fo1.open("nosum.txt",ios::in|ios::out);
	fo1>>i;	
	if(i<0) i=0;
	fo1.close();
	if(w==1)
	{
		i++;
		fo1.open("nosum.txt",ios::in|ios::out);
		fo1<<i;
		fo1.close();
	}
	return i;

}

⌨️ 快捷键说明

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