无约束多变量寻优方法——简单遗传算法的实现

对于一个无约束多变量寻优问题:

minf(x),x\in R^n

简单来想可以认为就是在一堆x里面找到使得f(x)最小的那个x,我们把这些x用二进制进行编码,二进制的0和1就是基因,编码后的二进制串就是染色体,也就是一个个体,这一堆x就是一个种群。对这一个种群进行优胜劣汰的“自然选择”,经过好几代之后,这个种群整体就会变得非常“优异”。


第一步:编码并形成初始种群

编码的规则可以表述为下面的两点:

1、根据变量的范围和要求精度确定每一维的编码长度:

比如x_i的范围在[-10,10],要求精度为tol=1e-6,即将区间[-10,10]按照1e-6进行等分,可以分为\frac{10-(-10)}{1e-6}=20000000等分,只要二进制的长度足以表示2\times 10^7个不同的数即可,由于2^{24}<2\times10^7<2^{25},故25位可以达到所要求的精度。

2、将所有维度的编码合成一个长串。

同理将其他维度编为二进制码,之后按照维度次序将其连接在一起构成一个长二进制串,即:

\underbrace{1011\cdots}_{​{x_1}}\underbrace{0100\cdots}_{​{x_2}}\underbrace{1100\cdots}_{​{x_3}}\cdots

编码完成后就可以随机生成所需的个体数形成初始种群。

第二步:解码并计算适应度


由下面的示意图容易知道解码的公式:

无约束多变量寻优方法——简单遗传算法的实现_第1张图片

\frac{x_i-l_i}{r_i-l_i}=\frac{x_{di}-0}{2^{25}-1-0} 

解码后,由于适应度要求越大越好,而此问题为求最小值问题,所以可以将适应度函数设置为目标函数值的相反数

第三步:将种群按照适应度进行排序

排序之后种群中适应度最高的即为种群最后一个个体(或者第一个个体)

第四步:按照轮盘赌进行选择


通过轮盘赌方法选出遗传到下一代的个体。所谓的轮盘赌方法是指,个体被选中的概率和其适应度值成比例,适应度越大,选中的概率越大,但并不是依据个体适应度在整体适应度总和中占的比例,而是根据“累积概率”:

无约束多变量寻优方法——简单遗传算法的实现_第2张图片

第五步:单点交叉

即随机选择一个位置然后交叉(交换)两个“染色体”的后面部分。

第六步:基本位变异

即随机选择一个位置然后将其二进制位取反。

将上述步骤进行循环,经过相当数量的代数之后,最终可以选择出满足精度要求的个体。

此外,该算法有个明显的缺陷就是可能陷入局部最优解。


求函数

的最小值 

无约束多变量寻优方法——简单遗传算法的实现_第3张图片

 其理论值应该为在[1,1]处取得最小值0,而此遗传算法求得的结果是

无约束多变量寻优方法——简单遗传算法的实现_第4张图片

 种群的平均适应度随着代数增加的变化规律:

无约束多变量寻优方法——简单遗传算法的实现_第5张图片

 本次编写的算法有些粗糙,计算结果不是很令人满意,有机会再改进一下。

你可能感兴趣的:(优化方法,matlab,算法)