TSP问题简介: 旅行商问题,即TSP问题(Traveling Salesman Problem)是数学领域中著名问题之一。假设有一个旅行商人要拜访N个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP问题是一个NPC问题,即为在最坏的情况下的时间复杂度随着问题规模的增大按指数方式增长。 这里使用遗传算法(GA)来解决这个问题 **问题描述:**已知N个城市之间相互的距离,某一旅行商从某个城市出发访问每个城市一次且仅访问一次,最后回到出发城市,如何安排才使其所走路线最短,实质上就是寻找一条最短的路径能够遍历N个城市。 问题介绍: 这里通过给定十四个城市的坐标来寻找一条最短路径 算法流程: 使用遗传算法实现:
- 编码
采用整数排列的方式,对于本案例中十四个城市的TSP问题,将染色体分别十四段,每一段对应一个城市的编号,例如对十个城市的TSP问题{1,2,3,4,5,6,7,8,9,10},则|1|2|3|5|7|4|10|8|9|6|8|是一个合法的染色体。
- 种群初始化
在完成染色体编码以后,必须产生一个初始种群作为起始种群解,所以首先需要决定初始化种群的数目一般根据经验得到,一般情况下种群的数量视城市规模的大小而确定,其取值在50~200之间浮动
- 适应度函数
设|k1|k2|……|kn|为一个采用整数编码的染色体,Dkikj为城市ki到城市kj的距离,则该个体的适应度为 即为恰好走完n个城市,再回到出发城市的距离的倒数。优化目标是选择适应度值尽可能大的染色体,这样也就是走的距离短的染色体,这样的染色体更好。
- 选择操作即从旧群体中以一定概率选择个体到新群体中,个体被选中的概率跟适应度值有关,个体适应度越大,被选中的概率越高
- 交叉操作
采用部分映射杂交,确定交叉操作的父代,将父代样本两两分组,每组重复一下过程,进行交叉,如r1=4,r2=7 交叉后被交换的位置基因不改变,其他段的基因由于和被交换的段的基因冲突,要采用部分映射的方法消除冲突(利用中间段)消除冲突后的结果为: 、
- 变异操作
变异策略是采取随机选取两个点,将其对换位置。随机产生在[1,10]之间的两个整数r1和r2,确定两个基因后对换两个基因的的位置。 如:
- 进化逆转操作
为改善遗传算法的局部搜索能力,在选择、变异、交叉之后引进连续多次的进化逆转操作。这里的进化是指逆转算子的单方向性,只有经过逆转后,适应度值有提高的才能接受下来,否则逆转无效。 随机战胜两个[1,10]之间的数,将其对应的基因对换位置 如r1=4,r2=7 下面给出MatLab代码: 首先给出主函数GA_TSP
1 | %遗传算法求解TSP问题 |
结果: 初始种群中的一个随机值: 13—>12—>9—>6—>8—>11—>5—>10—>1—>3—>14—>2—>7—>4—>13 总距离:65.9898 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最优解: 12—>6—>5—>4—>3—>14—>2—>1—>10—>9—>11—>8—>13—>7—>12 总距离:29.3405 随机生成的路径图: 最优结果的路径图: 迭代优化过程: End!