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

📄 mga.cpp

📁 这是一个基于多智能体的遗传算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		}
		else
			linyu[0]=row-1;
		if(col==0)
		{
			linyu[1]=ac-1;
		}
		else
			linyu[1]=col-1;
		if(row==ar-1)
			linyu[2]=0;
		else
			linyu[2]=row+1;
		if(col==ac-1)
			linyu[3]=0;
		else
			linyu[3]=col+1;
		if(nowpop[linyu[0]*ac+col].shiyingdu>max.shiyingdu)
		{
			max=nowpop[linyu[0]*ac+col];
			maxhao=linyu[0]*ac+col;
			panduan=1;
		}
		if(nowpop[linyu[2]*ac+col].shiyingdu>max.shiyingdu)
		{
			max=nowpop[linyu[2]*ac+col];
			maxhao=linyu[2]*ac+col;
			panduan=1;
		}
		if(nowpop[row*ac+linyu[1]].shiyingdu>max.shiyingdu)
		{
			max=nowpop[row*ac+linyu[1]];
			maxhao=row*ac+linyu[1];
			panduan=1;
		}
		if(nowpop[row*ac+linyu[3]].shiyingdu>max.shiyingdu)
		{
			max=nowpop[row*ac+linyu[3]];
			maxhao=row*ac+linyu[3];
			panduan=1;
		}
		fu1=nowpop[x-1];
		fu2=nowpop[maxhao];
		if(panduan!=0)
		{
			if(ran1(a)>=0.5)
			{
				kantan(fu1,fu2,nowpop[x-1]);
			}
			else
				kaicai(fu1,fu2,nowpop[x-1]);
		}

	}

}
void kantan(individual fu1,individual fud2,individual &child)
{
	for(int i=0;i<jiedeweishu;i++)
	{
		child.geti[i]=fud2.geti[i]+(-1+ran1(a)*2)*(fud2.geti[i]-fu1.geti[i]);
		if(child.geti[i]>youbianjie[i])
		{
			child.geti[i]=youbianjie[i];
		}
		if(child.geti[i]<zuobianjie[i])
		{
			child.geti[i]=zuobianjie[i];
		}
	}
	mubiaohanshu(child);
}
void kaicai(individual fu1,individual fud2,individual &child)
{
	int i2,i1,j,t;
	individual childtemp;
	for(int i=0;i<jiedeweishu;i++)
	{
		childtemp.geti[i]=(fud2.geti[i]-zuobianjie[i])/(youbianjie[i]-zuobianjie[i]);
	}
	do
	{
		i2=rnd(1,jiedeweishu);
	}while(i2==1);
	do
	{
		i1=rnd(1,i2);
	}while(i1==i2);
	Mm xiabiao;
	xiabiao=zeros(1,jiedeweishu);
	for(i=1;i<=i1-1;i++)
	{
		xiabiao.r(i)=i;
	}
	for(j=i2;j>=i1;j--)
	{
		xiabiao.r(i)=j;
		i++;
	}
	for(t=i2+1;t<=jiedeweishu;t++)
	{
		xiabiao.r(i)=t;
		i++;
	}
	for(i=0;i<jiedeweishu;i++)
	{
		child.geti[i]=zuobianjie[i]+childtemp.geti[int(xiabiao.r(i+1)-1)]*(youbianjie[i]-zuobianjie[i]);
	}
	mubiaohanshu(child);
}
void jiaocha()
{	
	Mm pipei;
	pipei=zeros(1,zhongqunshu1);
	pipei=randperm(zhongqunshu1);
	int x,row,col,linyu[4],maxhao;
	individual fu1,fu2,max;
	for(int i=0;i<zhongqunshu1;i++)
	{
		x=pipei.r(i+1);	
		max=nowpop[x-1];
		maxhao=x-1;
		row=floor((x-1)/ac);
		col=(x-1)%(ac);
		if(row==0)
		{
			linyu[0]=ar-1;
		}
		else
			linyu[0]=row-1;
		if(col==0)
		{
			linyu[1]=ac-1;
		}
		else
			linyu[1]=col-1;
		if(row==ar-1)
			linyu[2]=0;
		else
			linyu[2]=row+1;
		if(col==ac-1)
			linyu[3]=0;
		else
			linyu[3]=col+1;
		if(nowpop[linyu[0]*ac+col].shiyingdu>max.shiyingdu)
		{
			max=nowpop[linyu[0]*ac+col];
			maxhao=linyu[0]*ac+col;
		}
		if(nowpop[linyu[2]*ac+col].shiyingdu>max.shiyingdu)
		{
			max=nowpop[linyu[2]*ac+col];
			maxhao=linyu[2]*ac+col;
		}
		if(nowpop[row*ac+linyu[1]].shiyingdu>max.shiyingdu)
		{
			max=nowpop[row*ac+linyu[1]];
			maxhao=row*ac+linyu[1];
		}
		if(nowpop[row*ac+linyu[3]].shiyingdu>max.shiyingdu)
		{
			max=nowpop[row*ac+linyu[3]];
			maxhao=row*ac+linyu[3];
		}
		fu1=nowpop[x-1];
		fu2=nowpop[maxhao];
		crossover(fu1,fu2,nowpop[x-1],nowpop[maxhao]);
	}

}
void xuexi(individual &student)
{
	individual snowpop[szhongqun],jingying;
	int i,j;
	sgen=0;
	for(i=0;i<jiedeweishu;i++)
	{
		jingying.geti[i]=0;
	}
      	jingying.fitness=0;
	    jingying.shiyingdu=shiyingduchushizhi;
	for(i=0;i<szhongqun-1;i++)
	{
		for(j=0;j<jiedeweishu;j++)
		{
			snowpop[i].geti[j]=student.geti[j]*(1-sR+ran1(a)*(2*sR));
			if(snowpop[i].geti[j]>youbianjie[j])
				snowpop[i].geti[j]=youbianjie[j];
			if(snowpop[i].geti[j]<zuobianjie[j])
				snowpop[i].geti[j]=zuobianjie[j];
		}
	}
	snowpop[i]=student;
	for(i=0;i<szhongqun-1;i++)
		mubiaohanshu(snowpop[i]);
	sjingyingbaoliu(jingying,snowpop);
	for(sgen=0;sgen<smaxgen;sgen++)
	{
		sgeneration(snowpop,jingying);
	}
	student=jingying;
}
void sjingyingbaoliu(individual &jingying,individual *snowpop)
{
	individual max=snowpop[0];
	for(int i=1;i<szhongqun;i++)
	{
		if(max.shiyingdu<snowpop[i].shiyingdu)
		{
			max=snowpop[i];
		}
	}
	if(max.shiyingdu>jingying.shiyingdu)
	{
		jingying=max;//如果最优个体的shiyingdu比当代最大的shiyingdu小则用当代的代替之
	}
	else
		snowpop[rnd(0,(szhongqun-1))]=jingying;//否则的话从当代中随机挑选一个用最优个体代替之
}
void sgeneration(individual *snowpop,individual &jingying)
{
	int i;
	Mm pipei;
	pipei=randperm(szhongqun);
	int x,row,col,linyu[4],maxhao,panduan=0;
	individual fu1,fu2,max;
	for( i=0;i<szhongqun;i++)
	{
		x=pipei.r(i+1);	
		max=snowpop[x-1];
		maxhao=x-1;
		row=floor((x-1)/3);
		col=(x-1)%(3);
		if(row==0)
		{
			linyu[0]=3-1;
		}
		else
			linyu[0]=row-1;
		if(col==0)
		{
			linyu[1]=3-1;
		}
		else
			linyu[1]=col-1;
		if(row==3-1)
			linyu[2]=0;
		else
			linyu[2]=row+1;
		if(col==3-1)
			linyu[3]=0;
		else
			linyu[3]=col+1;
		if(snowpop[linyu[0]*3+col].shiyingdu>max.shiyingdu)
		{
			max=snowpop[linyu[0]*3+col];
			maxhao=linyu[0]*3+col;
			panduan=1;
		}
		if(snowpop[linyu[2]*3+col].shiyingdu>max.shiyingdu)
		{
			max=snowpop[linyu[2]*3+col];
			maxhao=linyu[2]*3+col;
			panduan=1;
		}
		if(snowpop[row*3+linyu[1]].shiyingdu>max.shiyingdu)
		{
			max=snowpop[row*3+linyu[1]];
			maxhao=row*3+linyu[1];
			panduan=1;
		}
		if(snowpop[row*3+linyu[3]].shiyingdu>max.shiyingdu)
		{
			max=snowpop[row*3+linyu[3]];
			maxhao=row*3+linyu[3];
			panduan=1;
		}
		fu1=snowpop[x-1];
		fu2=snowpop[maxhao];
		if(panduan!=0)
		{
			if(ran1(a)>=0.5)
			{
				kantan(fu1,fu2,snowpop[x-1]);
			}
			else
				kaicai(fu1,fu2,snowpop[x-1]);
		}
	}
	//for(i=0;i<szhongqun;i++)
	//	mubiaohanshu(snowpop[i]);
	for(i=0;i<szhongqun;i++)
	{
		if(ran1(a)<spm)
		{
			sbianyi(snowpop[i]);
		}
	}
	sjingyingbaoliu(jingying,snowpop);
}
void sbianyi(individual &child)
{
	int jj=0;
	for(jj=0;jj<jiedeweishu;jj++)
	{
		if(ran1(a)<spm)
		{
			double alpha;
			alpha=ran1(a);
			if(alpha>=1/jiedeweishu)
			{
				child.geti[jj]=child.geti[jj]+double(gasdev(a)/sqrt(gen));
			}
			if(child.geti[jj]>youbianjie[jj])
			{
				child.geti[jj]=youbianjie[jj];
			}
			if(child.geti[jj]<zuobianjie[jj])
			{
				child.geti[jj]=zuobianjie[jj];
			}
		}
	}
	mubiaohanshu(child);
}
void gamain()
{
	initialize();
	int i;
/*	for(i=0;i<jiedeweishu;i++)
	{
		cout<<zuiyougeti.geti[i]<<",";
	}
	cout<<setiosflags(ios::scientific);
	cout<<"初始最优解:"<<" "<<-zuiyougeti.shiyingdu<<endl;/////////////*/
	//system("pause");////////////////////////////////////
	for(gen=1;gen<maxgen;gen++)
	{	
		generation();
		//cout<<gen<<endl;
		if(-zuiyougeti.shiyingdu<=1e-4)
			break;
	}
	jingyingbaoliu();
	cout<<gen<<endl;
	cout<<setiosflags(ios::scientific);
	/*for(i=0;i<jiedeweishu;i++)
	{
		cout<<setiosflags(ios::fixed)<<setprecision(10)<<zuiyougeti.geti[i]<<",";
	}*/
	cout<<"最优解为:"<<" "<<setiosflags(ios::fixed)<<setprecision(10)<<-(zuiyougeti.shiyingdu)<<endl;////////////////
	delete [] nowpop;
		//system("pause");
}
/*void shengchenggp()
{
	int p=2*jiedeweishu+3;
	while(!prime(p))
	{
		p=p+1;
	}
	//cout<<p<<endl;
	//system("pause");
	for(int i=0;i<jiedeweishu;i++)
	{
		double j=(double)(2.0*PI*(i+1)/p);
		gp[0].gpp[i]=2*cos(j);
	}
	for(i=1;i<houdaishuliang;i++)
	{
		for(int j=0;j<jiedeweishu;j++)
		{
			gp[i].gpp[j]=(i+1)*gp[0].gpp[j];
			if(gp[i].gpp[j]>1)
			{
				gp[i].gpp[j]=gp[i].gpp[j]-floor(gp[i].gpp[j]);
			}
		}
		
	}
}
int prime(int n)
{
	int y;
	Mm m;
	initM(MATCOM_VERSION);
    m = isprime(n); 
    exitM();
	y=m.r(1);
	return y;
}*/
double min(double x,double y)
{
	if(x<=y)
		return x;
	else
		return y;
}
double max(double x,double y)
{
	if(x>=y)
		return x;
	else
		return y;
}

protected:
	int zhongqunshu1,ar,ac,jiedeweishu;
	vector<double> zuobianjie;
	vector<double> youbianjie;
	int lchrom;//染色体长度
	int maxgen;//最大遗传代数 
	int gen;//遗传代数
	int sgen;
	individual zuiyougeti;//精英保存策略
	individual *nowpop;//当前代
};

void main()
{
	for(int i=0;i<jieweishu;i++)
	{
		zuo.push_back(-5.12);
		you.push_back(5.12);
	}
	for(i=0;i<50;i++)
	{
	GA ga(2500);
	ga.gamain();
	}
	cout<<endl;
	cout<<jishuqi<<endl;
	cout<<jishuqi/50<<endl;
	/*jieweishu=4;
	GA ga1(100);
	for(i=0;i<jieweishu;i++)
	{
		zuo.push_back(-1);
		you.push_back(1);
	}
	ga1.gamain();*/
	
}

⌨️ 快捷键说明

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