- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于遗传算法求解TSP问题
班级,学号,姓名
摘要:巡回旅行商问题(TSP)是一个组合优化方面的问题,从理论上讲,使用穷举法不但可以求解TSP问题,而且还可以得到最优解。但是,利用穷举法所耗费的时间巨大的,当问题的规模很大时,穷举法的执行效率较低,不能满足及时的需要。
遗传算法是计算机科学人工智能领域中用于解决最优化的一种搜索启发式算法,是进化算法的一种。该算法通过模拟生物学交叉、变异等方式,是当前向最优解的方向进化,因此使用于TSP问题的求解。
关键词:人工智能;TSP问题;遗传算法
本组成员:林志青,韩会雯,赵昊罡
本人分工:掌握遗传算法的基本原理,编写遗传算法中部分匹配交叉、循环交叉和循序交叉的具体实现过程。
1 引言
旅行商问题即TSP问题是一个最优解的求解问题假设有n个城市并且每个城市之间的距离已知则如何只走一遍并获得最短路径为该问题的具体解释
对于TSP问题的解决有穷举法分支限界法等求解方式该文章主要介绍遗传算法求解过程在本质
在遗传算法中交叉操作为主要操作之一包括部分匹配交叉循环交叉和顺序交叉等
部分匹配交叉(PMX):先随机生成两个交叉点,定义这两点间的区域为匹配区域,并交换两个父代的匹配区域。如下图所示
父代A:872?|?130?|?9546?
父代B:983?|?567?|?1420?
交换后
temp?A:?872?|?567?|?9546?
temp?B:?983?|?130?|?1420?
对于?temp?A、tempB中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换。匹配关系:1——5?3——6?7——0
?子代A:802?|?567?|?9143
?子代B:986?|?130?|?5427?
顺序交叉法(OX):从父代A随机选一个编码子串,放到子代A的对应位置;子代A空余的位置从父代B中按B的顺序选取(与己有编码不重复)。同理可得子代B,如下所示:
父代A:?872?|?139?|?0546
?父代B:?983?|?567?|?1420?
交叉过程对于父代A选择
交叉后:?
子代A:?856?|?139?|?7420?
子代B:?821?|?567?|?3904?
循环交叉法(CX):根据父代中的相应位置的基因得到相应的循环因子,该循环因子为子代的一部分,其余的因子从另一个父代中查找,找到不同于循环因子的基因并放到子代的对应位置,形成新的子代。
父代A:1?2?3?4?5?6?7?8?9?
父代B:5?4?6?9?2?3?7?8?1?
交叉过程随机选择一个城市如(5(2(4(9(1,另一子代的处理过程相似
交叉后
用循环的基因构成子代A,顺序与父代A一样?1?2?4?5?9?,用父代B剩余的基因填满子代A:?1?2?6?4?5?3?7?8?9?
3 系统实现
部分匹配交叉:
//先随机产生两个交叉点,定义这两点间的区域为匹配区域,并用交换两个父代的匹配区域。
double rand = Math.random();
if(randpc){
int m = (int)(Math.random()*cityNum);
int n = (int)(Math.random()*cityNum);
while(m==n)
n = (int)(Math.random()*cityNum);
if(mn){
int temp = m;
m = n;
n = temp;
}
int tempA[] = new int[n-m];
int tempB[] = new int[n-m];
for(int e=m;en;e++){
tempA[e-m] = population[a].gene[e];
tempB[e-m] = population[b].gene[e];
}
for(int e=m;en;e++){
population[a].gene[e] = tempB[e-m];
population[b].gene[e] = tempA[e-m];
}
//对于tempA、tempB中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换
for(int e=0;em;e++){
int p;
while((p = Search(population[a].gene[e], tempB))!=-1){ population[a].gene[e] = tempA[p];}
while((p = Search(population[b].gene[e], tempA))!=-1){population[b].gene[e] = tempB[p];}
}
for(int e=n;ecityNum;e++){
int p;
while((p = Search(population[
文档评论(0)