首页 > 编程语言 >遗传算法求TSP问题

遗传算法求TSP问题

时间:2023-02-05 10:01:37浏览次数:64  
标签:选择 参数设置 迭代 交叉 问题 TSP 遗传算法 输入

一、实验内容及目的

本实验以遗传算法为研究对象,分析了遗传算法的选择、交叉、变异过程,采用遗传算法设计并实现了商旅问题求解,解决了商旅问题求解最合适的路径,达到用遗传算法迭代求解的目的。选择、交叉、变异各实现了两种,如交叉有顺序交叉和部分交叉。

二、实验环境

Windows10

开发环境Python 3/Flask

三、实验设计与实现

 

图1软件结构图

图1软件结构图

Flask.py是后端核心代码,里面是遗传算法实现,index.html为首页,即第一次进入网页的页面,进入之后可以进行参数设置,之后点击开始,参数会传到Flask.py中进行解析和算法运行,最终将迭代结果存到result(存储迭代结果图)和result_path(存储最短路径图)在返回给display.html页面显示。

图2系统界面图

 

图2系统界面图

输入种群规模、迭代次数、变异概率、选择比例、交叉概率并选择变异方法、选择个体方法、交叉方法。点击开始即可运行该系统。

具体算法流程图:

 

 

图3核心算法流程图

流程图描述:首先根据参数城市数量和种群规模初始一个城市坐标矩阵的列表并计算城市间的距离存到矩阵,最后生成一个路径矩阵,这样就可以进入下一步计算适应度,每一条路径都有其路径距离值和适应度,接下来一次进行选择,交叉,变异操作,循环往复,直至达到了参数中的迭代次数限制。

选择—轮盘赌:(这里我的算法选出的种群数量不一定就恰好是根据比例算出的数量)

 

图3核心算法流程图 图4轮盘赌流程图

选择—锦标赛:

图5三元锦标赛流程图

交叉—顺序交叉:

1、 选切点X,Y

2、 交换中间部分

3、 从第二个切点Y后第一个基因起列出原顺序,去掉已有基因

4、 从第二个切点Y后第一个位置起,将获得的无重复顺序填入

 

图6顺序交叉动态图

 

图7顺序交叉静态图

交叉—部分交叉:

1、 选切点oop

2、 选取oop到oop+3部分交换(我这里就是三个,你可以做成随机的几个)

3、 判断是否有重复的,若重复则进行映射,保证形成的新一对子代基因无冲突。

图8部分交叉动态图

 

变异—两点交换

1、 随机选取两点

2、 两点进行交换

变异—相邻交换

1、 随机选取一点

2、 和该点的后面点进行交换

适应度函数:经过测试得A取5,B取0效果好,所以实验中直接取了A=5,B=0运行

借鉴了sigmoid函数的形式,并对数据做了最大最小标准化,A、B是人为给定的常系数mean、max、min是种群所有个体的目标函数值的均值、最大值、最小值图像如下A=5,B=0

适应值较大的更容易进入下一代种群中

图9适应度函数算术表达式

 

四、实验结果与测试

表1 遗传算法解决TSP问题的测试用例

测试内容 测试用例 预期结果 实际结果
种群规模 1.不输入
2.输入除数字其他
3.输入整数数字
4.输入小数或者负数
失败
失败
成功
失败
与预期相同
       
迭代次数 5.不输入
6.输入除数字其他
7.输入整数数字
8.输入小数或者负数
失败
失败
成功
失败
与预期相同
变异方法 9.选择两点交换
10.选择相邻交换
成功
成功
与预期相同
选择个体方法 11.选择轮盘赌
12.选择锦标赛
成功
成功
与预期相同
交叉方法 13.选择部分交叉
14.选择顺序交叉
成功
成功
与预期相同
变异概率 15.不输入
16.输入除数字其他
17.输入小于1的小数
18.输入非小于1的小数或者整数
失败
失败
成功
失败
与预期相同
选择比例 19.不输入
20.输入除数字其他
21.输入小于1的小数
22.输入非小于1的小数或者整数
失败
失败
成功
失败
与预期相同
交叉概率 23.不输入
24.输入除数字其他
25.输入小于1的小数
26.输入非小于1的小数或者整数
失败
失败
成功
失败
与预期相同
随机产生多少个城市 27.不输入
28.输入除数字其他
29.输入整数数字
30. 输入小数或者负数
失败
失败
成功
失败
与预期相同

 

