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

📄 speedtsplocation5.cpp

📁 c++语言实现的遗传算法的例子,需要的快下啊
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// SpeedTSPLocation5.cpp: implementation of the SpeedTSPLocation5 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SpeedTSPLocation5.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SpeedTSPLocation5::SpeedTSPLocation5(int d,double e1,double e2,double e3,Adaptability * a):SpeedTSP(d,e1,e2,e3)
{
	fitness=(AdaptabilityTSP *)a;
	gProportion=new double *[dimension];
	for(int i=0;i<dimension;i++)
	{
		gProportion[i]=new double[dimension];
		for(int j=0;j<dimension;j++)
			gProportion[i][j]=0;
	}
	GetProportion(gProportion);
}

void SpeedTSPLocation5::NewSpeed(ParticleTSP * * sworm,int i,int pmax,Rand * rand,int gen)
{
	int * * speed=sworm[i]->GetSpeed();				//取当前速度
	int length=sworm[i]->GetSL();					//去速度中对换的个数
//	double * location=sworm[i]->GetLocation();		//取当前位置
//	double * location1=sworm[i]->GetLocation();
	double * i_optim=sworm[i]->GetIOL();			//个体最优解
	double * g_optim=sworm[pmax]->GetIOL();			//全局最优解
//	int * s_location=sworm[i]->GetSS();				//取兑换中有哪些城市
	int * * n_s_location=new int *[dimension];			//新速度中有哪些城市
	for(int j=0;j<dimension;j++)
	{
		n_s_location[j]=new int[2];
		n_s_location[j][0]=-1;							//记录与城市j相连的城市
		n_s_location[j][1]=-1;
	}

	int * * newspeed=new int *[dimension];		//新速度
	for(j=0;j<dimension;j++)					//
		newspeed[j]=new int[2];

	int newlength=0;								//新速度长度初值为0
	int p;										//随机数变量

	double imProportion;

/////////////////////////////////////////////////////////////////////////
/*	FILE * ftemp1=fopen("1.zn","w");

		fprintf(ftemp1,"全局最优位置:");
		for(j=0;j<dimension;j++)
		{
			fprintf(ftemp1,"%f    ",g_optim[j]);
		}
		fprintf(ftemp1,"\n");

		fprintf(ftemp1,"个体最优位置:");
		for(j=0;j<dimension;j++)
		{
			fprintf(ftemp1,"%f    ",i_optim[j]);
		}
		fprintf(ftemp1,"\n");

		fclose(ftemp1);*/
/////////////////////////////////////////////////////////////////////////////
	if(i==0)
	{
		GetMaxProportion(g_optim,&gmProportion);
	}
	GetMaxProportion(i_optim,&imProportion);

/////////////////////////////////////////////////////////////////////////
/*	FILE * ftemp2=fopen("2.zn","w");

		fprintf(ftemp2,"g_paixu:");
		for(j=0;j<dimension;j++)
		{
			fprintf(ftemp2,"%f    ",gProportion[j]);
		}
		fprintf(ftemp2,"\n");

		fprintf(ftemp2,"i_paixu:");
		for(j=0;j<dimension;j++)
		{
			fprintf(ftemp2,"%f    ",iProportion[j]);
		}
		fprintf(ftemp2,"\n");

		fprintf(ftemp,"个体最优位置:");
		for(j=0;j<dimension;j++)
		{
			fprintf(ftemp,"%f    ",i_optim[j]);
		}
		fprintf(ftemp,"\n");

		fclose(ftemp2);*/
/////////////////////////////////////////////////////////////////////////////

	p=rand->randint(dimension*E1);					//从全局最优解中选取
	for(j=0;j<p;j++)
	{
		int p1=SelCity(g_optim,gmProportion,rand);
/////////////
//		fprintf(ftemp2,"%d    ",p1);
/////////////
		if((n_s_location[(int)g_optim[p1]][0]>=0))
		{
			if(n_s_location[(int)g_optim[p1]][1]<0)
			{
				if(n_s_location[(int)g_optim[p1]][0]==(int)g_optim[(p1+1)%dimension])
				{
	//				if(n_s_location[(int)g_optim[p1]][0]!=(int)g_optim[(p1-1+dimension)%dimension])
	//				{
						if(n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][0]==-1)
						{
							n_s_location[(int)g_optim[p1]][1]=(int)g_optim[(p1-1+dimension)%dimension];
							n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][0]=(int)g_optim[p1];
							newspeed[newlength][0]=(int)g_optim[p1];
							newspeed[newlength][1]=(int)g_optim[(p1-1+dimension)%dimension];
							newlength++;
						}
						else
							if(n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][1]==-1)
							{
								n_s_location[(int)g_optim[p1]][1]=(int)g_optim[(p1-1+dimension)%dimension];
								n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][1]=(int)g_optim[p1];
								newspeed[newlength][0]=(int)g_optim[p1];
								newspeed[newlength][1]=(int)g_optim[(p1-1+dimension)%dimension];
								newlength++;
							}
	//				}
				}
				else
				{
					if(n_s_location[(int)g_optim[(p1+1)%dimension]][0]==-1)
					{
						n_s_location[(int)g_optim[p1]][1]=(int)g_optim[(p1+1)%dimension];
						n_s_location[(int)g_optim[(p1+1)%dimension]][0]=(int)g_optim[p1];
						newspeed[newlength][1]=(int)g_optim[p1];
						newspeed[newlength][0]=(int)g_optim[(p1+1)%dimension];
						newlength++;
					}
					else
						if(n_s_location[(int)g_optim[(p1+1)%dimension]][1]==-1)
						{
							n_s_location[(int)g_optim[p1]][1]=(int)g_optim[(p1+1)%dimension];
							n_s_location[(int)g_optim[(p1+1)%dimension]][1]=(int)g_optim[p1];
							newspeed[newlength][1]=(int)g_optim[p1];
							newspeed[newlength][0]=(int)g_optim[(p1+1)%dimension];
							newlength++;
						}
				}
			}
		}
		else
		{
			if(n_s_location[(int)g_optim[(p1+1)%dimension]][0]==-1)
			{
				n_s_location[(int)g_optim[p1]][0]=(int)g_optim[(p1+1)%dimension];
				n_s_location[(int)g_optim[(p1+1)%dimension]][0]=(int)g_optim[p1];
				newspeed[newlength][1]=(int)g_optim[p1];
				newspeed[newlength][0]=(int)g_optim[(p1+1)%dimension];
				newlength++;
			}
			else
			{
				if(n_s_location[(int)g_optim[(p1+1)%dimension]][1]==-1)
				{
					n_s_location[(int)g_optim[p1]][0]=(int)g_optim[(p1+1)%dimension];
					n_s_location[(int)g_optim[(p1+1)%dimension]][1]=(int)g_optim[p1];
					newspeed[newlength][1]=(int)g_optim[p1];
					newspeed[newlength][0]=(int)g_optim[(p1+1)%dimension];
					newlength++;
				}
/*				else
				{
					if(n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][0]==-1)
					{
						n_s_location[(int)g_optim[p1]][0]=(int)g_optim[(p1-1+dimension)%dimension];
						n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][0]=(int)g_optim[p1];
						newspeed[newlength][0]=(int)g_optim[p1];
						newspeed[newlength][1]=(int)g_optim[(p1-1+dimension)%dimension];
						newlength++;
					}
					else
						if(n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][1]==-1)
						{
							n_s_location[(int)g_optim[p1]][0]=(int)g_optim[(p1-1+dimension)%dimension];
							n_s_location[(int)g_optim[(p1-1+dimension)%dimension]][1]=(int)g_optim[p1];
							newspeed[newlength][0]=(int)g_optim[p1];
							newspeed[newlength][1]=(int)g_optim[(p1-1+dimension)%dimension];
							newlength++;
						}
				}*/
			}
		}
	}
	//////////////
