智能优化算法:求解函数最大值六、遗传算法的一些改进方向

专栏:《智能优化算法》
博客地址:
个性签:顺境不惰,逆境不馁,以心制境,诸事可成。——曾国藩 #
文章目录五、仿真例子:求解函数最大值六、遗传算法的一些改进方向theend…… #
专栏推荐专栏名称专栏地址
硬件安装工程 #
专栏——软件安装工程
#
计算机图形学 #
专栏——计算机图形学 #
操作系统
#
专栏——操作系统 #
硬件检测
#
专栏——软件检测 #
机器学习
专栏——机器学习 #
数据库
专栏——数据库
算法 #
专栏——算法 #
序 #
遗传算法只是一种疗效很棒的智能优化算法,它主要借鉴了自然界中生物进化的思想,辅以优胜劣汰的策略,借助选择、交叉、变异三个过程,对解进行不断的迭代,最终趋于于最优解。 #
一、生物进化 #
提及遗传算法,不得不谈生物进化,由于遗传算法就是模仿生物饲养后人的思想变迁而至的,可以说是一种仿生学的算法。 #
自然选择学说觉得,适者生存,生物想要存活下来,就应当进行生存斗争。生存斗争包括种内、种间以及生物和环境之间的斗争三个方面。 #
在斗争过程中,具备有利变异的个体容易存活下去,而且有更多的机会将有利变异传递给后人;具备不利变异的个体就容易被淘汰,形成后人的机会也就少得多。为此,但凡在生存斗争中取胜的个体都是对环境适应性比较强的个体。达尔文把这些在生存斗争中适者生存,不适者淘汰的过程称作自然选择。1
#
二、遗传算法原理 #
而遗传算法就是借鉴了上述生物进化中的优化策略2023遗传算法流程图,对一个目标问题进行优化的。
#
详细地说,它将问题的解具象成一个编码,许多个编码构成了一个群落,每位编码都对应得到目标问题的一个解,其中依照可行解的目标函数值的不同,定义这个个体的优劣。越强的个体越容易生存下去(选择)2023遗传算法流程图,进行后人的繁衍(交叉、变异),越弱的个体就优先被淘汰。 #
生物进化中的术语遗传算法中的术语 #
群体
#
可行解集
个体
#
可行解 #
染色体 #
可行解的编码 #
基因 #
可行解编码中的一位(1个bit) #
适应度
评价函数值(越高,代表解越好) #
选择
选择操作(例如按照机率进行百家乐赌选择可行解)
#
交叉 #
交叉操作(编码的单点交叉、多点交叉) #
变异
#
变异操作(编码的按位取反)
#
三、遗传算法的特点以决策变量的编码作为运算对象。这些编码的方法对于计算机来求解非常便捷,具备奇特的优越性。遗传算法以目标函数值作为搜索信息,避开了导数。在这些问题中,导数是难以做到的或则很困难做到的。选择、交叉、变异操作包括了这些群体信息。这种信息防止搜索了许多的点,相当于具备一种蕴含的并行性。遗传算法基于几率。随着过程的进化,参数对搜索结果的影响很小很小。具备自组织、自适应、自学习等特点。四、算法详细步骤1.整体步骤初始化;个体评价;选择运算;交叉运算;变异运算;中止条件判定。 #
步骤图如下:
#
2.细节处理Ⅰ.群体规模NPNPNP #
群体规模影响遗传优化的最终结果以及遗传算法的执行效率。通常NP取10~200。 #
Ⅱ.交叉机率PcP_cPc?
#
交叉机率PcP_cPc?控制着交叉操作的速率,较大的速率可以曾倩遗传算法开辟新的搜索区域的能力。 #
Ⅲ.变异机率PmP_mPm?
#
保持群体多样性。通常去0.001~0.1
#
3.遗传运算中止代数GGG
通常视详细问题而定,取值可在100~1000之间。 #
五、仿真例子:求解函数最大值1.题目
#
用标准遗传算法求函数f(x)=x+10sin(5x+7cos(4x)f(x)=x+10sin(5x+7cos(4x)f(x)=x+10sin(5x+7cos(4x)的最大值,其中的取值范围为[0,10][0,10][0,10]。
#
2.剖析
通过画图可知,该函数存在多个局部极值,如右图所示: #
初始化群落NP=50,染色体编码宽度L=20,最大进化代数G=50,交叉机率为Pc=0.8P_c=0.8Pc?=0.8,变异机率为Pm=0.1P_m=0.1Pm?=0.1。形成初始群落,将二补码编码转化成十补码,估算个体适应度值,并进行归一化;选用基于百家乐赌的选择操作、基于机率的交叉和变异操作形成新的群落,并把历朝的最优个体保留在新群落中,进行下一步的遗传操作。判定是否满足中止条件。满足,结束;不满足,继续迭代。3.求解
#
求解代码如下,其中主要思路及较为复杂的点,已在注释中说明。 #
%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
NP=50; %种群数量
L=20; %二进制数串长度
Pc=0.8; %交叉率
Pm=0.1; %变异率
G=100; %最大遗传代数
Xs=10; %上限
Xx=0; %下限
f=randi([0,1],NP,L); %随机获得初始种群
finalMax=0;
finalXBest=0;
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G % 跌代的总代数%%%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%%%%%for i=1:NP % 遍历所有个体U=f(i,:); % 将第 i 个个体读取出来m=0; % 存储的二进制对应的十进制数字for j=1:L % 按位把二进制转化为十进制m=U(j)*2^(j-1)+m;endx(i)=Xx+m*(Xs-Xx)/(2^L-1); % 把十进制数字m转换到对应的定义域内Fit(i)= func1(x(i)); % 计算适应度函数endmaxFit=max(Fit); %最大值minFit=min(Fit); %最小值rr=find(Fit==maxFit); %找出最优个体的下标索引fBest=f(rr(1,1),:); %当代最优个体的二进制编码xBest=x(rr(1,1)); %当代最优个体对应的十进制值if maxFit>finalMaxfinalMax=maxFit;finalXBest=xBest;endFit=(Fit-minFit)/(maxFit-minFit); %归一化适应度值%%%%%%%%%%%%%%%%%%基于轮盘赌的选择操作%%%%%%%%%%%%%%%%%%%sum_Fit=sum(Fit); %对所有个体的适应度进行一个求和fitvalue=Fit./sum_Fit; %让所有个体加起来适应度值为1,便于进行概率计算fitvalue=cumsum(fitvalue); %consum是累加当前索引及以前的索引对应的值,比如[1 2 3],consume后返回[1 3 6]ms=sort(rand(NP,1)); %生成一个NP * 1的向量,并从小到大排序,轮盘赌的关键操作。(均匀分布)fiti=1;newi=1;while newi<=NP % 这个while循环是轮盘赌的精髓,如果适应度(存活概率)越大的个体,随机数越容易连续着比他小if (ms(newi))<fitvalue(fiti) % 优胜个体,多复制几个nf(newi,:)=f(fiti,:); % 复制newi=newi+1; % 新个体计数+1else % 劣汰个体,少复制或者干脆直接跳过去fiti=fiti+1;endend %%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%for i=1:2:NP % 此处步长为2,主要是相邻两个个体进行交叉p=rand; % 生成一个随机数if p<Pc % 以Pc的概率进行交叉q=randi([0,1],1,L);% 随机生成一个交叉序列,0位不变异,1位变异for j=1:Lif q(j)==1 % 交叉的基因,不交叉的基因直接跳过temp=nf(i+1,j);nf(i+1,j)=nf(i,j);nf(i,j)=temp;endendendend%%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%i=1;while i<=round(NP*Pm)h=randi([1,NP],1,1); %随机选取一个需要变异的个体(染色体)for j=1:round(L*Pm) %Pm是变异概率,L * Pm四舍五入得到变异的基因数量g=randi([1,L],1,1); %随机需要变异的基因数nf(h,g)=~nf(h,g);endi=i+1;endf=nf; %更新种群%由于轮盘赌选择的时候,在前面的个体更容易被选中,f(1,:)=fBest; %如果最优个体在后面,则不一定被选中,这步操作是要保留最优个体(二进制)在新种群中trace(k)=maxFit; %历代最优适应度
end
xBest %最后一代最优个体
finalXBest %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
#
#
其中目标函数(适应度函数)的定义如下:
%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%%%% function result=func1(x) fit= x+10*sin(5*x)+7*cos(4*x); result=fit;
#
#
4.求解结果及剖析
可以看见,遗传算法的收敛速率较快,如下:
同时,遗传算法收敛性很棒的优点,经过多次检测,最后一代的最优个体就是所有代中的最优个体,即:在该问题中群落没有发生退化,造成目标函数出现振荡的现象。 #
六、遗传算法的一些改进方向 #
在现有文献中,对遗传算法的改进主要集中在以下方面:编码模式(怎么编码(转换问题))、选择策略(如何去选择?)、交叉算子(如何交叉?)、变异算子(如何变异)、特殊算子和参数设计。
每一个遗传算法的应用都要牵涉到上述问题,后面的案例代码中包含了很多方面一种解决方法,显然,后续的改进也有许多。 #
之外,还存在着和差分进化算法、免疫算法、蚁群算法等结合上去的混和遗传算法,可以综合遗传算法和其它算法的特点,提升效率和求解品质。2 #
theend……