启发式算法
启发式算法:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计
用途
- 一般用于解决NP-hard问题,其中NP是指非确定性多项式
常用的算法有:模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN) - NP Hard问题,可行时间内在各空间中找到全局最优解的可能性很小,需要使用近似算法(Approximate Method)在有限时间内寻找一个近似最优解
近似方法
- 近似方法分成:近似算法 和 启发式算法
近似算法,可以得到一个有质量保证的解,而启发式算法可以在可行时间内找到一个相对比较好的解,但对解的质量没有保证
遗传算法
- 通过模拟自然进化过程(达尔文生物进化论)搜索最优解的方法,遗传操作包括:选择、交叉和变异。
- 通过参数编码、初始群体的设定、适应度函数、遗传操作设计、控制参数设定以一种群体中的所有个体为对象,利用随机化技术指导对一个被编码的参数空间进行高效搜索
- 直接对结构对象进行操作,不存在求导和函数连续性的限定
具有内在的隐并行性和更好的全局寻优能力 - 采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向
遗传算法应用
相比二进制编码的暴力穷举,遗传算法属于运筹学
染色体交叉
两个相互配对的染色体按某种方式相互交换其部分基因,从而形成两个新的个体。
- 单点交叉
- 两点交叉与多点交叉
- 均匀交叉
- 算术交叉
基因突变
- 基本位变异,对个体编码串中以变异概率、随机指定的某一位或某几位仅因座上的值做变异运算。
- 均匀变异,用符合某一范围内均匀分布的随机数,以某一较小的概率替换个体编码串中各个基因位上的原有基因值
- 边界变异,随机的取基因座上的两个对应边界基因值之一去替代原有基因值
- 非均匀变异:对原有的基因值做一随机扰动,以扰动后的结果作为变异后的新基因值
- 高斯近似变异:进行变异操作时用符号均值为P的平均值,方差为P平方的正态分布的一个随机数来替换原有的基因值
工具
-
scikit-opt算法工具:
-
算法库,对遗传算法、粒子群算法、模拟退火、蚁群算法较好的封装 文档:https://scikit-opt.github.io/scikit-opt/#/zh/ pip install scikit-opt from sko.GA import GA, GA_TSP
-
Geatpy工具:
-
一个高性能实用的Python遗传算法工具箱,提供一个面向对象的进化算法框架 提供了遗传和进化算法相关算子的库函数,如初始化种群、选择、交叉、变异、重插入、多目标优化非支配排序等,并且提供进化算法模板来实现多样化的进化算法
遗传算法与神经网络
遗传算法是一种最优化的算法,可以参与网络参数的学习,网络结构的设计等
网络参数学习
假设神经网络有100个随机权重集合,评估对应每个权重集合的神经网络。基于评估,只保留最佳的20个权重集合,然后从这20个集合中进行随机选择,取代剩余的80个权重集合(应用简单的交叉和突变)
网络结构学习
增强拓扑神经演化(Neuroevolution of Augmenting Topologies,NEAT)是一种基于遗传算法演化新型神经网络的方法
http://www.cs.ucf.edu/~kstanley/neat.html
案例练习
自动钻孔机路线规划