计算智能——遗传算法的多维函数优化

一.遗传算法简介

遗传算法(Genetic Algorithm)
遵循适者生存优胜劣汰的原则,是一类借鉴生物界自然选择和自然遗传机制的随机化搜索算法。

遗传算法模拟一个人工种群的进化过程,通过选择(Selection)、交叉(Crossover)以及变异(Mutation)等机制,在每次迭代中都保留一组候选个体,重复此过程,种群经过若干代进化后,理想情况下其适应度达到近似最优的状态。

应用领域
函数优化
生产调度
模式识别
神经网络
自适应控制

二.遗传算法组成

1.编码 -> 创造染色体
2.个体 -> 种群
3.适应度函数
4.遗传算子
5.选择
6.交叉
7.变异

运行参数
1.是否选择精英操作
2.种群大小
3.染色体长度
4.最大迭代次数
5.交叉概率
6.变异概率

2.1编码与解码

实现遗传算法的第一步就是明确对求解问题的编码和解码方式。

对于函数优化问题,一般有两种编码方式,各具优缺点实数编码:

1.直接用实数表示基因,容易理解且不需要解码过程,但容易过早收敛,从而陷入局部最优。

2.二进制编码:稳定性高,种群多样性大,但需要的存储空间大,需要解码且难以理解对于求解函数最大值问题。

下面代码的验证中使用的是二进制编码

这里举例说明二进制编码的解码过程

假设以目标函数 f(x) = x + 10sin(5x) + 7cos(4x), x∈[0,9] 为例

假如设定求解的精度为小数点后4位,可以将x的解空间划分为 (9-0)×(1e+4)=90000个等分。216<90000<217,需要17位二进制数来表示这些解。换句话说,一个解的编码就是一个17位的二进制串。

一开始,这些二进制串是随机生成的。一个这样的二进制串代表一条染色体串,这里染色体串的长度为17。

我们可以采用以下公式来解码:x = 0 + decimal(chromosome)×(9-0)/(2^17-1)

decimal( ): 将二进制数转化为十进制数一般化解码公式:f(x), x∈[lower_bound, upper_bound]
x = lower_bound + decimal(chromosome)×(upper_bound-lower_bound)/(2^chromosome_size-1)
在这里:
lower_bound: 函数定义域的下限
upper_bound: 函数定义域的上限
chromosome_size: 染色体的长度通过上述公式

这样就可以成功地将二进制染色体串解码成[0,9]区间中的十进制实数解。
代码中的解码原理跟这里是一致的只是用的变量不同。

2.2个体与种群

个体
染色体表达了某种特征,这种特征的载体称为个体

种群
例如用编码中的例子目标函数来解决的一元函数最大值求解问题,个体可以用上一节构造的染色体表示,一个个体里有一条染色体。许多这样的个体组成了一个种群,其含义是一个一维点集(x轴上[0,9]的线段)。

2.3适应度函数

适应度函数
遗传算法中,一个个体(解)的好坏用适应度函数值来评价,在本实验中,每个f(x)就是适应度函数。

适应度函数值越大,解的质量越高

适应度函数是遗传算法进化的驱动力,也是进行自然选择的唯一标准,它的设计应结合求解问题本身的要求而定。

2.4遗传算子

遗传算子
因此可以称算子为运算,即通过某种“公式”运算得出一个结果.

我们希望有这样一个种群,它所包含的个体所对应的函数值都很接近于f(x)在[0,9]上的最大值,但是这个种群一开始可能不那么优秀,因为个体的染色体串是随机生成的。

如何让种群变得优秀呢?不断的进化。每一次进化都尽可能保留种群中的优秀个体,淘汰掉不理想的个体,并且在优秀个体之间进行染色体交叉,有些个体还可能出现变异。

种群的每一次进化,都会产生一个最优个体。种群所有世代的最优个体,可能就是函数f(x)最大值对应的定义域中的点。如果种群无休止地进化,那总能找到最好的解。

但实际上,我们的时间有限,通常在得到一个看上去不错的解时,便终止了进化。

对于给定的种群,如何赋予它进化的能力呢?

首先是选择(selection)

选择操作是从前代种群中选择多对较优个体,一对较优个体称之为一对父母,让父母们将它们的基因传递到下一代,直到下一代个体数量达到种群数量上限。

在选择操作前,将种群中个体按照适应度从小到大进行排列。

采用轮盘赌选择方法(当然还有很多别的选择方法),各个个体被选中的概率与其适应度函数值大小成正比。

轮盘赌选择方法具有随机性,在选择的过程中可能会丢掉较好的个体,所以可以使用精英机制,将前代最优个体直接选择。

其次是交叉(crossover)
两个待交叉的不同的染色体(父母)根据交叉概率(cross_rate)按某种方式交换其部分基因。

采用单点交叉法,也可以使用其他交叉方法。

最后是变异(mutation)
染色体按照变异概率(mutate_rate)进行染色体的变异采用单点变异法,也可以使用其他变异方法。

一般来说,交叉概率(cross_rate)比较大,变异概率(mutate_rate)极低

因为遗传算法相信2条优秀的父母染色体交叉更有可能产生优秀的后代,而变异的话产生优秀后代的可能性极低,不过也有存在可能一下就变异出非常优秀的后代。这也是符合自然界生物进化的特征的。

2.5算法流程图

在这里插入图片描述

三.代码实现

以下函数都是可以用来测试函数最优化问题的非凸函数(多维)

且每个函数都已经通过负号调整来求其最大值,即适应度函数越大越好

1.初始化参数

%初始化参数
T=500;%仿真代数
N=80;% 群体规模
pm=0.05;pc=0.8;%交叉变异概率
umax=30;umin=-30;%参数取值范围
L=10;%单个参数字串长度,总编码长度Dim*L
Dim=2;%Dim维空间搜索
bval=round(rand(N,Dim*L));%初始种群,round函数为四舍五入
bestv=-inf;%最优适应度初值
funlabel=2;       %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(funlabel);%画出待优化的函数,只画出二维情况作为可视化输出

2.解码

%迭代开始
for ii=1:T
%解码,计算适应度
    for i=1:N  %对每一代的第i个粒子
        for k=1:Dim
            y(k)=
  • 11
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值