概述

遗传算法(英文缩写为GA)算得上是自然人工系统中比较出名的算法了,属于进化算法的一种,在函数极值、生产调度、航空航天、军事等多方面有着广泛的应用。可以这么说,哪里存在问题待优化,哪里就有GA的用武之地。同类中还有蚁群算法、模拟退火和粒子群算法等等。GA最先由密歇根大学的霍兰德和他的同事学生团队提出(博主接触到GA是由于有幸观得梅拉尼·米歇尔的《复杂》一书),其主要思想来源于达尔文进化论自然选择学说,相信各位在高中的时候一定印象很深吧!那么这生物学上的自然演变更替怎么就能与算法牵扯上关系并且还能解决著名的旅行商问题呢?

GA的结构

GA是一种抽象的算法步骤,不存在特定的GA能通用的解决所有的问题,也就是说它具有专一性,即一种GA只能解决某一特定的问题,但所有的GA的步骤都可分为以下五步:

①自定义染色体编码

每一条染色体就意味着一个问题的解,所以我们需要将问题的解编码,编码就是一个数字长串或字符长串都行。例如在求函数极值时我们可以将数字19960610编码成1001100001001001100100010(简单的十进制转二进制即可)。再例如本篇博客的旅行商问题,假若有20个城市,我们给城市A贴上标签1,城市B贴上标签2,依次类推。这样一个长度为20的集合{20 16 13 19 12 18 1 14 3 9 10 6 2 7 5 17 11 15 8 4}即可为旅行商问题中染色体的一种(解)。其排列代表着先后顺序。

②自定义评价函数

染色体编码好了我们该如何评价染色体的优劣的?所以我们必须要根据实际问题自定义一个评价函数。例如在求函数极值时我们可以自然而然把该函数作为评价函数。而在旅行商问题中我们可以把染色体序列按顺序将城市间的距离计算函数当作评价函数。

③模拟染色体交叉互换

正如大部分生物今天能够很好的适应环境全得益于有性生殖一样,我们所编码的染色体要想不断地进化,就必须得对染色体进行模拟交叉互换。这里我只讲解2点交换,(单点交换只有一个交叉点、n点交换n个交叉点):随机抽取两个染色体匹配,随机选择两个交叉点α、β,将这两个染色体的αβ点间的片段互相交换即为后代。

由于在旅行商问题中,如果单纯的染色体交换会导致某些城市的重复或缺失,所以这里我采取在交叉点间进行随机自乱顺序的办法:

④模拟基因突变

基于突变是保持物种多样性的重要原因之一,这里以一定小概率随机发生基因突变:

而在旅行商问题中,我们不能只突变一个点,这样同样会造成某些城市的重复和消失,所以这里我们以小概率随机产生两个突变点,将这两个突变点互换即可

⑤根据评价函数淘汰差的基因型

通过评价函数计算出每个染色体的适应度,再根据适应度来淘汰差的基因型。假设有5个染色体,适应度分别为1、2、3、4、5,以适应度高为选择目标的话则这五个染色体能够生存的概率为1/15,2/15 , 3/15,4/15 , 5/15。
在旅行商问题中,我们以距离最短为目标,所以我们将适应度适当调整为1/distance,这样距离越高,其生存概率越低。

算法流程

算法正确性检验

初代种群染色体适应度的分布


很明显初代种群染色体的适应度满足正态分布,这恰恰验证了我们的模拟很接近自然种群的连续变量性状的分布,正如人类的身高一样。

在自然演替过程中种群染色体适应度的变化


通过初代、5、10、20、25、50、100代的演替我们能明显发现种群的适应度朝着我们的目标方向演替,种群适应度的均值(城市距离和)越来越小。

算法效果图


最终大概在1600代左右进化出了最优值

适应度曲线变化图


通过曲线的变化,我们能发现在演替的开始时进化较明显,随着演替次数的增多,种群适应值趋于稳定

R代码

GA_travel<-function(cities,biomass = 200,n = 100000,mutation = 0.01){sourceCpp(file = 'MyDataMining/Cpp/GA.cpp')ancestor<-c()#初始化种群for (i in 1:biomass)ancestor<-c(ancestor,sample(x = 1:nrow(cities),size = nrow(cities),replace = F))ancestor<-matrix(ancestor,nrow = biomass,byrow = T)best<-ancestor[1,]best_value<-getTotalDistance(cities = cities,seq = ancestor[1,])for (i in 1:n) {#种群n次遗传进化for (k in 1:biomass) {#交叉互换point<-sort(sample(x = 1:nrow(cities),size = 2,replace = F))#随机生成2个交叉点new<-ancestor[k,]#产生新后代new[point[1]:point[2]]<-sample(new[point[1]:point[2]],size = point[2]-point[1]+1,replace = F)#交叉点间乱序ancestor<-rbind(ancestor,new)}for (k in 1:(2*biomass)) {#基于突变rate<-runif(n = 1,min = 0,max = 1)#随机数生成概率if (rate <= mutation) {point<-sort(sample(x = 1:nrow(cities),size = 2,replace = F))#随机生成2个突变点temp<-ancestor[k,point[1]]ancestor[k,point[1]]<-ancestor[k,point[2]]ancestor[k,point[2]]<-temp}}distance<-apply(ancestor, 1, function(x){#计算每个基因的适应度return(getTotalDistance(cities = cities,seq = x))})min<-min(distance)if (min < best_value){best_value<- minbest<-ancestor[which(distance == min),]#最优基因}best<-c(best,best[1])#路径首尾相连plot(cities[best,],type = 'o',main = paste(i,' generation',''),xlab = '',ylab = '')#画出路径ancestor<-ancestor[sample(1:(2*biomass),size = biomass,replace = F,prob = getProb(distance)),]#淘汰差的基因型,维持种群总数}
}

