智能优化-遗传算法求解TSP问题(离散优化问题)

        ok啊又是我,经典cug小作业,相信开学就要来智能优化、计算机视觉、机器学习了吧,后续我可能会发的先总结一下:

        智能优化 :qt实现ga求解tsp     单目标约束优化(写的依托)      多目标优化(c++手搓NSGA2但是画图qt而nsga2却在vs,鉴定为依托)     

        智能优化课设:matlab platEMO平台实现NSGA2求解多目标约束优化问题(包含静态罚函数、动态罚函数、自适应罚函数(自适应写的依托),CDP即目标与约束分离、CDP的改进)

        机器学习:qt  K-means算法(依托,大作业,但是不建议用,我只是放出来参考,怕老师发现抄袭)

        机器学习课设:weka平台,我自己编写有BP、朴素贝叶斯、决策树、ID3决策树、K近邻、逻辑斯蒂回归,其中BP、朴贝、K近邻是比较好理解的,推荐这3个必做。

        计算机视觉:这个没啥好说的,课内有几道题目我大多都实现了,最后的大作业我会的都写了,不会的就没写,每年的题目可能不同哈。

        视觉课程设计:这个是做自己想做的,同学们做的都不同,我做的是yolov5车牌检测,就是检测图像,圈出图像/视频中的车牌,然后用随机生成的车牌贴上去,美其名曰基于yolov5的车牌隐私保护系统,一眼四处八方各处缝合而成的垃圾东西,总之拿90分就行了,我这个车牌替换已经写好,可以完美贴上去(不是直接把原先的车牌遮住,而是位置、旋转要与原车牌一样),但是我的替换是每一帧换一次,也就是每一帧车牌就要变换一次,变来变去不好看,这个可以改进成只替换一次,这辆车下一帧还是用这个车牌遮挡,建议自己研究,需要目标跟踪。

        ok,以上总结了之后会发的内容,接下来直接开始本文章的主题-tsp问题求解.

请注意:报告不能直接用,里面的截图请自己替换,我截图上去是有附加我本人的名字,然后还要自己改一改报告,统计表格可以自己画。

目录

1、tsp问题介绍

2、遗传算法

2.1 遗传算法详细讲解

2.2 遗传算法流程图

3、测试问题

4、遗传算法c++实现部分

4.1 染色体类

4.2 GA类

4.3 设计与实现两种交叉

交叉1

交叉2

4.4 三种染色体变异方式

变异1

变异2

变异3

4.5 竞标赛算法

5 总结


1、tsp问题介绍

旅行商问题,是数学领域中非常著名的问题。

Tsp问题的解决方法有很多种,若想精确求解,可以使用暴力法、动态规划法,近似可以用贪心法,引入启发机制可以有A*算法等解法,不过当问题规模稍大,求解速度会慢的令人发指,因为搜索空间过大,我们很难暴力搜索出来。

我们可以使用智能优化方法求解tsp问题,如遗传算法、粒子群优化、模拟退火等,不过不一定能求解到最佳。

2、遗传算法

2.1 遗传算法详细讲解

(1)编码

首先遗传算法里的个体,有对问题进行的编码,常见的有二进制编码、实数编码等。

评估编码策略常采用以下3个规范:

a)完备性(completeness):问题空间中的所有点(候选解)都能作为GA空间中的点(染色体)表现。

b)健全性(soundness): GA空间中的染色体能对应所有问题空间中的候选解。

c)非冗余性(nonredundancy):染色体和候选解一一对应。

(2)适应度函数

所谓适应度函数,其实就是为了给每个个体进行评估其优劣性而使用的。在具体应用中,适应度函数的设计要结合求解问题本身的要求而定。适应度函数设计直接影响到遗传算法的性能。

(3)随机初始化

遗传算法开始执行时,应对种群进行随机初始化。

(4)交叉操作

也就是产生后代,选则两个个体来产生后代,交叉操作会对算法收敛到理想解有着非常大的影响,设计一个好的交叉算子有利于我们找到理想解。这一点在后续我会有更详细的演示。

(5)变异操作

变异操作就是产生子代后,可能会发生基因变异。变异操作主要是为了提高种群的随机性,也就是向外搜索的可能。

(6)种群的选择与淘汰

这一步有两个经典的方法:轮盘赌算法与竞标赛算法。

2.2 遗传算法流程图

3、测试问题

        下载网址:https://people.sc.fsu.edu/~jburkardt/datasets/tsp/tsp.html

4、遗传算法c++实现部分

4.1 染色体类

设置一个染色体类,其中包含有基因与适应度,假设有城市1 2 3 4,路线为 3 1 4 2,那么改染色体的基因就应为 3142,而适应度是3到1的长度 + 1到4长度 + 4到2长度。

4.2 GA类

GA类即遗传算法框架,里面包含有一个染色体类的数组、交叉概率、变异概率,还有一个Graph。需要实现一些核心方法,如算法入口、构造函数、交叉、变异。

4.3 设计与实现两种交叉

设计两种交叉操作,之后还要进行多次实验,并以此了解哪种交叉方式更好,说白了就是让报告有东西写有表格列。

交叉1

第一种交叉方法非常简单,首先随机从种群中选取两个不同的个体,分别为父代1、父代2。以n为6的tsp问题为例,设下面是随机选择到的两个父代:

接着我们在父代1中随机产生两个不同的点:

然后我们把这两点间的基因赋予子代:

剩余的位置,从父代2中找并且按顺序放入:

代码略。

交叉2

第二种交叉操作,和值第一个一样,首先随机选取两个不同的父代:

首先,我们从父代1中随机的选取[1, 1+n/2]个数量,对于此n为6的问题,那么就是要随机选取到[1, 4]个,以选3个为例,如下图:

接着我们找到这三个基因在父代2中的位置:

然后我们按照父代2中的顺序,将这几个基因赋予子代

子代还有一半的位置没有基因,我们从父代1中按顺序寻找并放进去:

出2个问题

你能代码实现上面两种交叉方法吗?

如果是你来设计,你会怎么设计呢?

4.4 三种染色体变异方式

变异1

第一种变异操作,从个体中随机选取两个位置,然后将这两个位置之间的基因进行反转操作:

变异2

第二种变异操作则更为简单,随机选取两个位置,然后交换它们即可.

变异3

第三种变异操作,随机选取两个点,然后把后方的点放到前方的的点的位置,前方的点以及其之后的点向后移动.

4.5 竞标赛算法

以NP=60,N=100为例子,我们将N分为10组,那么每组就有10个个体。然后每一组从中挑选出较优秀的6个个体,那10组就挑选出了60个个体进入下一代。这样的好处是:

(1)我们保留了种群中较为优秀的个体。

(2)可能某些组里的个体都较为差劲,但是由于是小组锦标赛而不是大环境淘汰,有一些较差的个体也会得以保留,这样就保证了种群的宽度搜索,有利于避免进入局部最优的清空。

5 总结

代码我就不放了,有需要可以私信我或者下方留言,我会在文章下方发wangpan链接的。

本来是要写一个打开文件读入tsp问题的,但是没时间了,用最笨的方法搞了主界面载入问题。

mainwindow.h/.cpp:主界面  载入问题、绘图页面大小

Graph.h/.cpp:  邻接矩阵

GA.h/.cpp: 遗传算法

tspshowdialog.h/.cpp:绘图页面,展示tsp问题的路径,右上角可以选择查看适应度曲线和选择实验页面

chartshow.h/.cpp:展示适应度曲线的页面

stadialog.h/.cpp:实验页面,临时加的页面,可以使用但是有bug

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值