TSP的遗传算法程序实验报告
TSP的遗传算法程序
实验原理
遗传算法的流程如图所示:
二、程序的主要思想
使用C语言实现TSP的遗传算法
根据遗传算法的原理,自定义所需的初始染色体长度、初始群体大小、最大的迭代次数、交叉概率以及变异概率。
初始时生成与染色体长度相同个数的城市,为每个城市随机生成平面坐标,将城市的初始生成的顺序作为初始的路径,即第一条染色体。计算路径中相邻城市之间的距离,并进行保存。
将生成的城市再进行多次的重新排列,得到多条不同的路径,将这些路径作为初始群体里的染色体,计算每条路径的长度。
通过自定义的适应度函数计算染色体的适应度,通过交叉、变异生成新的种群。对新种群继续迭代操作,直到达到初始定义的迭代次数,获得最终的路径及路径图。
三、程序的主要步骤
① 染色体初始化的子函数
void initialize()
{int k,j,minx,miny,maxx,maxy;
initdata();
minx=0;
miny=0;
maxx=0;maxy=0;
for(k=0;k
{x[k]=rand();
if(x[k]>maxx)maxx=x[k];
if(x[k]
y[k]=rand();
if(y[k]>maxy)maxy=y[k];
if(y[k]
}
if((maxx-minx)>(maxy-miny))
{maxxy=maxx-minx;}
else {maxxy=maxy-miny;}
maxdd=0.0;
for(k=0;k
for(j=0;j
{dd[k*lchrom+j]=hypot(x[k]-x[j],y[k]-y[j]);
if(maxdd
}
refpd=dd[lchrom-1];
for(k=0;k
refpd=refpd+dd[k*lchrom+k+2];
for(j=0;j
dd[j*lchrom+j]=4.0*maxdd;
ff=(0.765*maxxy*pow(lchrom,0.5));
minpp=0;
min=dd[lchrom-1];
for(j=0;j
{if(dd[lchrom*j+lchrom-1]
{min=dd[lchrom*j+lchrom-1];
minpp=j;
}
}
initpop();
statistics(oldpop);
initreport();
}
for(k=0;k
{x[k]=rand();
if(x[k]>maxx)maxx=x[k];
if(x[k]
y[k]=rand();
if(y[k]>maxy)maxy=y[k]
if(y[k]
}
此段程序是初始化多个城市的坐标值(x,y),其中(x[k],y[k])代表第k+1个城市的坐标值,也相当于初始染色体的第k+1个基因值。
for(k=0;k
for(j=0;j
{dd[k*lchrom+j]=hypot(x[k]-x[j],y[k]-y[j]);
此段程序是将初始生成的城市的顺序做为第一条路径的顺序,计算路径中相邻点之间的距离。
② 群体初始化的子函数
void initpop()
{unsigned char j1;
unsigned int k5,i1,i2,j,i,k,j2,j3,j4,p5[maxstring];
float f1,f2;
j=0;
for(k=0;k
oldpop[j].chrom[k]=k;
for(k=0;k
p5[k]=oldpop[j].chrom[k];
randomize();
for(;j
{j2=random(lchrom);
for(k=0;k
{j3=random(lchrom);
j4=random(lchrom);
j1=p5[j3];
p5[j3]=p5[j4];
p5[j4]=j1;
}
for(k=0;k
oldpop[j].chrom[k]=p5[k];
}
for(k=0;k
for(j=0;j
dd[k*lchrom+j]=hypot(x[k]-x[j],y[k]-y[j]);
for(j=0;j