遗传算法GA及其在旅行商问题TSP上的研究相关推荐

  1. MATLAB遗传算法GA求解TSP旅行商问题,可选PMX交叉、OX交叉及其它多种交叉方式,在算法中引入2-opt变异算子

    MATLAB遗传算法GA求解TSP旅行商问题,可选PMX交叉.OX交叉及其它多种交叉方式,在算法中引入2-opt变异算子.进化逆转算子提高算法局部搜索能力,利用国际通用的TSPLIB数据集中的eil5 ...

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

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

  3. 《MATLAB智能算法30个案例》:第22章 蚁群算法的优化计算——旅行商问题(TSP)优化

    @[TOC](<MATLAB智能算法30个案例>:第22章 蚁群算法的优化计算--旅行商问题(TSP)优化) 1. 前言 <MATLAB智能算法30个案例分析>是2011年7月 ...

  4. 粒子群算法求解旅行商问题TSP (JAVA实现)

    粒子群算法求解旅行商问题TSP 写在开头: 最近师妹的结课作业问我,关于使用粒子群求解TSP问题的思路.我想了想,自己去年的作业用的是遗传算法,貌似有些关联,索性给看了看代码.重新学习了一遍粒子群算法 ...

  5. 遗传算法(GA)入门知识梳理(超详细)

    目录 一.遗传算法的生物背景 二.遗传算法(GA)思想 2.1遗传算法的组成 2.2编码 2.3适应度函数 2.4遗传算子 2.4 运行参数 三.基本遗传算法(SGA)伪代码 3.1算法流程图 3.2 ...

  6. c遗传算法的终止条件一般_Matlab2 :Matlab遗传算法(GA)优4~-r-具箱是基于基本操作 联合开发网 - pudn.com...

    Matlab2 所属分类:matlab例程 开发工具:PDF 文件大小:115KB 下载次数:76 上传日期:2007-09-07 20:04:29 上 传 者:钱广 说明:  :Matlab遗传算法 ...

  7. 遗传算法(GA/NSGA)优化神经网络 GA-BP

    查了网上一些论文和代码,自己写了两个版本的GA-BP优化代码(实际应该为EGA-BP),从简到繁,从易到难.该文章代码基于Python3 pytorch进行编写. 版本说明:Part 1 为 利用 G ...

  8. 用遗传算法GA改进CloudSim自带的资源调度策略

    首先理解云计算里,资源调度的含义: 看了很多云计算资源调度和任务调度方面的论文,发现很多情况下这两者的意义是相同的,不知道这两者是同一件事的不同表述还是我没分清吧,任务调度或者资源调度大概就是讲这样一 ...

  9. 【优化算法】遗传算法GA求解混合流水车间调度问题(附C++代码)

    [优化算法]遗传算法GA求解混合流水车间调度问题(附C++代码) 00 前言 各位读者大家好,好久没有介绍算法的推文了,感觉愧对了读者们热爱学习的心灵.于是,今天我们带来了一个神奇的优化算法--遗传算 ...

最新文章

  1. AI 重新定义金融,颠覆投资模式
  2. Android系统SVC命令教程
  3. dubbo学习笔记 第三章简介dubbo的工作原理
  4. String是值传递还是引用传递
  5. 从动力学角度看优化算法:为什么SimSiam不退化?
  6. python 之信号Signal
  7. 学习linux/unix编程方法的建议[转]
  8. 实时计算无线数据分析
  9. 符号标志位.进位标志位_功能标志的成本是多少?
  10. 通过Resource file本地化SharePoint用户界面
  11. android apk 在线分析,Android Apk安装过程解析
  12. 小米笔记本 Air 13.3 黑苹果教程
  13. centos修改mysql数据库密码修改_centos7 mysql 修改数据库密码
  14. 文本居中(内容居中)
  15. 若依前后端分离密码修改成功,登录提示用户名或密码不正确。
  16. 速卖通代运营说:速卖通太难了!2020去做不算晚,但是也绝对不早!
  17. apicloud转uniapp_uni-app,wex5,APPcan,ApiCloud几款国内webapp开发框架的选型对比
  18. 数据中台 第8章 数据资产管理
  19. 如何在线压缩图片大小?图片上传太大怎么缩小?
  20. 微信小程序新手留言板

热门文章

  1. IDEA EasyCode(代码神器)
  2. 一个简单的电梯状态模型
  3. 数据库设计——医药销售管理系统
  4. Ncurses学习经历(二) 编译包含ncurses库函数的程序
  5. 个人认为最完美的css处理div圆角的方法
  6. shell: sh 和ksh的不同
  7. 反编译并修复过的手写识别类--(android 搜狗 libhanwonhw_v15)
  8. 爱情是不是前人栽树后人乘凉?
  9. [shell应用]——打乱文件顺序
  10. jumbo frame介绍