1.问题描述
旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设 有n个城市和距离矩阵D=[dij],其中dij表示 城市i到城市j的距离,i,j=1,2 … n,则问 题是要找出遍访每个城市恰好一次的一条 回路并使其路径长度为最短。

2.算法设计
旅行商问题是一个十分经典的NP难度问题,如果想找到真正的唯一最优的解复杂度是O(N!)的,所以求解这一类问题的策略就是找一个相对最优的解,也就是最优化问题。模拟进化算法就是一种组合优算法,通过模拟生物遗传进化过程来找到最优的种族,也就是TSP中的最短路径。

在这里,我把一条路径作为遗传算法的基因,初始基因序列就是初始路径,最后进化后的得到的基因序列就是找到的最短的路径。把待优化问题的目标函数理解成某生物种群对环境的适应性问题。
本文算法流程图如下所示:

在产生后代时,若既定概率大于交叉概率,则认为这个父样本是强父样本,直接保留下来。交叉时选择父样本1的前半段,然后按顺序在父样本2中找没有在父样本前半段的基因点,把这些基因点按父样本2的顺序加入到子个体中,直到个体的基因长度等于种群基因长度。在基因突变时,生成两个随机数,代表两个基因位置,然后交换这两个位置的值就行了。

3.程序流程
1、根据输入的城市初始化基因序列;
2、计算每个基因序列的适应性,适应性与路径长度成反比(这里我使用路径长度的倒数表示个体适应性);
3、根据个体适应性选择生存下来的个体,也就是根据阈值选择留下来的个体;
4、选择后,个体数小于种群初始个体数,使用轮盘选择方式选择父本;
5、若是选中的父本既定概率大于交叉概率,则直接保留下来,否则通过交叉产生后代
6、后代进行基因突变操作,也就是交换两个节点值;
7、判断是否达到迭代次数,是,结束,返回最优解;否,转到第2步。

4.核心伪代码
本文算法使用python实现:

