2020-01-14

大白话讲解遗传算法 (Genetic Algorithm)

用户2617681发表于秘籍酷订阅

258

来源:raochaoxun

链接:http://blog.chinaunix.net/uid-27105712-id-3886077.html

遗传算法(Genetic Algorithm)又叫基因进化算法,或进化算法。属于启发式搜索算法一种,这个算法比较有趣,并且弄明白后很简单,写个100-200行代码就可以实现。在某些场合下简单有效。本文就花一些篇幅,尽量白话方式讲解一下。

首先说一下问题。在我们学校数据结构这门功课的时候,时常会有一些比较经典的问题(而且比较复杂问题)作为学习素材,如八皇后,背包问题,染色问题等等。上面列出的几个问题都可以通过遗传算法去解决。本文列举的问题是TSP(Traveling Salesman Problem)类的问题。

TSP问题实际上是”哈密顿回路问题”中的”哈密顿最短回路问题”.如下图,就是要把下面8个城市不重复的全部走一遍。有点像小时候玩的画笔画游戏,一笔到底不能重复。TSP不光是要求全部走一遍,并且是要求路径最短。就是有可能全部走一遍有很多走法,要找出其中总路程最短的走法。

和这个问题有点相似的是欧拉回路(下图)问题,它不是要求把每个点都走一遍,而是要求把每个边都不重复走一遍(点可以重复),当然欧拉回路不是本算法研究的范畴。

本文会从TSP引申出下面系列问题

1、  TSP问题:要求每个点都遍历到,而且要求每个点只被遍历一次,并且总路程最短。

2、  最短路径问题:要求从城市1 到城市8,找一条最短路径。

3、  遍历m个点,要求找出其距离最短的路线。(如果m=N总数,其实就是问题1了,所以问题1可以看成是问题3的特例 )。

遗传算法的理论是根据达尔文进化论而设计出来的算法: 人类是朝着好的方向(最优解)进化,进化过程中,会自动选择优良基因,淘汰劣等基因。

在上面tsp问题中,一个城市节点可以看成是一个基因,一个最优解就是一条路径,包含若干个点。就类似一条染色体有若干基因组成一样。所以求最短路径问题,可以抽象成求最优染色体的问题。

遗传算法很简单,没有什么分支判断,只有两个大循环,流程大概如下

流程中有几个关键元素:

1、  适度值评估函数。这个函数是算法的关键,就是对这个繁衍出来的后代进行评估打分,是优秀,还是一般,还是很差的畸形儿。用这个函数进行量化。在tsp中,路径越短,分数越高。函数可以可以这样 fitness = 1/total_distance.  或者 fitness = MAX_DISTANCE – total_distance. 不同的计算方法会影响算法的收敛速度,直接影响结果和性能。

2、  选择运算规则: 又称选择算子。对应着达尔文理论中适者生存,也有地方叫着精英主义原则,意思就是只有优秀的人才有更大的几率存活下来,拥有交配权。有权利拥有更多后代,传承下自己血脉基因。和现实中很相像,皇帝权臣遗留下来的子孙后代比较多。选择方法比较多。最常见的是round robin selection 算法,即轮盘赌算法, 这个算法比较简单有效。选择算法目前已有的有10来种之多。各种不同业务可以按需选择。

选择公式如下:

//选择运算---轮盘赌,此算法要求不能有负数.  int32_t Genetic::Selection(Genome & selGenome) {//生成一个随机浮点数//本算法在轮盘赌算法上加上了选择概率,提高最大可行解入围概率doubleftmp = (((random())%100001)/(100000 + 0.0000001));if( ftmp > 0.9 ) { GetBestGenome(selGenome);returnESUCCESS; }//生成一个【0, m_dTotalFitness】之间的随机浮点数doubledRange    = (((random()+ random())%100001)/(100000 + 0.0000001)) * m_dTotalFitness;doubledCursor    = 0.0; size_t i        = 0;for(i = 0; i < m_vGenome.size(); ++i) { dCursor += m_vGenome[i].dFitness;if(dCursor > dRange)  {break; } }  selGenome = m_vGenome[i];returnESUCCESS; }

3、  交叉运算规则:又称交配规则,交叉算子。对应遗传学中的精子和卵子产生的受精卵含有精子的部分基因,也含有卵子的部分基因的现象。就像孩子有点像父亲,又有点像母亲的规律。交叉运算算法更多。作者可以天马行空的自己去想象。只要达到交叉结果中含有父母的基因就可以。最常见的是k-opt 交换。其中k可以是 1,2,3….等等。简称单点交换,两点交换,3点交换等等:

单点交换

其中修复重复基因根据业务需要看是否需要。

两点交换

4、  变异运算规则:又叫变异算子。在人类遗传进化过程中。会发生一些基因突变。这些突变有可能是好的突变,有可能是坏的突变。像癌细胞就是坏的突变。爱因斯坦的大脑估计是好的突变。突变方法也是可以天马行空的自己去发挥创造。

这里讨论一下,为什么要有突变这道流程呢。从人类进化角度来说。人类基因有数十万种,在远古交流比较少的年代。都是部落内部通婚,但是整个部落内部居民可能都缺少某种好的基因,这样无论他们怎么交配,都不会产生好的基因,那么他们需要引入好的基因,于是和其他部落通婚。引入其他自己没有的基因,其实对于这个种群来说这就是一次基因变异。如果是好的变异,那么这个后代就很优秀,结果就是会产生更多子孙,把这个好的变异基因传承下去,如果不是好的变异基因,自然而然会在前面选择算子下淘汰,就是现实生活中的所谓的年幼夭折,痴呆无后,或先天畸形被淘汰,不会传承下去。

从计算机算法角度看:所有的启发式算法无外乎2种手段结合。局域搜索和全域搜索。局域搜索是在邻域范围内找出最优解。对应的是选择算子和交叉算子。在自己部落里面找最优秀的人。如果只有局域搜索的话,就容易陷入局域最优解。算法结果肯定是要找出全域最优解。这就要求跳出局域搜索。我们称之为“创新”。创新就是一次打破常规的突破——就是我们的“变异”算子。

这里拿最短路径路径举例子,求点1到点8之间的最短路径, 初始解是1——2——3——6——8

内变异:所谓内变异就是在自己内部发生变异。严格来说其实不是一种变异。但是它又是一种比较有效的手段。

外变异:外变异是引入创新,突破传统的质的飞跃, 也是启发算法中所谓的全域搜索。下面是充当前基因中引入外部基因(当前集合的补集)。

结尾:遗传算法除了上述这些几个主要算子之外,还有一些细节。如交叉概率pc,变异概率pm,这些虽然都是辅助手段,但是有时候对整个算法结果和性能带来截然不同的效果。这也是启发式算法的一个缺点。参数需要不停的在实践中摸索,没有万能的推荐参数。

还有细心的读者可能发现几个疑问,就是最短路径中变异或交叉结果可能产生无效解,如前面最短路径 1——6——3——2——8.  其中1和6之间根本没有通路。碰到这种情况,可以抛弃这条非法解,重新生成一条随机新解(其实这也是一次变异创新)。或者自己修复成可行解。反正框框在那里。具体手段可以自己天马行空发挥。

另一个比较实际的问题是:在最短路径中并不知道染色体长度是多少,不错。大部分人还是用定长染色体去解决问题,这样性能低下。算法不直观。这时候可以使用变长染色体来解决。其实我建议不管何种情况,都设计变长染色体模式。因为定长也是变长的一种特例。使用变长可以解决任何问题。不管是tsp还是最短路径问题。

还有一个编解码问题,就是把现实问题转换成基因,这些问题都比较容易解决,最简单的就是直接用数组下标表示。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 词(小调)榜 第一 蝶戀花•戲作•論己之詞 / 王少軒(流觞诗刊) 自遣新詞多少事。縷縷愁煙,依舊無終始。數筆難拋...
    张成昱阅读 306评论 0 6
  • JS请求跨域问题及URL的结构分析 1.URL结构分析 以下面地址为例: http://www.aespxfa...
    IT码农锋阅读 220评论 0 0
  • 一丝 一谈 一想 一念 马蹄踏踏终究掩不住黄沙 铜镜冷冷却是盖不住芳华
    谢哒哒阅读 115评论 2 1
  • 今天忙碌了一天,早晨8点的火车赶赴上海,处理完事情坐下午的4点半的火车又赶回家,在这短短的一天的时间我来回...
    幽兰依依阅读 111评论 0 0
  • 新装MySQL的用户很容易遇到这个ERROR 2002 (HY000): Can't connect to loc...
    别瞄我阅读 21,996评论 1 3