//		fprintf(ftemp2,"\n");
//////////////////
	p=rand->randint(dimension*E2);					//从局部最优解中选取
	for(j=0;j<p;j++)
	{
		int p1=SelCity(i_optim,imProportion,rand);
/////////////
//		fprintf(ftemp2,"%d    ",p1);
/////////////
		if((n_s_location[(int)i_optim[p1]][0]>=0))
		{
			if(n_s_location[(int)i_optim[p1]][1]<0)
			{
				if(n_s_location[(int)i_optim[p1]][0]==(int)i_optim[(p1+1)%dimension])
				{
						if(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][0]==-1)
						{
							n_s_location[(int)i_optim[p1]][1]=(int)i_optim[(p1-1+dimension)%dimension];
							n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][0]=(int)i_optim[p1];
							newspeed[newlength][0]=(int)i_optim[p1];
							newspeed[newlength][1]=(int)i_optim[(p1-1+dimension)%dimension];
							newlength++;
						}
						else
							if(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][1]==-1)
							{
								n_s_location[(int)i_optim[p1]][1]=(int)i_optim[(p1-1+dimension)%dimension];
								n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][1]=(int)i_optim[p1];
								newspeed[newlength][0]=(int)i_optim[p1];
								newspeed[newlength][1]=(int)i_optim[(p1-1+dimension)%dimension];
								newlength++;
							}
							else
							{
								int m;
								if(fitness->GetDistance(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][0],(int)i_optim[(p1-1+dimension)%dimension])>fitness->GetDistance(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][1],(int)i_optim[(p1-1+dimension)%dimension]))
									m=0;
								else
									m=1;
								if(fitness->GetDistance(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][m],(int)i_optim[(p1-1+dimension)%dimension])>fitness->GetDistance((int)i_optim[(p1-1+dimension)%dimension],(int)i_optim[p1]))
								{
									for(int k=0;k<newlength;k++)
									{
										if((int)i_optim[(p1-1+dimension)%dimension]==newspeed[k][0])
											if(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][m]==newspeed[k][1])
											{
												newspeed[k][1]=(int)i_optim[(p1-1+dimension)%dimension];
												newspeed[k][0]=(int)i_optim[p1];
												break;
											}
										if((int)i_optim[(p1-1+dimension)%dimension]==newspeed[k][1])
											if(n_s_location[(int)i_optim[(p1-1+dimension)%dimension]][m]==newspeed[k][0])
											{
												newspeed[k][1]=(int)i_optim[(p1-1+dimension)%dimension];
												newspeed[k][0]=(int)i_optim[p1];
												break;
											}
									}
								}
							}
				}
				else
				{
					if(n_s_location[(int)i_optim[(p1+1)%dimension]][0]==-1)
					{
						n_s_location[(int)i_optim[p1]][1]=(int)i_optim[(p1+1)%dimension];
						n_s_location[(int)i_optim[(p1+1)%dimension]][0]=(int)i_optim[p1];
						newspeed[newlength][1]=(int)i_optim[p1];
						newspeed[newlength][0]=(int)i_optim[(p1+1)%dimension];
						newlength++;
					}
					else
						if(n_s_location[(int)i_optim[(p1+1)%dimension]][1]==-1)
						{
							n_s_location[(int)i_optim[p1]][1]=(int)i_optim[(p1+1)%dimension];
							n_s_location[(int)i_optim[(p1+1)%dimension]][1]=(int)i_optim[p1];
							newspeed[newlength][1]=(int)i_optim[p1];
							newspeed[newlength][0]=(int)i_optim[(p1+1)%dimension];
							newlength++;
						}
						else
						{
							int m;
							if(fitness->GetDistance(n_s_location[(int)i_optim[(p1+1)%dimension]][0],(int)i_optim[(p1+1)%dimension])>fitness->GetDistance(n_s_location[(int)i_optim[(p1+1)%dimension]][1],(int)i_optim[(p1+1)%dimension]))
								m=0;
							else
								m=1;
							if(fitness->GetDistance(n_s_location[(int)i_optim[(p1+1)%dimension]][m],(int)i_optim[(p1+1)%dimension])>fitness->GetDistance((int)i_optim[(p1+1)%dimension],(int)i_optim[p1]))
							{
								for(int k=0;k<newlength;k++)
								{
									if((int)i_optim[(p1+1)%dimension]==newspeed[k][0])
										if(n_s_location[(int)i_optim[(p1+1)%dimension]][m]==newspeed[k][1])
										{
											newspeed[k][1]=(int)i_optim[p1];
											break;
										}
									if((int)i_optim[(p1+1)%dimension]==newspeed[k][1])
										if(n_s_location[(int)i_optim[(p1+1)%dimension]][m]==newspeed[k][0])
										{
											newspeed[k][0]=(int)i_optim[p1];
											break;
										}
								}
							}
						}
				}
			}
		}
		else						//当前城市未在速度中出现过
		{
			if(n_s_location[(int)i_optim[(p1+1)%dimension]][0]==-1)
			{
				n_s_location[(int)i_optim[p1]][0]=(int)i_optim[(p1+1)%dimension];
				n_s_location[(int)i_optim[(p1+1)%dimension]][0]=(int)i_optim[p1];
				newspeed[newlength][1]=(int)i_optim[p1];
				newspeed[newlength][0]=(int)i_optim[(p1+1)%dimension];
				newlength++;
			}
			else
			{
				if(n_s_location[(int)i_optim[(p1+1)%dimension]][1]==-1)

⌨️ 快捷键说明

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