遗传算法

接下来另一种局部搜索——局部束搜索

1.前面讲的爬山搜索和模拟退火搜索,都是只保存一个当前状态,而局部树搜索是保存k个当前状态,那么使得搜索的力度更大。就相当于有k个人同时出发去爬山,那么谁爬到最高峰,把这个最高峰返回去作为问题的解。所以它是同时保存k个状态而不是一个状态,然后让这个k个状态,当然一开始是从这随机产生的k个状态开始,然后每一次迭代的时候让这k个状态每一个都产生自己的后续,所以它一下就能产生很多后续,然后从这k个状态产生的所有后续里去看,如果有任何一个新产生的状态是目标状态它就停止了。所以它就相当于k个人在同时搜索一样,否则就从k个状态产生的所有后续里选择k个最好的后续继续搜索迭代。所以这里大家可以看的出来,任何时候都只储存k 个当前状态,每一次都是让这k个状态去搜索,如果搜索到是目标状态就停止,否则又从中选择k个最好的作为k个新的当前状态,继续往下搜索,所以这个是局部束搜索的一个思想。
这里写图片描述

2.那么我们来看一下局部束搜索里的一个特定算法叫做遗传算法,这个遗传算法是从生物进化理论里得到的思想,也就是说它模仿的是生物进化。
这是什么意思呢?

因为前面我们讲过的搜索算法,它的后续状态都是一个状态产生的,而遗传算法是通过结合两个状态来产生后续状态。打个比方说前面的几个算法都是无性繁殖,就是自己产生自己的后代,那么遗传算法有点类似于有性繁殖,就是它要结合两个状态来产生后续状态,就是有一个爸爸一个妈妈。那么我们同样的也是从k个随机产生的状态开始,初始状态都是这样子的,那么这k个状态我们也给它取个名字叫做种群,就是相当于一个种群一个population。然后开始之后我们的状态一般都是表示成字符串,这也是为了便于进行生物的模仿,就是表示成一个染色体的样子,那么一般这个字符串都是由0101来表示的,当然你也可以用其他的字符来形成一个字符串,那么一个状态就表示成一个字符串,就相当于一个状态用一个染色体来表示。然后状态的评估函数在遗传算法里面改名叫做适应值函数,这也是为了和生物进化对应起来。一般来说这个适应值函数我们都定义成值越大越好,适者生存。然后它不但通过结合两个状态来产生后续状态,而且产生的后续状态还要进行变异,也就是说它通过选择父母进行交叉遗传产生后代,然后变异来产生新的一代种群,然后不断的进化,不断的迭代下去,直到找到目标状态为止,这就是遗传算法它的思想和刚才讲过的局部束搜索算法不同的地方。
这里写图片描述

3.那我们来看一个特定的例子,就能理解遗传算法是怎么操作的。其实它思想并不复杂,那么大家看到这里,我们用八皇后问题让遗传算法来搜索。
这里写图片描述

1).那么对于八皇后问题我们的遗传算法需要把状态表示成字符串的形式,那么对于八皇后问题这个字符串怎么编,也就是说这个染色体怎么进行编码呢?是这样进行编码的,对于每一种八皇后的摆放位置,也就是说不同的摆放位置对应着不同的状态,这里我们也约定每一列一定要摆放一个,否则状态空间太大了。

2).比如说对应这个摆放位置对应的这个状态,它怎么样用字符串来表示,怎么样进行编码。在遗传算法里这种对状态的表示叫做编码,那么编码是非常非常重要的。那么比如说这里对状态表示编码是这样进行的,每一列皇后在哪一行我们就用这个数字来表示,比如说这一列这个皇后在第六行,我们就用6来表示,这一列这个皇后在第七行就用7来表示,第三列皇后在第二行,第四列皇后在第四行,第五列皇后在第七行,第六列皇后在第五行,第七、八列皇后在第八行,所以我就用67247588来表示这个状态,或者说对这个状态进行编码。那么编码生成的这个字符串就叫对应着这个状态的一个染色体,那么这里的编码用的是1到8,八个数字进行编码,所以它形成的这个字符串是由1到8八个数字构成的。那么这个染色体编码完成了之后,我们来看一下,比如说我的种群大小k我就设置成4,这些都是要程序员设定的这个k,种群多少,这个编码怎么编,都是遗传算法要解决的问题。假设这里的k,我们的种群大小就是四个。一开始初始种群是随机的产生,就是我用1到8,这八个数字随机的产生一个八位字符串来作为一个个体,然后你就随机产生四个这样的字符串来作为一个初始的种群。然后产生这么一个初始的种群之后呢,我们就计算每一个状态的适应值函数。那么这个适应值函数也是要你自己定义的,那么假设我定义的适应值函数是相互攻击不到的皇后对数。那么一般为什么这样定义,不像前面一样相互攻击到的皇后对数呢,是因为适应值函数我一般认为值越大越好,是这个原因才定义成相互攻击不到的皇后对数。我们来计算这个状态它相互攻击不到的皇后对数发现有24对,所以它的适应值函数值是24,然后这个状态相互攻击不到的皇后对数是23,然后它的适应值函数(相互攻击不到的皇后对 数)是20,最后一个是11。

3).然后我们根据适应值函数去挑选个体出来进行繁殖,所以这一步叫做选择,就是类似于我们生物进化里的适者生存。所以有选择的选择父母出来进行繁殖,所以大家看到选择的原则是什么呢,选择的原则是谁的适应值函数大,谁被选中的概率就大,所以这个概率是和它的这个适应值函数成正比的。这个概率怎么算出来呢,24/(24+23+20+11)就可以算出来它的概率是31%,也就是说这个概率和它的适应值函数成正比,算出它们被选中的概率,然后根据这个概率进行随机选择,从这个种群里面随机选择父母出来进行繁殖。假设第一次随机选择到了这一对父母进行繁殖,然后第二次随机选择到了光标所指作为父母进行繁殖,所以这个选择是可以重复选择,完全是按照概率随机选择。那么选择出来了两对父母进行繁殖,为什么只选择两对?原因是因为我们要保持种群的大小不变。所以大家看得选择出第一对父母怎么繁殖,为什么一对父母就可以产生一对后续呢?遗传算法里产生后续的方法用的是交叉遗传的方法,这和生物进化理论里面也是一样的,进行交叉遗传

4).那么交叉遗传是什么意思呢?
就是说我要选择一个交叉点,比如说这里它选择的是第三列到第四列这个地方作为一个交叉点。用第一个父母的前三个327和第二个父母的后五个并在一起产生一个新的后代32748552,那么这就相当于这个染色体里面每一个字符是一个基因。那么通过选择交叉点让父亲的前一段基因和母亲的后一段基因并在一起形成一个新的个体,然后让母亲的前一段基因和父亲的后一段基因并在一起形成一个个体,所以它就会产生两个新的后续,所以这就是它新产生出来的两个后代。同样的道理对于这一对父母也是随机选择一个交叉点,那么随机选择这么一个交叉点,然后同样的父亲的前五位基因和母亲的后三位基因并在一起形成一个儿子,然后母亲的前五位和父亲的后三位并在一起形成一个新的后续,所以它也产生出来两个新的后代,所以这个就是我们的交叉遗传产生出来的四个新的状态。

5).那么这四个新的状态我们还要模仿这个生物进化里的变异,使得这个新的状态有不同于父母的地方。这个变异有一个变异的概率,也是程序员设定的,也就是说你定义一个变异概率,也就是说到底这个个体要不要发生这个变异是由这个概率来随机确定的。然后到底是哪一个基因发生变异,变异成什么样子这是随机的,也就是说变异根据概率选中了你进行变异,然后随机的选择一个基因进行变异,比如它随机选择了这个第六列的皇后进行变异,只要变异的和原来的不一样,原来第六列皇后放在第五行我让它变异成放在第一行,所以这个就是变异完成了。那么这个个体没有被选择变异,然后这个个体被选中变异,然后它随机的选择一 个基因进行变异,他选择的是第三列这个皇后进行变异,然后就把这个皇后从第七行放到第二行去,然后这个个体也被选中了进行变异,变异的话它随机的选择一个变异点就是最后一列,让它变成7,那么交叉遗传完了,变异也完了,这个新的种群就产生了,那么这一轮迭代就结束,就是当前状态已经产生了,也就是说我已经移动到当前状态了,这里就叫做当前种群,这个就是新的当前种群,然后再进行下一轮的迭代。

6).也就是说进行下一轮交叉遗传变异产生新的种群,然后每一次当它产生新的种群,我要去看一下这个新的种群里有没有符合要求的状态,如果有的话迭代结束,没有的话才进行新一轮迭代,使得这个种群不断地向目标状态前进,直到迭代次数到达规定的上限,或者直到当前种群里面包含一个目标状态为止,那么这个就是我们的遗传算法的思想。

所以这里面有很多的东西要自己定义的,这个编码需要自己定义,还有适应值函数,还有就是交叉遗传交叉点的控制,变异的概率,还有这个怎么样选择好一点的父母进行交叉遗传,这些都是对于不同的问题是不一样的,那么这个就是我们的遗传算法思想的一个示例。

4.那么看到这里,这里是用图片的形式告诉你交叉遗传是怎样进行的,那么像这个就是一个父亲,这个是一个母亲,那么它的交叉点选择第三列和第四列之间,所以它就相当于这个672和51447结合,然后就会产生一个新的状态67251447。也就是前三列皇后的摆放位置和父亲相同,然后后五列皇后的摆放位置和母亲相同,所以大家看的出来遗传算法通过结合两个状态来产生新的后续,那么这个新的后续就会和它们的父母结点有很大的不同。也就是说其实是这个什么意思呢?这个和前面的单个状态来产生后续状态,它有一个很大的优点就是这里的搜索步伐更快,就是说我这个步子会迈的比较,因为我新产生出来的态可能会和我前面的状态都很不相同。特别是它还会引入变异,那么变异之后后代的状态可能会和前一代种群有很大的不同,很大的不同就意味着你搜索的时候是跳着搜索的。那么它这样搜索的话,就是搜索的速度更快一点,并且也更容易找到全局最值点。也就是说更容易逃离这个局部最值点,因为它这里有很多的不确定性,并且它又是步子迈的很大的搜索方法,所以这是遗传算法的一个优点,就比前面那些单状态产生后续状态的搜索算法要好的地方。

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值