对于一个无约束多变量寻优问题:
简单来想可以认为就是在一堆里面找到使得
最小的那个
,我们把这些
用二进制进行编码,二进制的0和1就是基因,编码后的二进制串就是染色体,也就是一个个体,这一堆
就是一个种群。对这一个种群进行优胜劣汰的“自然选择”,经过好几代之后,这个种群整体就会变得非常“优异”。
第一步:编码并形成初始种群
编码的规则可以表述为下面的两点:
1、根据变量的范围和要求精度确定每一维的编码长度:
比如的范围在
,要求精度为
,即将区间
按照
进行等分,可以分为
等分,只要二进制的长度足以表示
个不同的数即可,由于
,故25位可以达到所要求的精度。
2、将所有维度的编码合成一个长串。
同理将其他维度编为二进制码,之后按照维度次序将其连接在一起构成一个长二进制串,即:
编码完成后就可以随机生成所需的个体数形成初始种群。
第二步:解码并计算适应度
由下面的示意图容易知道解码的公式:
解码后,由于适应度要求越大越好,而此问题为求最小值问题,所以可以将适应度函数设置为目标函数值的相反数。
第三步:将种群按照适应度进行排序
排序之后种群中适应度最高的即为种群最后一个个体(或者第一个个体)
第四步:按照轮盘赌进行选择
通过轮盘赌方法选出遗传到下一代的个体。所谓的轮盘赌方法是指,个体被选中的概率和其适应度值成比例,适应度越大,选中的概率越大,但并不是依据个体适应度在整体适应度总和中占的比例,而是根据“累积概率”:
第五步:单点交叉
即随机选择一个位置然后交叉(交换)两个“染色体”的后面部分。
第六步:基本位变异
即随机选择一个位置然后将其二进制位取反。
将上述步骤进行循环,经过相当数量的代数之后,最终可以选择出满足精度要求的个体。
此外,该算法有个明显的缺陷就是可能陷入局部最优解。
求函数
的最小值
其理论值应该为在处取得最小值
,而此遗传算法求得的结果是
种群的平均适应度随着代数增加的变化规律:
本次编写的算法有些粗糙,计算结果不是很令人满意,有机会再改进一下。