实验报告:遗传算法在解决旅行商问题的应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
变异算子
个体发生变异的概率为参数PMUTATION。当一个个体发生变异时,随机选择序列中一个基因与其相邻基因交换。
其他部分
数据输入为直接读取城市距离矩阵文本,本例中为ctsp.txt;
数据输出格式为:每代的最佳适应度,平均适应度和标准差,最终结果序列和相关参数。文件名galog.txt。
程序结构概要
voidswap(int&,int&);/*交换*/
voidselect(void);/*选择*/
voidcrossover(void);/*交叉*/
voidXover(int,int);/*顺序交叉,由crossover()函数调用*/
voidmutate(void);/*突变*/
voidreport(void);/*报告,用于输出结果数据*/
2)求出该TSP问题的(近似)最短路程;
3)求得相应的城市遍历序列;
4)检查算法收敛性,求解决该问题的(近似)最优遗传参数。ቤተ መጻሕፍቲ ባይዱ
算法分析:
1.算法基本流程
2.编码策略与初始群体设定
TSP的一般编码策略主要有二进制表示、次序表示、路径表示、矩阵表示和边表示等。而路径编码是最直观的方式,以城市序号作为遗传基因。在本实验中,我们用一个N维向量来表示一个个体,N是城市总数,元素表示城市遍历顺序,以最后一个到达的城市为结束。则群体用一个N * POP的矩阵表示,POP为群体中的人口(个体数)。初始群体在空间中自动生成。
voidinitialize(void);/*初始化*/
voidrandpath(genotype >);/*产生随机路径*/
voidevaluate(void);/*计算适应度*/
voidkeep_the_best(void);/*保留最优个体*/
voidelitist(void);/*保留最优个体*/
3.适应度函数及结束条件
适应度函数采用题目的目标函数——路径的总路程(包括回到出发点)。适应度越低,个体越优秀。由于暂时无法先验估计收敛性和目标结果,所以以一个参数,最大遗传代数MAXGEN作为程序结束控制。
4.遗传算子设计
遗传算子的设计方法主要有两大类:自然算法和贪心算法。自然算法是以大自然的进化规律为依据,大体采用“优胜劣汰”的机制来进行遗传;贪心算法则是以迅速收敛为目标,对个体进行更严格的选择和遗传处理。
本次实验的目标问题中国大陆31个大城市的公路旅行商问题,数据来源是《中国大城市公路里程表》(后附)。
需求分析:TSP已经被证明是一个NP—Hard问题,即找不到一种算法能在多项式时间内求得问题的最优解。利用遗传算法,在一定时间内求得近似最优解的可能性比较大。实验目标是:
1)设计用遗传算法解决TSP问题的程序;
遇到的问题
在POPSIZE = 100时,概率为0.05,0.1或是0.2在群体中产生的影响是很小的,但是实验参数的小波动对于实验结果却有很大影响,甚至当MAXGEN = 50000,也无法收敛到接近最优的值,其中的原因涉及遗传算法的一些弱点,仍待深究。
总结
本次实验中,我们实现了用遗传算法解决旅行商问题。实验了遗传算法中算子选择和参数调整对于算法收敛性的影响。
#defineCITYSIZE 31/*城市规模*/
#definePOPSIZE 100/*种群大小*/
#defineMAXGENS 20000/*最大代数*/
#definePXOVER 0.1/*交叉概率*/
#definePMUTATION 0.05/*突变概率*/
doublecitys[CITYSIZE][CITYSIZE];/*城市数据*/
本实验中,为了更好地研究遗传算法的内部原理和收敛性质,我们偏向采用自然算法设计算子。以下是各算子的设计:
选择算子
在遗传个体的选择上,我们先人工保留最优种子,再采用轮盘赌法选择保留一部分个体,用轮盘赌法的理由是在“择优录取”的原则上增加选择的随机性。在轮盘赌过程中,如果按适应度来划分,将导致适应度高的劣质个体被选择的概率更大,于是我们设计了一个变换,用最坏适应度减去该个体的适应度,再进行轮盘赌选择。
实验报告:用遗传算法解决旅行商问题的简单实现
实验目的:编写程序实现用遗传算法解决旅行商问题,研究遗传算法的工作原理和收敛性质。
实验者:
问题描述:TSP是一个具有广泛应用背景和重要理论价值的组合优化难题,TSP问题可以简单的描述为:已知N个城市之间的相互距离.现有一个旅行商必须遍历这N个城市,并且每个城市只能访一次,最后必须返回出发城市。如何安排他对这些城市的访问次序,可使旅行路线的总长度最短?
测试及参数调整
在程序编写阶段,我们使用了10*10(GADATA),11*11(GADATA2),和20*20(GADATA3)的矩阵作为测试数据。由于基因太少,数值太小。在此不作讨论。
对于目标题目的数据,我们固定POPSIZE=100,作了针对交叉概率PXOVER和变异概率PMUTATION的测试,调整这两个参数,然后看相同MAXGEN = 10000之下的收敛状况。因为有随机性存在,每组参数我们都做3次测试,收敛性好的参数组做5次测试,以保证准确性。实验数据记录于testlog.txt。
另外,为了保持群体的“生命力”,我们在选择的同时又引入随机的新个体,与保留的个体进行“杂交”,产生下一代。
交叉算子
我们采用的是Davis等提出顺序交叉、双亲双子遗传的算法。随机选择两个交叉点A、B(0<A<B<N),两个父序列中交叉点之间的部分交叉复制给两个子代,其余部分则按顺序不重复填充到对应子代序列中。遗传中进行交叉操作的概率为参数PXOVER。
遗传算法在解决TSP问题时体现了以下优越性:
1.模块化结构是遗传算法的先天优越性,对于简单的TSP问题,程序编写难度不大,也可以尝试各种不同的算子设计,寻求更优化的程序。
2.容易测试和调整参数,寻找最优解答。
最后我们发现,PXOVER = 0.1,PMUTATION = 0.01,MAXGEN = 20000时所得的解20310km是测试记录中最低的,而且在18000代左右就收敛到该值,比其他参数收敛更快,而且能多次重现,证明这组参数在解决本题目时可作为最佳参数。而20310km是最优解。测试数据分析如图:
个体发生变异的概率为参数PMUTATION。当一个个体发生变异时,随机选择序列中一个基因与其相邻基因交换。
其他部分
数据输入为直接读取城市距离矩阵文本,本例中为ctsp.txt;
数据输出格式为:每代的最佳适应度,平均适应度和标准差,最终结果序列和相关参数。文件名galog.txt。
程序结构概要
voidswap(int&,int&);/*交换*/
voidselect(void);/*选择*/
voidcrossover(void);/*交叉*/
voidXover(int,int);/*顺序交叉,由crossover()函数调用*/
voidmutate(void);/*突变*/
voidreport(void);/*报告,用于输出结果数据*/
2)求出该TSP问题的(近似)最短路程;
3)求得相应的城市遍历序列;
4)检查算法收敛性,求解决该问题的(近似)最优遗传参数。ቤተ መጻሕፍቲ ባይዱ
算法分析:
1.算法基本流程
2.编码策略与初始群体设定
TSP的一般编码策略主要有二进制表示、次序表示、路径表示、矩阵表示和边表示等。而路径编码是最直观的方式,以城市序号作为遗传基因。在本实验中,我们用一个N维向量来表示一个个体,N是城市总数,元素表示城市遍历顺序,以最后一个到达的城市为结束。则群体用一个N * POP的矩阵表示,POP为群体中的人口(个体数)。初始群体在空间中自动生成。
voidinitialize(void);/*初始化*/
voidrandpath(genotype >);/*产生随机路径*/
voidevaluate(void);/*计算适应度*/
voidkeep_the_best(void);/*保留最优个体*/
voidelitist(void);/*保留最优个体*/
3.适应度函数及结束条件
适应度函数采用题目的目标函数——路径的总路程(包括回到出发点)。适应度越低,个体越优秀。由于暂时无法先验估计收敛性和目标结果,所以以一个参数,最大遗传代数MAXGEN作为程序结束控制。
4.遗传算子设计
遗传算子的设计方法主要有两大类:自然算法和贪心算法。自然算法是以大自然的进化规律为依据,大体采用“优胜劣汰”的机制来进行遗传;贪心算法则是以迅速收敛为目标,对个体进行更严格的选择和遗传处理。
本次实验的目标问题中国大陆31个大城市的公路旅行商问题,数据来源是《中国大城市公路里程表》(后附)。
需求分析:TSP已经被证明是一个NP—Hard问题,即找不到一种算法能在多项式时间内求得问题的最优解。利用遗传算法,在一定时间内求得近似最优解的可能性比较大。实验目标是:
1)设计用遗传算法解决TSP问题的程序;
遇到的问题
在POPSIZE = 100时,概率为0.05,0.1或是0.2在群体中产生的影响是很小的,但是实验参数的小波动对于实验结果却有很大影响,甚至当MAXGEN = 50000,也无法收敛到接近最优的值,其中的原因涉及遗传算法的一些弱点,仍待深究。
总结
本次实验中,我们实现了用遗传算法解决旅行商问题。实验了遗传算法中算子选择和参数调整对于算法收敛性的影响。
#defineCITYSIZE 31/*城市规模*/
#definePOPSIZE 100/*种群大小*/
#defineMAXGENS 20000/*最大代数*/
#definePXOVER 0.1/*交叉概率*/
#definePMUTATION 0.05/*突变概率*/
doublecitys[CITYSIZE][CITYSIZE];/*城市数据*/
本实验中,为了更好地研究遗传算法的内部原理和收敛性质,我们偏向采用自然算法设计算子。以下是各算子的设计:
选择算子
在遗传个体的选择上,我们先人工保留最优种子,再采用轮盘赌法选择保留一部分个体,用轮盘赌法的理由是在“择优录取”的原则上增加选择的随机性。在轮盘赌过程中,如果按适应度来划分,将导致适应度高的劣质个体被选择的概率更大,于是我们设计了一个变换,用最坏适应度减去该个体的适应度,再进行轮盘赌选择。
实验报告:用遗传算法解决旅行商问题的简单实现
实验目的:编写程序实现用遗传算法解决旅行商问题,研究遗传算法的工作原理和收敛性质。
实验者:
问题描述:TSP是一个具有广泛应用背景和重要理论价值的组合优化难题,TSP问题可以简单的描述为:已知N个城市之间的相互距离.现有一个旅行商必须遍历这N个城市,并且每个城市只能访一次,最后必须返回出发城市。如何安排他对这些城市的访问次序,可使旅行路线的总长度最短?
测试及参数调整
在程序编写阶段,我们使用了10*10(GADATA),11*11(GADATA2),和20*20(GADATA3)的矩阵作为测试数据。由于基因太少,数值太小。在此不作讨论。
对于目标题目的数据,我们固定POPSIZE=100,作了针对交叉概率PXOVER和变异概率PMUTATION的测试,调整这两个参数,然后看相同MAXGEN = 10000之下的收敛状况。因为有随机性存在,每组参数我们都做3次测试,收敛性好的参数组做5次测试,以保证准确性。实验数据记录于testlog.txt。
另外,为了保持群体的“生命力”,我们在选择的同时又引入随机的新个体,与保留的个体进行“杂交”,产生下一代。
交叉算子
我们采用的是Davis等提出顺序交叉、双亲双子遗传的算法。随机选择两个交叉点A、B(0<A<B<N),两个父序列中交叉点之间的部分交叉复制给两个子代,其余部分则按顺序不重复填充到对应子代序列中。遗传中进行交叉操作的概率为参数PXOVER。
遗传算法在解决TSP问题时体现了以下优越性:
1.模块化结构是遗传算法的先天优越性,对于简单的TSP问题,程序编写难度不大,也可以尝试各种不同的算子设计,寻求更优化的程序。
2.容易测试和调整参数,寻找最优解答。
最后我们发现,PXOVER = 0.1,PMUTATION = 0.01,MAXGEN = 20000时所得的解20310km是测试记录中最低的,而且在18000代左右就收敛到该值,比其他参数收敛更快,而且能多次重现,证明这组参数在解决本题目时可作为最佳参数。而20310km是最优解。测试数据分析如图: