从猴子到人,本来就是一个优化过程。
遗传算法
Part 1 遗传算法的自然界原型
遗传算法根据进化论的思想,模拟了生物界遗传选择和自然淘汰的生物进化过程。
Point 1 从生物遗传谈起
先回想一下生物遗传知识:
- 基因是遗传物质最基本的结构和功能单位
- 基因在染色体上
- 基因是有遗传效应的DNA片段
基因是如何在生物之间遗传的:
- 假设某生物种群有n个个体;
- 其中第n个个体有m个染色体Cn1、Cn2,……,Cnm;
- 第n个个体的第m个染色体上有k个基因Gnm1,Gnm2,……,GnmK,
如下图:
![23745117e752e03afa92dda04fee699c.png](https://i-blog.csdnimg.cn/blog_migrate/69723b7fae5ee0cc5d9ef9b24ef8e416.jpeg)
以P1和P2产生p1的过程为例,它们在繁衍后代的时候,对应的染色体(C11和C21)如两两之间可能发生某些基因的交换,也可能发生某些基因的变异,然后产生新的后代染色体。也就是说后代的染色体是在两个父本染色体的基础上,外加交叉变异的影响得到的。
Point 2 自然选择
从父本产生了新的子代种群后,子代种群不一定能全部存活到产生下一代,环境的适应性和一些意外情况会对它们进行自然选择。总的来说,适应性差的被淘汰的概率就高,适应性强的被淘汰的概率就低。
Point 3 回到我们要解决的问题
在启发式算法中,我们是用多个迭代点并行进行迭代计算的,每一代的所有迭代点构成了一个种群,迭代一次后得到的点就是后代群体。
![2a0759cb9ffe234c3254ec70a63c770b.png](https://i-blog.csdnimg.cn/blog_migrate/ccdaf6eb89bfab5bf436d1b3e2ab751b.jpeg)
对于m维问题,我们可以将每个点的m个坐标分量视为其染色体。
![595c2710bba5f5d372759e6af3d24eaf.png](https://i-blog.csdnimg.cn/blog_migrate/9d038d8734e5aa560d07de4c956e9768.jpeg)
我们可以用编码的方式将m个坐标分量(视为染色体)进行离散化,使离散后的各个元素所为每个坐标分量的基因。
![40842f6c9a9264a56b8d640a786ca055.png](https://i-blog.csdnimg.cn/blog_migrate/342697aea7820a634820241e860d3b86.jpeg)
一个群里中的两个迭代点繁衍后代时,对应的坐标分量(视为染色体)中的离散元素(基因)相互交叉,基因变异后组成新的坐标分量(新染色体),所有的新坐标量可以组成新的迭代点(后代个体),所有的后代个体组成了新的后代群体。
也就是说,我们在优化问题中找到对应的元素,套用自然界中的迭代方法即可,如下图。
![d2f93cf6be9aeff579736b52a7b8705e.png](https://i-blog.csdnimg.cn/blog_migrate/d3e0ef57f3d928d1648443d712f28e33.jpeg)
我们只是对第一个图的左侧的概念进行了对应替换,就得到了遗传算法的迭代思路。
所以我们完全可以模拟生物进化的方式来更新、筛选我们的迭代点。
Part 2 基本遗传算法求解一维问题的实现
本篇中我们仅对简单一维问题的遗传算法作出分析。
由于我们将迭代点的每一个坐标分量视为染色体,所以一维问题中每个迭代点只有一个坐标分量。相当于每个个体只有一个染色体,这就使得上面的问题得以简化,如下图:
![ed77fd36464f632f04405d7d6e6a4d21.png](https://i-blog.csdnimg.cn/blog_migrate/814c7c818f35b197a48468c3224ce4d3.jpeg)
对与一维问题,由于一个个体只有一个染色体,所以许多人写的博客或者专栏里都将一维问题的染色体与个体混为一谈,也没有什么问题。
Point 1 确定个体、种群、染色体
首先我们先创建由
![cce139afc264c99c2ba5ba6e10c79ae1.png](https://i-blog.csdnimg.cn/blog_migrate/9caa87924fa5ce9efaaab015859b5873.jpeg)
Point 2 确定基因:二进制编码
之前我们反复提高了将坐标分量的离散化。
为什么要离散化?
每一个染色体是以更小的单元——基因来参与交叉和变异的,所以需要找到构成染色体的基本元素。
在实际问题中,每一个染色体(坐标分量)都是一个常数,我们很难找到一个常数中更小的元素进行交叉或者变异,所以要对染色体进行离散化(编码)。这里我们介绍二进制编码。
如何实现?
二进制编码的思想是利用二进制数只有0和1组成且位数众多的特点,使用
![be8f9788128ec0f8ce4e42897db8538c.png](https://i-blog.csdnimg.cn/blog_migrate/5b0fb459a45f579e04085aeea165fbbf.jpeg)
那么就要建立实数与二进制数之间的映射关系,也就是说在解空间内找任何一个点,都能在编码空间内找到与之对应的点,这正是因为如此,编码空间里的容量一定大于等于解空间的容量。