📄 speedtsplocation5.cpp
字号:
// 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 + -