class Life(object):  #一个生命个体def __init__(self, gene = None):self.gene = geneself.score = -1.0def setScore(self, v):self.score = vfor i in range(0, self.gene_length):  #使用欧式距离表示两个城市距离,也就是个体适应性的倒数for j in range(0,self.gene_length):self.dist_matrix[i*100+j] = math.sqrt((coordinates[i][0]-coordinates[j][0])*(coordinates[i][0]-coordinates[j][0])+(coordinates[i][1]-coordinates[j][1])*(coordinates[i][1]-coordinates[j][1]))def make_life(self): #随机产生新个体lst = list(range(self.gene_length))random.shuffle(lst)
return lst#演化至下一代
def next(self):self.judge()newLives = []newLives.append(Life(self.best.gene)while(len(newLives) < self.life_count):newLives.append(self.bear())self.lives = newLivesself.generation += 1#产生下一代def bear(self):lf1 = self.get_onelife()lf2 = self.get_onelife()# 交叉r = random.random()  #交叉概率if r < self.overlapping_rate:   #交叉概率如果大于既定概率,不然就认为这个样本是强样本,直接留下来gene = self.overlapping_func(lf1, lf2)else:gene = lf1.gener = random.random()if r < self.mutation_rate:    #当变异概率小于初定的概率,则突变gene = self.mutation_func(gene)self.mutation_count += 1  return Life(gene)# 交叉函数def overlapping_func(self, lf1, lf2):p2 = random.randint(1, self.gene_length – 1)g1 = lf2.gene[0:p2] + lf1.geneg11 = []for i in g1:   if i not in g11:g11.append(i)return g11
#变异函数:交换两个位置基因值
def mutation_func(self, gene):p1 = random.randint(0, self.gene_length - 1)p2 = random.randint(0, self.gene_length - 1)while p2 == p1:p2 = random.randint(0, self.gene_length - 1)gene[p1], gene[p2] = gene[p2], gene[p1]gene.append(gene[p2])del gene[p2]return gene

5.代码运行及测试
为了了解不同参数设置对最终路径的影响,本文对不同交叉概率、变异概率以及种群个体数做了不同的实验。这里数据我使用了中国34个省以及自治区、特别行政区的经纬度作为TSP中的34个城市坐标。

5.1 交叉概率:当生命个体数为30,变异概率为0.03时,不同交叉概率的结果如下图1所示,可以看到当交叉概率为0.8时,得到的路径最短。

5.2 不同变异概率:交叉概率为0.8,种群数为30,不同变异概率的路径长度结果如图2所示,可以看到,当变异概率为0.03时,得到的路径最短。

5.3 不同个体数:交叉概率0.8,变异概率为0.03,不同个体数的路径长度如图3所示,可以看到,当种群数目为50 时,得到的路径最短。

5.4 根据迭代次数,路径的收敛图4,这里交叉率为0.8,变异率0.03,个体数50。

5.5 初始路径图(图5),最终路径图(图6)。此时路径长度为168,可以看到初始的路径中有许多重叠的路径,而最终得到的路径已经没有重叠了,也就是找到了最短的路径,在实验的过程中发现不同的参数对整个路径的影响程度还是蛮大的,不同参数的设置可能会使路径长度在的不同在40左右波动,图8的结果只是我的一次结果,可能还会有更好的结果,毕竟我们只是找近似的全局最优解。

使用遗传算法解旅行商问题相关推荐

  1. 人工智能--遗传算法(旅行商问题)

    人工智能是研究使计算机来模拟人的某些思维过程和智能行为(如学习.推理.思考.规划等)的学科,主要包括计算机实现智能的原理.制造类似于人脑智能的计算机,使计算机能实现更高层次的应用.人工智能将涉及到计算 ...

  2. 遗传算法解决旅行商问题(Python版)

    完整代码点这里 遗传算法解决旅行商问题(Python版) 一.问题描述 TSP问题(Travelling Salesman Problem)即旅行商问题,又译为旅行推销员问题.货郎担问题,是数学领域中 ...

  3. 用遗传算法求解旅行商问题

    以下是用遗传算法解决旅行商问题的实验报告 1.问题描述 旅行商问题(Travelling Salesman Problem, 简记TSP,亦称货郎担问题):设有n个城市和距离矩阵D=[dij],其中d ...

  4. 遗传算法解决旅行商问题(TSP)

    遗传算法解决旅行商问题(TSP) 参考文章: (1)遗传算法解决旅行商问题(TSP) (2)https://www.cnblogs.com/studylyn/p/5097238.html 备忘一下.

  5. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1337期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1337期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: ...

  6. 回溯法解旅行商问题java,回溯法解旅行商问题 | 学步园

    第一次编写,格式写的比较混乱.先把源码上来吧.这个源码是模仿教材上的(本人学生一枚 ).分析过程在下面. #include using namespace std; class Traveling{ ...

  7. 【GA TSP】基于matlab遗传算法求解旅行商问题【含Matlab源码 1909期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[GA TSP]基于matlab遗传算法求解旅行商问题[含Matlab源码 1909期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  8. 遗传算法求解旅行商问题

    问题描述 旅行商问题即TSP(traveling salesman problem),也就是求解最短汉密尔顿回路问题. 给定一个图G,要求找一条回路,使得该回路过每个顶点一次且仅一次,并且要让这条路最 ...

  9. 基于Matlab的协同进化遗传算法求解旅行商问题

    旅行商问题(Traveling Salesman Problem,简称TSP问题),即为求解最优化的城市线路组合,要求每个城市都要走且只走一遍,终点城市同出发城市为同一个,最终所走路程需最短.本文在传 ...

最新文章

  1. 数据统计之日活跃用户统计
  2. feign.RetryableException null executing post
  3. Spring MVC 源码-初始化阶段
  4. Jenkins的一些代码
  5. android nio debug模式正常 release包crash_Flutter包大小治理上的探索与实践
  6. 原生Javascript 操作 css类名 - 踩坑篇
  7. DateTime字段控件值显示短格式的做法
  8. (转载)C语言中strlen()返回值类型为无符号数
  9. lintcode-111-爬楼梯
  10. 新扬天电脑所配USB键盘功能键驱动问题注意事项
  11. Java、创建一个文本文件
  12. 从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能
  13. Java获取实体类字段名
  14. 去中心化 分布式 自组织 概念区分与理解
  15. sp3 文件格式说明
  16. pyautogui图形识别-confidence,grayscale
  17. 关于pytorch等环境配置记录
  18. 实验:跨域VPN-OptionC方式-方案一
  19. C语言函数递归调用实验报告,C语言函数的递归和调用实例分析
  20. 对 mysql_init 未定义的引用_解析:以mysql_开始的未定义引用错误

热门文章

  1. Python标准库:turtle库的简单快速入门
  2. go protobuf v1败给了gogo protobuf,那v2呢?
  3. web课程设计网页规划与设计 :网页设计——在线书店(12个页面) HTML+CSS+JavaScript 学生网页课程设计期末作业
  4. java 不可变性_JAVA不可变类(immutable)机制与String的不可变性(推荐)
  5. 低压差线性12V24V36V48V单通道LED线性恒流IC 高精度芯片LED手电筒专用ic方案
  6. sql2005服务和连接的外围应用配置器打不开解决方法
  7. 古典密码之“维吉尼亚密码”
  8. 给你个机会让你坐庄你会怎么玩?——浅谈坐庄和涨停
  9. FTP协议和Samba服务在linux中的应用
  10. Java算法基础:使用递归算法实现,平方相加1^2 + 2^2 + 3^2 +...+ n^2。