关于量子遗传算法(QGA)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于量子遗传算法的杂七杂八
遗传算法确实太有名了,无论是数学建模的培训中还是机器学习的项目中,经常性能看到遗传算法(GA)活跃的身影,其用途十分广泛,而且MATLAB或者是Python的实现遗传算法功能的工具箱也很多,笔者就一度使用北卡罗莱纳大学提供的免费工具箱实现了对于BP神经网络的初始化权值与阈值的优化,效果十分不错,而且实现起来不那么费劲,所以还是挺受好评的,对于写毕业论文的同志而言,如果实在不知道强行套用第三方算法对于原本的算法进行升级该怎么做,有两个万金油组合,一个是AHP,另一个就是几乎无所不能的GA,当然了,如果需要对于矩阵进行降维操作首选一定是PCA。
1 关于GA算法的种种
1.1简介
顾名思义,学过高中生物的都应该可以理解“遗传”是什么,染色体变异、染色体交叉等术语应该也能够大概知道是什么意思。其实遗传算法主要就是模拟这一个过程。
不过,笔者觉得本算法中的核心部分中的变异与交叉的情节,其实达尔文这个姐控的贡献不是很大,最早提出相关的概念完成了相关的建模的是孟德尔
所谓物竞天择适者生存,这个对于现实生活中的生物适用,对于具有特定含义的矩阵肯定也是适用的,当然了,反映他们到底多么“适应”的函数就是所谓的适应度函数,虽然关于适应度函数的取法现在并没有十分固定的一以贯之的通用公式。相对的,一些套路多有相似之处的算法中的概念也大都没有万用公式,诸如ACA中的营养素函数等,这些算法仍然有待提升,这也是经常能在国内的中文核心期刊上依然能够看到不少惊为天人的论文的原因。因为中国特色——灰色模型、AFSA等算法第一个提出者是中国人。
1.2四个基本概念
遗传算法中,一个基本单位为“个体”,一个种群(系统)中拥有好多个体。每个个体携带两个内容:染色体与适应度。
当然了,这个时候上述的这些概念根本没有机器学习的含义,而全然为生物的含义
或者用生物上的话来说,每一个生物都有染色体,染色体决定了他们表现出来的性状是怎样的。所以说,染色体决定了每一个生物的肥瘦程度。
因此我们建立以下对应关系:
整个牧场对应的是一个种群,在机器学习中可以理解为具有实际项目含义的构成所有矩阵的cluster
一头羊相当于生物钟的一个个体,在机器学习的大背景下可以理解成矩阵,就是MATLAB里面的mat文件
某头羊决定肥瘦程度的染色体也就就是该个体的染色体,在机器学习的大背景下可以理解成mat文件中的某一行或者是某一列。题外话,MATLAB中相当一部分函数在编写的时候不知道是出于怎样的考虑,它们的参数有的时候行跟列的位置竟然是反的,于我们的习惯有很大
的差别。笔者以前去台湾留学过,知道他们的行列的认知习惯与我们大陆地区是相反的,不知道世界上还有哪些国家或者是地区同他们一样。
肥瘦程度对应的是适应度,可以理解成适应度函数的取值,就如同某些动漫中非要将人物的战斗力用数值的形式表现出来的概念差不多,只不过这一次作为开发者的我们站在了上帝视角,当某些个体的某些属性太强的时候,我们可以对他进行削弱或者是增强,而并非以前那样逆来顺受
明确了上面四个基础概念以后,我们就可以引出他们之间的相互关系。
种群中包含了若干个个体,每个个体都拥有两个属性:染色体与适应度。每一次迭代中,种群中的个体数量不变。
1.2.1染色体
其实需要细讲的主要还是染色体。在高中学生物的时候被这个概念折磨,现在继续
染色体是遗传算法与“被求最优解模型”直接相关之处。通常来说一个模型想要求最优解,那么就肯定会存在变量,通过控制变量的值让模型的最终值达到最优。
所以在这里,模型中所有变量就构成了一条染色体。其中每一个变量称之为染色体上的一个基因。给他们赋予一定的机器学习含义,染色体相当于MATLAB的mat文件中的一行或者是一列数据,而基因就是这一行或者是这一列的某个元素
1.2.2适应度函数
正如上文所说,其实适应度函数就是用来评价那个基因的质量高,使用数值的形式反映出来了
1.2.3寻找最优解
对于整个种群,我们假设有N个个体,所以对应的,也就有N条染色体,只不过每个染色体中对应的基因的个数可能不止一个,N个适应度。因此可以写成以下形式
其中每一行都代表着一个个体。经过转置的处理之后也可以理解成是列,在矩阵中这个是没有影响的
在这里假设每个个体的染色体的值各不相同,因此适应度(模型的解)也就各不相同。所以我们就可以从中挑出来最大的适应度,它就是在当前情况下的最优解,但不一定是真正的最大值
1.3遗传算法的流程
可以使用相关的MATLAB工具箱实现遗传算法的所有历程,只不过适应度函数的取法不一定可靠,需要自己手动确认。一次迭代包括以下几个过程,流程之间不强调直接顺序:
1、染色体变异。即改变某个染色体的值;
2、染色体交叉。任意选择两个染色体交换部分基因;
3、计算适应度。计算每个染色体在当前迭代下对应的适应度。这个往往是基因在进行了对应的复制、变异与交叉之后才能够进行,不过因为变异本身就充满了变数,所以这个适应度的计算并不十分看重发生的时间节点
4、优胜劣汰。选出最劣适应度的染色体,并将其用最优适应度染色体替换。评比的标准自然是适应度函数值
1.4染色体变异
正是由于染色体的变异,生物才会有进化这么一说,当然了,进化不一定是按照开发者理想的方向进行的,可能进化之后情况反倒更加糟糕了,这种个体或者是样本只能因为自身的适应度函数值不高,从而别淘汰掉。
为了少出现那种经过变异之后没有真正的进化,反而情况还大不如前的恶果出现,开发者只能默认执行下面两个约定俗成的规则
适应度越优的个体染色体变化范围越小;
适应度越劣的个体染色体变化范围越大。
其实这样也不能完全的规避出现进化之后情况反而更加恶化的情况,由于本身算法中取随机数的情节,不能完全控制进化的方向,只能尽量去规避,或者是迭代的代际设定的很高,这样可以降低一点风险
1.5染色体的交叉
这个流程不如上一个突变的流程那么重要,但是不可缺少,它存在的意义在于可以在相当的程度上使得更好的基因拥有更大的概率为广大的染色体(机器学习中就是对应的行向量或者是列向量)保留优良的基因,这样能够加快升级的速度。
染色体交叉比较容易,随机选择两个染色体,在随机选择一对节点,相互交换对应的值即可。
这个在相关的MATLAB工具箱中实现的手法不一定一致,比较主流的实现手法是先对于mat 文件进行必要的编码,然后将编码中二二进行交换,当然了,工具箱是开源的,所以可能对于交叉的概率进行再次的设定,往往其概率的设定会偏大,当然了,本身为了降低迭代的代际,需要将变异的概率设定的大一点,但是往往不会超过交叉的概率
1.6适应度函数
计算适应度就是将每个个体的染色体带入到模型中进行计算,计算出来其对应的适应度。单纯的初中数学,没有什么好说的
1.7优胜劣汰
为了让我们种群的适应度函数的取值整体水平上升,我们必须杀死排名最后的那个个体。当然了,根据克摩洛哥莫夫定理,适应度函数的取值的均值虽然也是上升的,但是整体的数值的取值一定也是服从正态分布的