基因组编码原则
1 遗传算法是对求解问题参数的编码进行操作,而不是参数本身,这就需要遗传算法基于一个有限的字母表,并将最优化问题的的自然产生集编码成有限长度的字符串。(转义成基因,位串的位被称为基因),一个位串称为一个个体(染色体),带有特征的个体的集合组成种群。按照一定规则对参数进行编码称作遗传编码。遗传算法参数编码原则采取最小字母表原则,选择一个是问题得以自然表达的最小字母表进行编码,如二进制编码或者非二进制编码。
题外话:在写注释的时候,怎么做的,固然重要,但更重要的是为什么这样做。
遗传算法的模式理论:模式数量越多遗传效率越好。正因为如此,经常采取二进制编码。
2 适应度函数
选择适应度函数:非负,单值,计算量小,通用性强;适应度函数通常由目标函数变换得到,减少了对目标函数的连续,可微等条件依赖。
为了维持种群的多样性和竞争性,防止适应度搞的个体过度复制,适应度的个体过早淘汰而使有价值的个体得不到繁衍,有必要度适应度进行调整。
线性变换,幂函数变换,指数变换
3 遗传优化过程
遗传算法不是一种盲目的搜索方法,而是一种以适应度函数为目标导向的启发式优化搜索方法
轮盘赌选择法:
流程:
1)检查每一个染色体——观察解决问题的性能——分配适应性分数
2)选出两个成员作为父体
3)根据杂交率(crossover rate)进行杂交
4)根据变异率进行变异
重复上述步骤,直到100个成员的新群体被创建出来。 这样一个的过程被称为世代(或者代 generation)整个循环称为 时代(Epoch)
遗传算法中的随机数问题:
在遗传算法编程中,迭代和随机数都是很常用的做法,但在实际编程中却遇到了很多问题,每次迭代后产生的随机数都一样。这就要求每次都添加一个不同的随机种子,比如一个递增的整数,但我又在想,如果增加了这样的额外条件,而且在写这个整数,如果扩展到多线程,会不会导致争用,或者同样的随机数,而使得产生同样的问题。
刚才写到这里,去VS里面写了个多线程的代码测试了一下,确实会产生不同线程使用同样的随机种子而导致产生的随机数是一样的(但有时候也不会)
(第一个序号是线程号,中间是随机数,后面是随机种子)
遗传算法摆脱了传统算法对问题参数的依赖,如连续,可导,可微等限制,只需要对参数的编码进行操作,减少了问题的复杂性,同时是一种全局搜索算法,避免陷入局部最优解。
参考书籍:《遗传算法及轮盘赌选择的C++实现》