使用遗传算法对BP网络权值阈值进行优化
源代码在线查看: 利用遗传算法求解了48个城市的tsp问题(vc++ 代码).txt
利用遗传算法求解了48个城市的TSP问题(VC++ 代码)
在Visual C++ 编译环境下,遗传算法的程序,并利用它们求解了48个城市的TSP问题。~..~
程序说明
由于篇幅有限,且程序中还包括界面实现和计算线程处理等一些与算法无关的代码。为方便阅读,程序清单只介绍实现算法的流程控制函数和一些功能函数,具体的代码可参见源程序。
为了将算法和程序界面分离,程序将算法功能用DLL方式进行封装。遗传算法的源程序分别在[TspGA]和[GAApp]目录中,与算法相关的代码主要在如下三个文件中:
1)gacode.h 算法中所需结构体的定义,包括SYCoordinate、SYCity、SYCityDistance、SYRouter
2) gacode.cpp 算法中所有功能函数的实现,主要包括InitialGA、CountCityDistance、CreateCityRouter2opt、CountTotalDistance、CreateFitnessofPop、SelectPop、CrossoverPop、Crossover、MutationPop、OneIterGACompution等等。后面将分别介绍这些功能函数的作用。
3)MainFrm.cpp流程控制函数的实现,该函数是GACompution。后面将详细介绍该函数的流程。
流程控制函数和功能函数的介绍
流程控制函数GACompution控制循环的迭代和结束,其主要代码如下:
UINT GACompution(LPVOID pParam)
{
int totalgen = GetTotalGeneration(); //获取遗传算法的迭代总代数
int nowiter = 0;
while( nowiter = 0 ) //判断迭代次数是否大于迭代总代数,大于则停止计算
{
nowiter = OneIterGACompution(); //进行一代计算,包括竞争选择、交叉和变异
}
}
下面是一些重要的功能函数的说明:
OneIterGACompution() 最重要的功能函数是,它完成一代的计算,包括竞争选择、交叉和变异,在gacode.cpp中实现,其主要代码如下
int OneIterGACompution()
{
CreateFitnessofPop(FITNESS_MODE); //为每个染色体计算评价函数
SelectPop(); //群体竞争选择
CrossoverPop(CROSSOVER_MODE); //种群交叉
MutationPop(MUTATION_MODE); //种群变异
NowGenNumber++; //当前代数递增
return NowGenNumber;
}
CreateFitnessofPop() 对群体中的每个染色体计算适应函数/评价函数,采用基于序的计算方法。
SelectPop() 轮盘赌方式竞争选择染色体。
Crossover() 两染色体的交叉实现,提供两种交叉方式,分别如下:
1、常规交叉方式,该方式比《现代计算方法》(邢文训等编著)p178给出的"非常规码的常规交配法"稍复杂些。书中只随机选择一个交配位,两个后代交配位之前的基因分别继承双亲的交配位之前的基因。本程序中,是随机选择两个不相同的交配位,后代在这两个交配位之间继承双亲在这两个交配位之间的基因
如 父A 1 2 3 | 4 5 6 7 | 8 9 10
父B 4 7 8 | 3 2 5 9 | 1 6 10
子A 8 3 2 | 4 5 6 7 | 9 1 10
子B 1 4 6 | 3 2 5 9 | 7 8 10
2、贪心交叉方式(Greedy Crossover),具体算法可参见 谢胜利等.求解TSP问题的一种改进的遗传算法. 计算机工程与应用, 2002(8):58~245。
CrossoverPop() 种群交叉。
MutationPop() 种群变异,提供两种变异方式,一是取两个不同的随机数,对这两个数确定的基因区间进行随机排序;二是在染色体的2-opt邻域中随机取出一个染色体。
程序使用方法
程序处理的TSP问题可按用户的具体要求,只需用户依照格式要求提供城市坐标文件即可,坐标文件的格式如下
1 6734 1453
2 2233 10
3 5530 1424
……………
文件的每一行表示一个城市的信息,即,城市名称+空格+X坐标+空格+Y坐标。
点击菜单栏的[文件]-[打开…],可打开指定的城市坐标文件。
指点城市文件打开后,程序会读入文件里的各城市坐标信息,并初始化城市距离矩阵。
点击菜单栏的[文件]-[开始计算],即可进行计算。
城市计算结束后,会在C盘的根目录生成两个文件,一是gacitysfile.txt,它记录了计算得到的最优路径信息;二是gaitersfile.txt,它记录了计算过程中的迭代信息。
可利用作者提供的Matlab的M文件gatspsta.m读取以上两个文件,画出路径优化过程图和求解路径图。
程序算例
程序对48个城市的TSP问题(城市坐标文件对应于48.txt)进行计算,求解路径和最优路径图如下。
48个城市结果,大的红*表示路径开始城市,途经城市依次用蓝色方块和红色*标示,下同。