图10参数设置图

在上述参数设置好之后,即可开始运行系统,最后产生如图11的迭代结果图,最上面是自己的参数设置和最后生成的最小路径min_dist,图示整体为每次迭代的路径距离,可见随着迭代次数增加,路径距离一直减小最后趋于稳定。图12为用python画的路径图,图中横轴纵轴为城市位置的X,Y坐标。

 

图11 迭代结果图 图12最短路径图

 

接下来重新选择其他参数来运行一下,看一下有没有区别。

图13参数设置图

 

 

图14迭代结果图 图15最短路径图

 

可以从迭代图像看出,参数不同会导致迭代中结果的不同,第一次参数设置的迭代中在前段迭代不稳定,忽上忽下,之后稳定,而第二次参数设置后迭代很快就稳定,没有忽上忽下的现象,所以不同的选择、变异、交叉方法会使迭代结果不同。所以可以根据随机设定让计算机找到最合适的参数设置。

欢迎关注我的知乎平台,我将持续为您解答一系列问题!

标签:选择,参数设置,迭代,交叉,问题,TSP,遗传算法,输入
From: https://www.cnblogs.com/subodong/p/17092880.html

相关文章

  • kubeadm init问题
    1、解析不到对应的主机[WARNINGHostname]:hostname "k8s-master-01" couldnotbereached [WARNINGHostname]:hostname "k8s-master-01":lookupk8s-master-01......
  • 关于clearInterval后重新启动定时器的问题
    假设有这样一个定时器:letauto=setInterval(right,1000)clearInterval(auto)此时如果想重启定时器auto,应当这样写//正确写法auto=setInterval(right,1000)//......
  • 《人工智能:线代方法》 第二部分问题求解 通过搜索进行问题求解(4) 启发式函数
    《人工智能:线代方法》第二部分问题求解通过搜索进行问题求解(4)3.6启发式函数启发式函数h(n)告诉A*从任意结点n到目标结点的最小代价评估值。选择一个好的启发式函数......
  • IDEA中如何利用Maven给JAVA添加第三方库和打包问题
    从今天开始,遇到技术上的问题都会在这里写下来,虽然有可能都是小儿科问题,但是自己成功解决出来,还是很开心的。从很久之前,我就在java导包的过程中遇到问题,他不像python那......
  • #yyds干货盘点# LeetCode程序员面试金典:汉诺塔问题
    题目:在经典汉诺塔问题中,有3根柱子及N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的......
  • Go应用服务疑似内存泄露问题排查
    背景为了保障业务的可用性,增加应用服务请求依赖服务(grpc、http)的熔断降级策略,避免依赖服务不可用的情况下,出现级联服务故障产生雪崩,通过熔断降级尽可能把影响缩放到最小。因......
  • 堆栈区问题
    基本数据类型所对应的引用数据类型基本数据类型中都存放在栈中,引用类型数据在堆中存放,它们的地址存在栈中Object可同一所有数据,包装类的默认值是null整数缓冲......
  • 短路和逻辑与或问题
    逻辑运算符操作的都是boolean类型的变量1、区分逻辑与、短路与:①&与&&的运算结果相同;②当符号左边是true时,&与&&都会执行符号右边的语句;③当符号左边是false时,&......
  • 访问修饰符问题
      访问修饰符是用于控制类、成员方法、属性的被访问权限。`Java`为我们提供了四种服务修饰符,分别是`public`、`protected`、`default`、`private`声明:`default`......
  • 继承细节问题
      extends的意思是“扩展”,子类是父类的扩展Java中只有单继承,没有多继承继承是类和类之间的关系继承关系的两个类,一个是子类,一个是父类子类继承父类的......