本文为人工智能与机器学习课程大作业第四部分(四、函数优化)
本文仅作学习参考使用!
其他章节跳转:
四、函数优化
Q:用GA和PSO研究如下函数的极小值问题:
要求:
1、算法设计与算法实现(写出编码、选择、交叉、变异等的具体方法和步骤);
2、改变算法的相关参数(种群规模、迭代次数、交叉和变异概率、惯性权重、学习因子等),研究它们对优化性能的影响;
3、两种算法的结果分析比较。
4.1 函数可视化
首先绘制目标函数图像:函数值作为z坐标,定义域[-5, 5]的图像,分别使用不同精度进行可视化展示,精度分别为n=100、n=1000,函数图像如图4-1、图4-2所示,可视化展示代码如下:
%% 函数可视化MATLAB源码
figure(1)
x_1 = linspace(-5,5,100); % 设置x轴的范围
x_2 = x_1; % 设置y轴范围
[X_1,X_2] = meshgrid(x_1,x_2); % 将其x,y轴网格化
f = 2.*cos(X_1.*X_2) + 3.*X_1 + X_2.^2;
Fig = mesh(X_1,X_2,f); % 绘制三维曲面图
title('函数f三维曲面图')
xlabel('x_1')
ylabel('x_2')
zlabel('f')
grid on
图4-1 精度n=100函数图像
图4-2 精度n=1000函数图像
4.2 遗传算法函数优化
遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究[3]。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。本质上是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应的控制搜索过程以求得最佳解[4, 5]。
4.2.1 遗传算法原理
根据生物进化论,遗传算法将要解决的问题模拟成一个生物进化过程,通过模拟自然界生物的繁殖进化过程、基因交叉、基因突变等过程,产生下一代,并逐步淘汰适应性较差的个体或解,保留适应度较高的个体或解,即“物竞天择、适者生存”。进化有限代后,很可能会进化出适应度非常高的个体[6]。
遗传算法中的相关术语给出如表4-1所示。
表4-1 遗传算法相关术语名称、符号与说明
名称 | 表示与符号 | 说明 |
基因 | genotype | 携带个体的基本信息,性状染色体的内部表现 |
染色体 | chromosome | 一定数量基因的载体 |
表现型 | phenotype | 根据基因型形成的个体外部表现,性状染色体的外部表现 |
个体 | individual | 具备生命体所有特征的实体 |
种群 | population | 若干个个体的集 |
选择 | selection | 淘汰种群中适应性差的个体,保留适应性强的个体的过程 |
交叉 | crossover | 两个染色体之间交换一个或多个基因的过程 |
变异 | mutation | 染色体上一个或多个基因突变的过程 |
适应度 | fitness | 用以评估个体适应性能强弱的指标 |
编码 | coding | 基因到染色体的编写过程 |
解码 | decoding | 染色体到基因的逆编写过程 |
遗传算法的设计如下:
1、染色体编码:在遗传算法中,常见的编码方式包括有:二进制编码、浮点数编码、位置编码等。现举例说明二进制编码的具体操作:对于x->f映射关系的f(x)函数,自变量x的取值范围是[a,b],根据二进制十进制的转换关系,可以找到一个最小的ε值,使得:
其中,ε为编码后的二进制数的长度;ξ为精度,例如给定ξ=0.1,那么可取的自变量最小位数到小数点后一位,且ξ一般取1、0.1、0.01、0.001等。为举例,此处a=63、b=0、ξ=1,可得到编码后的二进制数最小长度为ε=6。对于任意从0到63的整数,均可用一个6位二进制数来表示,对10和60进行编码后,得到染色体分别为[001010]和[111100]。二进制编码在实际中应用更多,可以用简单的0、1数字来模拟染色体上的基因表现型,也为后续的染色体选择,基因交叉和基因变异提供了更方便的操作。
2、种群初始化:对种群的规模的设定,会直接影响到计算效率和能否找到最优解。种群规模的设定主要从以下两个方面考虑:对于种群多样性,群体当然是越大越好,防止陷入局部最优;对于计算效率,种群越大意味着计算量的增加,每一代的运算时间将增加。因此需要结合实际情况设定种群数量。
3、计算个体适应度:首先要确定适应度函数,适应度函数的选取直接影响到遗传算法的收敛速度,并也会决定是否能够找到全局最优解。适应度函数的作用是评估种群中个体的环境适应能力,,适应度好的个体存活几率大。适应度函数在不同模型中可能呈现一个函数形式,也可能为定值。
4、选择:遗传算法中的选择,一般分为轮盘法和竞技法。轮盘法是将种群中所有个体的适应度归一化处理,得到数据作为每个个体的概率,通过生成[0,1]的随机数,判断别选中个体的概率最大值。竞技法思想非常简单,在种群中随机选出两个或者多个个体的适应度进行比较,适应度高者复制自己作为下一代,其余个体被淘汰。在竞技法中,如果选择个体数大于2,但仅有一个子代,会导致种群数量不断减小,反之,若子代数量大于父代数量,会导致种群数量增大,对于找到全局最优解都会造成一定困难。
5、交叉:交叉变异有单点交叉和多点交叉等方法。单点交叉是随机选取两个个体以及该两个体染色体上某个相同位置的基因,交换基因位置,从而得到两个具有新的染色体的个体。遗传算法交叉变异类似于染色体交叉重组。
6、变异:基因变异包括单点变异和多点变异,即随机选择染色体上一个或者多个基因进行变异操作。
7、解码:末代种群中最优个体经过编码的逆操作,实现从编码到解的映射,将此结果作为问题的近似最优解。遗传算法流程图如图4-3所示。
图4-3 遗传算法流程图
遗传算法流程如下:
(1) 对初始种群规模、交叉变异概率、基因变异概率、种群进化迭代次数超参数进行初始化。并对所有个体编码。
(2) 给出合适的适应度函数,并计算种群内每个个体的适应度值。
(3) 采用轮盘法或竞技法,对此代种群进行优胜劣汰。
(4) 在后代中根据交叉变异概率采用单点或多点交叉变异。
(5) 在后代中根据基因变异概率采用单点或多点基因变异。
(6) 判断是否达到初始化设置的种群进化迭代次数,若不满足,则进入下一次种群迭代,将本次子代作为父代,重新从2开始;满足则退出遗传,记录末代所有个体与其适应度值。
(7) 找到末代中最优的适应度值,解码获得其在解空间的值。
结合遗传算法设计,参数常用的设计原则如表4-2。
表4-2 遗传算法参数常用设计原则
名称 | 符号 | 取值 |
种群规模(个体数目) | S | [1,100] |
交叉变异概率 | Pc | [0.4,0.99] |
基因变异概率 | Pm | [0.0001,0.2] |
种群进化迭代次数 | G | [100,500] |
4.2.2 遗传算法实现步骤
1、首先确定适应度函数,MATLAB源码如下所示:
%% 适应度函数fitness MATLAB源码
function fx = fitness(x)
fx = 2*cos(x(1)*x(2)) + 3*x(1) + x(2)^2;
end
2、然后确定遗传算法模型参数如表4-3所示,通过gaoptimset设置遗传算法模型参数,通过结构体optiGA设定解空间、种群规模、交叉概率、变异概率、最大迭代次数等参数,MATLAB源码如下。
表4-3 遗传算法参数设置
名称 | 符号 | 取值 |
种群规模(个体数目) | S | 100 |
交叉变异概率 | Pc | 0.8 |
基因变异概率 | Pm | 0.1 |
种群进化迭代次数 | G | 100 |
%% 遗传算法主函数MATLAB源码
%% GA调参
optiGA = gaoptimset;
optiGA.PopInitRange = [[-5 -5];[5 5]];% 个体解空间
optiGA.PopulationSize = 100;% 种群规模
optiGA.EliteCount = 2;% 每次迭代保留下来的个体数量
optiGA.CrossoverFraction = 0.8;% 交叉概率
optiGA.MutationFraction = 0.1;% 变异概率
optiGA.Generations = 100;% 最大迭代次数
optiGA.MutationFcn = @mutationuniform;%变异函数句柄
optiGA.PlotFcns = @gaplotbestf;
optiGA.TolFun = 1.000e-006;
numOfVars = 2;%变量个数
%% 运行GA
[x,fval] = ga(@fitness,numOfVars,optiGA)
disp('min(fx) is:')
fx = 2*cos(x(1)*x(2)) + 3*x(1) + x(2)^2
运行得到最优个体的x1、x2以及最佳适应度即f值分别别如表4-4所示,性能函数(适应度函数值)的下降曲线如图4-4(a),并在函数图中标注最优个体的位置如图4-4(b),还需要用复杂度来评价模型优劣,因此绘制运行时长及运行内存占比情况如图4-5所示。
表4-4 最优个体和最佳适应度
x1 | x2 | f |
-4.911066980849371 | -0.556144351064970 | -16.257882472418547 |
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-4 遗传算法运行结果
图4-5 复杂度与运行内存占比
4.2.3 改变遗传算法相关参数
改变算法的相关参数,修改种群规模n、迭代次数m、交叉概率Pc和变异概率Pm模型参数如表4-5所示,研究它们对优化性能的影响。
表4-5 改变遗传算法相关参数
改变参数 | 参数值 | 其他参数 |
种群规模n | 30 | m=100 Pc=0.8 Pm=0.1 |
60 | ||
100 | ||
150 | ||
迭代次数m | 30 | n=100 Pc=0.8 Pm=0.1 |
50 | ||
70 | ||
150 | ||
交叉概率Pc | 0.5 | n=100 m=100 Pm=0.1 |
0.6 | ||
0.7 | ||
0.9 | ||
0.95 | ||
变异概率Pm | 0.01 | n=100 m=100 Pc=0.8 |
0.05 | ||
0.2 |
种群规模为:30、60、100、150,迭代次数为:30、50、70、150,交叉概率为:0.5、0.6、0.7、0.8、0.9、0.95,变异概率为:0.01、0.05、0.1、0.2,使用排列组合的方式,对遗传算法超参数进行网格寻优。首先对种群规模进行网格寻优,结果如图4-6、图4-7、图4-8、图4-9。
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-6 种群规模30时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-7 种群规模60时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-8 种群规模100时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-9 种群规模150时遗传算法运行结果
然后对迭代次数进行网格寻优,结果如图4-10、图4-11、图4-12、图4-13。
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-10 迭代次数30时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-11 迭代次数50时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-12 迭代次数70时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-13 迭代次数150时遗传算法运行结果
对交叉概率进行网格寻优,结果如图4-14、图4-15、图4-16、图4-17、图4-18。
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-14 交叉概率0.5时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-15 交叉概率0.6时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-16 交叉概率0.7时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-17 交叉概率0.9时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-18 交叉概率0.95时遗传算法运行结果
对交变异概率进行网格寻优,结果如图4-19、图4-20、图4-21。
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-19 变异概率0.01时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-20 变异概率0.05时遗传算法运行结果
(a) 适应度函数值下降曲线 (b) 最优个体位置
图4-21 变异概率0.2时遗传算法运行结果
4.2.4 实验结果分析与总结
由于遗传算法其内部参数例如每条染色体的初始位置、每次随机生成的个体交叉概率和变异概率以及交叉变异乘以的随机数都是随机生成的,因此每次运行得到的结果大概是不同的,且并不一定为全局最优。在以上的超参数网格寻优中的结果可以整理如表4-5所示。
表4-6 改变遗传算法相关参数及结果
改变参数 | 参数值 | 其他参数 | (x1,x2) | f最小值 | GA运行时间 |
种群规模n | 30 | m=100 Pc=0.8 Pm=0.1 | -4.6218, 0.5749 | -15.3046 | 1.837 |
60 | -4.9887, -0.8666 | -14.9743 | 1.880 | ||
100 | -4.8501, -0.6944 | -16.0172 | 1.336 | ||
150 | -4.7370, 0.6640 | -15.7700 | 2.089 | ||
迭代次数m | 30 | n=100 Pc=0.8 Pm=0.1 | -4.4339, -0.7402 | -14.7341 | 1.788 |
50 | -4.8595, -0.6448 | -16.1628 | 2.062 | ||
70 | -4.9638, 0.6300 | -16.4943 | 2.051 | ||
150 | -4.9819, 0.6320 | -16.5463 | 1.790 | ||
交叉概率Pc | 0.5 | n=100 m=100 Pm=0.1 | -4.9964, -0.6090 | -16.6086 | 1.915 |
0.6 | -4.7343, -0.6914 | -15.7076 | 2.033 | ||
0.7 | -4.9796, 0.5859 | -16.5455 | 1.873 | ||
0.9 | -4.7679, 0.6242 | -15.8869 | 1.391 | ||
0.95 | -4.9780, -0.6230 | -16.5443 | 2.232 | ||
变异概率Pm | 0.01 | n=100 m=100 Pc=0.8 | -4.9983, -0.5948 | -16.6127 | 1.949 |
0.05 | -4.9987, -0.6134 | -16.6141 | 2.358 | ||
0.2 | -4.9237, -0.6343 | -16.3684 | 2.004 |
观察所有超参数模型下的(x1,x2),目标函数最小值以及遗传算法运行时间,使得函数最小值的染色体(x1,x2)=(-4.9987, -0.6134),该模型的种群数目为100,迭代次数为100,交叉概率为0.8,变异概率为0.05。遗传算法的运行时间为2.358s。而相对于遗传算法运行时间为1.949,变异概率为0.01的模型,因为分析其时间复杂度和空间复杂度与最优模型相同,因为这里运行时间并不是非常重要,可以忽略不计。通过上表可知:
1、种群规模对遗传算法优化性能的影响
种群规模不宜太大,也不宜太小。群体规模太小,会出现近亲交配,产生病态基因,而且造成有效等位基因先天缺失,即使采用较大概率的变异算子,生成具有竞争力高阶模式的可能性仍然核销,况且大概率变异算子对已有模式的破坏作用极大[7]。同时,遗传算子存在随机误差(模式采样误差),妨碍小群体中有效模式的正确传播,使得种群进化不能按照模式定理产生所预期的期望数量;种群规模太大,如果迭代次数不够,难以收敛,使系统鲁棒性下降,还会增加时间复杂度和空间复杂度,与遍历效果差不多,没有意义。在该问题中,选择种群规模100为佳。
2、迭代次数对遗传算法优化性能的影响
进化代数太小,算法不容易收敛,种群还没有成熟就已经结束,并输出最优个体,很明显这样的结果往往不是最优的,除非恰好在极值处取到;进化代数太大,算法已经熟练或者种群过于早熟不可能再收敛,继续进化没有意义,只会增加时间开支和资源浪费。在该问题中,选择迭代次数100为佳。
3、交叉概率对遗传算法优化性能的影响
交叉概率太大容易破坏已有的有利模式,随机性增大,容易错失最优个体;交叉概率太小不能有效更新种群。在该问题中,选择交叉概率0.8为佳。
4、变异概率对遗传算法优化性能的影响
变异概率太小,种群的多样性下降太快,容易导致有效基因的迅速丢失且不容易修补;变异概率太大,尽管种群的多样性可以得到保证,但是高阶模式被破坏的概率也随之增大。在该问题中,选择变异概率0.05为佳。
最终得到函数最小值的染色体(x1,x2)=(-4.9987, -0.6134),函数在该定义域下的最小值为-16.6141,算法用时2.358s。
4.3 粒子群算法函数优化
粒子群算法(PSO)属于群智能算法的一种,是通过模拟鸟群捕食行为设计的。假设区域里就只有一块食物(即通常优化问题中所讲的最优解),鸟群的任务是找到这个食物源[8]。鸟群在整个搜寻的过程中,通过相互传递各自的信息,让其他的鸟知道自己的位置,通过这样的协作,来判断自己找到的是不是最优解,同时也将最优解的信息传递给整个鸟群,最终,整个鸟群都能聚集在食物源周围,即我们所说的找到了最优解,即问题收敛。
4.3.1 粒子群算法原理
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度V和位置X,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值Pbest,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解Gbest,粒子群中的所有粒子根据自己找到的当前个体极值Pbest和整个粒子群共享的当前全局最优解Gbest来调整自己的速度和位置。粒子群算法的思想相对比较简单,主要分为:1、初始化粒子群;2、评价粒子,即计算适应值;3、寻找个体极值Pbest;4、寻找全局最优解Gbest;5、修改粒子的速度和位置[9, 10]。
主要步骤如下:
1、初始化
首先,我们需要设置最大的速度区间,防止超出最大的区间。位置信息即为整个搜索空间,我们在速度区间和搜索空间上随机初始化速度和位置。设置群体规模m。
2、个体极值与全局最优解
个体极值为每个粒子找到的历史上最优的位置信息,并从这些个体历史最优解中找到一个全局最优解,并与历史最优解比较,选出最佳的作为当前的历史最优解。
3、更新速度和位置
按式(4-1)更新粒子速度与位置:
式中,ω为惯性因子;c1、c2为加速常数;rand为[0, 1]的随机数;Pid表示第i个变量的个体极值的第d维;Pgd表示全局最优解的第d维。
4、终止条件
有两种终止条件可以选择,一是最大代数:t;二是相邻两代之间的偏差在一个指定的范围内即停止。
4.3.2 粒子群算法实验步骤
1、设置模型超参数:种群规模、惯性权重、学习因子,最大迭代次数等,设置模型超参数MATLAB源码如下:
%% 设置模型超参数MATLAB源码
%% PSO
% 初始化超参数,模型等
Size = 100;
Dimension = 2;
time = 200;
c1 = 1.5;
c2 = 1.5;
Wmax = 0.5;
Wmin = 0.1;
Pmax = 5;
Pmin = -5;
Vmax = 1;
Vmin = -1;
2、初始化种群个体的位置与速度MATLAB源码如下:
%% 初始化粒子位置与速度MATLAB源码
% 初始化种群个体的位置与速度
x = rand(Size, Dimension)*(Pmax-Pmin)+Pmin;
v = rand(Size, Dimension)*(Vmax-Vmin)+Vmin;
3、初始化个体最优位置和最优值MATLAB源码如下:
%% 初始化粒子最优位置和最优值MATLAB源码
% 初始化个体最优位置和最优值
p = x;
pbest = ones(Size, 1);
for i = 1:Size
pbest(i) = fitness(x(i,:));
end
4、初始化全局最优位置和最优值MATLAB源码如下:
%% 初始化全局最优位置和最优值MATLAB源码
% 初始化全局最优位置和最优值
g = ones(1, Dimension);
gbest = inf;
for i = 1:Size
if pbest(i) < gbest
g = p(i,:);
gbest = pbest(i);
end
end
gb = ones(1, time);
5、迭代开始直至终止,注意:适应度函数与遗传算法的适应度函数相同,因此直接调用fitness子函数即可。迭代与终止MATLAB源码如下
%% 迭代与终止MATLAB源码
for i = 1:time
for j = 1:Size
if fitness(x(j,:)) < pbest(j)% 更新个体最优位置和最优值
p(j,:) = x(j,:);
pbest(j) = fitness(x(j,:));
end
if pbest(j) < gbest% 更新全局最优位置和最优质
g = p(j,:);
gbest = pbest(j);
end
w = Wmax-(Wmax-Wmin)*i/time;% 动态计算惯性权重值
v(j,:) = w*v(j,:)+c1*rand*(p(j,:)-x(j,:))+c2*rand*(g-x(j,:));% 更新速度
x(j,:) = x(j,:)+v(j,:);% 更新位置
for k = 1:Dimension% 边界条件处理
if (v(j,k) > Vmax) || (v(j,k) < Vmin)
v(j,k) = rand*(Vmax-Vmin)+Vmin;
end
if (x(j,k) > Pmax) || (x(j,k) < Pmin)
x(j,k) = rand*(Pmax - Pmin) + Pmin;
end
end
end
gb(i) = gbest;% 记录历代全局最优值
end
6、输出最优个体、最优值,并绘制适应度曲线,MATLAB源码如下:
%% 输出最优结果与适应度曲线绘制MATLAB源码
g % 最优个体
gb(end) % 最优值
figure(2)
plot(gb,'LineWidth',2)
xlabel('Time')
ylabel('1/Fitness')
title('Fitness Curve')
运行得到最优粒子的x1、x2以及最佳适应度即f值分别别如表4-7所示,性能函数(适应度函数值)的下降曲线如图4-22(b),并在函数图中标注最优个体的位置如图4-22(a),与遗传算法同理,还需要用复杂度来评价模型优劣,因此绘制运行时长及运行内存占比情况如图4-23所示。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-22 粒子群算法运行结果
表4-7 最优粒子和最佳适应度
x1 | x2 | f |
f-4.999982360428467 | 0.601048524601063 | -16.620122324415950 |
图4-23 复杂度与运行内存占比
4.3.3 改变粒子群算法相关参数
改变粒子群算法的相关参数:种群规模s、迭代次数t、学习因子c1、c2、惯性权重上限wmax、惯性权重下限wmin如表4-8所示,研究它们对粒子群函数优化性能的影响。
表4-8 改变粒子群算法相关参数
改变参数 | 参数值 | 其他参数 |
种群规模s | 50 | t=200 c1,c2=1.5 wmax=0.5,wmin=0.1 |
100 | ||
150 | ||
迭代次数t | 50 | s=100 c1,c2=1.5 wmax=0.5,wmin=0.1 |
100 | ||
150 | ||
学习因子c1 | 1.3 | s=100 t=200 c2=1.5 wmax=0.5,wmin=0.1 |
1.7 | ||
1.9 | ||
学习因子c2 | 1.3 | s=100 t=200 c1=1.5 wmax=0.5,wmin=0.1 |
1.7 | ||
1.9 | ||
惯性权重上限wmax | 0.6 | s=100 t=200 c1,c2=1.5 wmin=0.1 |
0.7 | ||
0.8 | ||
惯性权重下限wmin | 0.2 | s=100 t=200 c1,c2=1.5 wmax=0.5 |
0.3 | ||
0.4 |
种群规模为:50、100、150,迭代次数为:50、100、150,学习因子c1为:1.3、1.7、1.9,学习因子c2为:1.3、1.7、1.9,惯性权重上限wmax为:0.6、0.7、0.8,惯性权重下限wmin为:0.2、0.3、0.4,使用排列组合的方式,对粒子群算法超参数进行网格寻优。首先对种群规模进行网格寻优,结果如图4-24、图4-25、图4-26。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-24 种群规模50时粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-25 种群规模100时粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-26 种群规模150时粒子群算法运行结果
然后对迭代次数进行网格寻优,结果如图4-27、图4-28、图4-29。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-27 迭代次数50时粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-28 迭代次数100时粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-29 迭代次数150时粒子群算法运行结果
对学习因子c1进行网格寻优,结果如图4-30、图4-31、图4-32。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-30 学习因子c1=1.3粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-31 学习因子c1=1.7粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-32 学习因子c1=1.9粒子群算法运行结果
对学习因子c2进行网格寻优,结果如图4-33、图4-34、图4-35。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-33 学习因子c2=1.3粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-34 学习因子c2=1.7粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-35 学习因子c2=1.9粒子群算法运行结果
惯性权重上限wmax进行网格寻优,结果如图4-36、图4-37、图4-38。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-36 惯性权重上限0.6粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-37 惯性权重上限0.7粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-38 惯性权重上限0.8粒子群算法运行结果
惯性权重下限wmin进行网格寻优,结果如图4-39、图4-40、图4-41。
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-39 惯性权重下限0.2粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-40 惯性权重下限0.3粒子群算法运行结果
(a) 最优粒子位置 (b) 适应度函数下降曲线
图4-41 惯性权重下限0.4粒子群算法运行结果
4.3.4 实验结果分析与总结
在以上的超参数网格寻优中的结果可以整理如表4-9所示。
表4-9 改变粒子群算法相关参数与运行结果
改变参数 | 参数值 | 其他参数 | (x1,x2) | 最小值 | PSO运行时间 | |
种群规模s | 50 | t=200 c1,c2=1.5 wmax=0.5,wmin=0.1 | -4.9995, -0.5984 | -16.6179 | 0.487 | |
100 | -4.9999, 0.6039 | -16.6200 | 0.536 | |||
150 | -4.9999, -0.6038 | -16.6201 | 0.659 | |||
迭代次数t | 50 | s=100 c1,c2=1.5 wmax=0.5,wmin=0.1 | -4.9996, 0.6136 | -16.6170 | 0.540 | |
100 | -4.9998, 0.6105 | -16.6187 | 0.481 | |||
150 | -4.9995, -0.6010 | -16.6186 | 0.521 | |||
学习因子c1 | 1.3 | s=100 t=200 c2=1.5 wmax=0.5,wmin=0.1 | -5.0000, 0.6079 | -16.6200 | 0.571 | |
1.7 | -4.9999, 0.6090 | -16.6195 | 0.615 | |||
1.9 | -4.9999, 0.6031 | -16.6200 | 0.552 | |||
学习因子c2 | 1.3 | s=100 t=200 c1=1.5 wmax=0.5,wmin=0.1 | -4.9999, 0.6044 | -16.6202 | 0.606 | |
1.7 | -4.9998, -0.6077 | -16.6195 | 0.556 | |||
1.9 | -4.9995, -0.6068 | -16.6185 | 0.530 | |||
惯性权重上限wmax | 0.6 | s=100 t=200 c1,c2=1.5 wmin=0.1 | -4.9997, -0.6084 | -16.6190 | 0.533 | |
0.7 | -4.9998, -0.6000 | -16.6195 | 0.549 | |||
0.8 | -5.0000, -0.6072 | -16.6202 | 0.598 | |||
惯性权重下限wmin | 0.2 | s=100 t=200 c1,c2=1.5 wmax=0.5 | -4.9998, -0.6071 | -16.6195 | 0.611 | |
0.3 | -4.9999, -0.6011 | -16.6199 | 0.640 | |||
0.4 | -5.0000, -0.6096 | -16.6196 | 0.606 |
观察不同超参数粒子群算法模型下的(x1,x2),目标函数最小值以及粒子群算法运行时间,使得函数最小值的粒子(x1,x2)=(-4.9999, 0.6044)、(x1,x2)=(-5.0000, -0.6072),两个模型参数如下:种群数目为100,迭代次数为200,学习因子c1均为1.5、,学习因子c2分别为1.3、1.5,惯性权重上限wmax分别为0.5、0.8,惯性权重下限wmin均为0.1。算法的运行时间分别为0.606s、0.598s。分析其时间复杂度和空间复杂度相同,因此我认为虽然运行时间不同,但相差不大,运行时间并不是非常重要,可以忽略不计。通过上表可知:粒子群算法的精度,不一定是哪个参数越大或越小越好,关键在于多个参数之间的配合,就譬如以上实验中,虽然模型参数不同(不同学习因子c2、惯性权重上限wmax),且(x1,x2)也不相同,但最优值非常相近,更加证明了以上总结。
最终得到函数最小值的粒子(x1,x2)=(-4.9999, 0.6044)、(x1,x2)=(-5.0000, -0.6072),函数在该定义域下的最小值为-16.6202,算法用时0.606s、0.598s。
4.4 GA与PSO结果比较与性能分析
4.4.1 结果比较
GA与PSO在该问题(函数优化)上的相关参数与结果如表4-10、表4-11所示。
表4-10 遗传算法相关参数及结果
改变参数 | 参数值 | 其他参数 | (x1,x2) | f最小值 | GA运行时间 |
种群规模n | 30 | m=100 Pc=0.8 Pm=0.1 | -4.6218, 0.5749 | -15.3046 | 1.837 |
60 | -4.9887, -0.8666 | -14.9743 | 1.880 | ||
100 | -4.8501, -0.6944 | -16.0172 | 1.336 | ||
150 | -4.7370, 0.6640 | -15.7700 | 2.089 | ||
迭代次数m | 30 | n=100 Pc=0.8 Pm=0.1 | -4.4339, -0.7402 | -14.7341 | 1.788 |
50 | -4.8595, -0.6448 | -16.1628 | 2.062 | ||
70 | -4.9638, 0.6300 | -16.4943 | 2.051 | ||
150 | -4.9819, 0.6320 | -16.5463 | 1.790 | ||
交叉概率Pc | 0.5 | n=100 m=100 Pm=0.1 | -4.9964, -0.6090 | -16.6086 | 1.915 |
0.6 | -4.7343, -0.6914 | -15.7076 | 2.033 | ||
0.7 | -4.9796, 0.5859 | -16.5455 | 1.873 | ||
0.9 | -4.7679, 0.6242 | -15.8869 | 1.391 | ||
0.95 | -4.9780, -0.6230 | -16.5443 | 2.232 | ||
变异概率Pm | 0.01 | n=100 m=100 Pc=0.8 | -4.9983, -0.5948 | -16.6127 | 1.949 |
0.05 | -4.9987, -0.6134 | -16.6141 | 2.358 | ||
0.2 | -4.9237, -0.6343 | -16.3684 | 2.004 |
在遗传算法中,最终得到函数最小值的染色体(x1,x2)=(-4.9987, -0.6134),函数在该定义域下的最小值为-16.6141,算法用时2.358s,最优模型的种群数目为100,迭代次数为100,交叉概率为0.8,变异概率为0.05。
在粒子群算法中,最终得到函数最小值的粒子(x1,x2)=(-4.9999, 0.6044)、(x1,x2)=(-5.0000, -0.6072),函数在该定义域下的最小值为-16.6202,算法用时0.606s、0.598s。两个模型参数:种群数目为100,迭代次数为200,学习因子c1均为1.5、,学习因子c2分别为1.3、1.5,惯性权重上限wmax分别为0.5、0.8,惯性权重下限wmin均为0.1。相对而言,该问题中,如果利用MATLAB,遗传算法更容易实现,但需要费时调整模型超参数,而对于粒子群算法,编程需要花时间,但相同时间下,相对于遗传算法能获得更好的结果。
表4-11 改变粒子群算法相关参数与运行结果
改变参数 | 参数值 | 其他参数 | (x1,x2) | 最小值 | PSO运行时间 | |
种群规模s | 50 | t=200 c1,c2=1.5 wmax=0.5,wmin=0.1 | -4.9995, -0.5984 | -16.6179 | 0.487 | |
100 | -4.9999, 0.6039 | -16.6200 | 0.536 | |||
150 | -4.9999, -0.6038 | -16.6201 | 0.659 | |||
迭代次数t | 50 | s=100 c1,c2=1.5 wmax=0.5,wmin=0.1 | -4.9996, 0.6136 | -16.6170 | 0.540 | |
100 | -4.9998, 0.6105 | -16.6187 | 0.481 | |||
150 | -4.9995, -0.6010 | -16.6186 | 0.521 | |||
学习因子c1 | 1.3 | s=100 t=200 c2=1.5 wmax=0.5,wmin=0.1 | -5.0000, 0.6079 | -16.6200 | 0.571 | |
1.7 | -4.9999, 0.6090 | -16.6195 | 0.615 | |||
1.9 | -4.9999, 0.6031 | -16.6200 | 0.552 | |||
学习因子c2 | 1.3 | s=100 t=200 c1=1.5 wmax=0.5,wmin=0.1 | -4.9999, 0.6044 | -16.6202 | 0.606 | |
1.7 | -4.9998, -0.6077 | -16.6195 | 0.556 | |||
1.9 | -4.9995, -0.6068 | -16.6185 | 0.530 | |||
惯性权重上限wmax | 0.6 | s=100 t=200 c1,c2=1.5 wmin=0.1 | -4.9997, -0.6084 | -16.6190 | 0.533 | |
0.7 | -4.9998, -0.6000 | -16.6195 | 0.549 | |||
0.8 | -5.0000, -0.6072 | -16.6202 | 0.598 | |||
惯性权重下限wmin | 0.2 | s=100 t=200 c1,c2=1.5 wmax=0.5 | -4.9998, -0.6071 | -16.6195 | 0.611 | |
0.3 | -4.9999, -0.6011 | -16.6199 | 0.640 | |||
0.4 | -5.0000, -0.6096 | -16.6196 | 0.606 |
4.4.2 GA与PSO性能分析与相同点
GA和PSO都是优化算法,都力图在自然特性的基础上模拟个体种群的适应性,它们都采用一定的变换规则通过搜索空间求解[11]。GA与PSO相同点如下:
1、都属于仿生算法。PSO主要模拟鸟类觅食、人类认知等社会行为而提出;GA主要借用生物进化中“适者生存”的规律。
2、都属于全局优化方法。两种算法都是在解空间随机产生初始种群,因而算法在全局的解空间进行搜索,且将搜索重点集中在性能高的部分。
3、都属于随机搜索算法。都是通过随机优化方法更新种群和搜索最优点。PSO中认知项和社会项前都加有随机数;而GA的遗传操作均属随机操作。
4、都隐含并行性。搜索过程是从问题解的一个集合开始的,而不是从单个个体开始,具有隐含并行搜索特性,从而减小了陷入局部极小的可能性。并且由于这种并行性,易在并行计算机上实现,以提高算法性能和效率。
5、根据个体的适配信息进行搜索,因此不受函数约束条件的限制,如连续性、可导性等。
6、对高维复杂问题,往往会遇到早熟收敛和收敛性能差的缺点,都无法保证收敛到最优点。
4.4.3 GA与PSO不同点
GA与PSO不同点如下:
1、PSO有记忆,好的解的所有知识都保存,而GA没有记忆,以前的知识随着种群的改变被破坏。
2、在GA算法中,染色体之间相互共享信息,所以整个种群的移动是比较均匀地向最优区域移动。PSO中的粒子仅仅通过当前搜索到最优点进行共享信息,所以很大程度上这是一种单项信息共享机制,整个搜索更新过程是跟随当前最优解的过程。在大多数情况下,所有粒子可能比遗传算法中的进化个体以更快速度收敛于最优解。
3、GA的编码技术和遗传操作比较简单,而PSO相对于GA,不需要编码,没有交叉和变异操作,粒子只是通过内部速度进行更新,因此原理更简单、参数更少、实现更容易。
4、在收敛性方面,GA己经有了较成熟的收敛性分析方法,并且可对收敛速度进行估计;而PSO这方面的研究还比较薄弱。尽管已经有简化确定性版本的收敛性分析,但将确定性向随机性的转化尚需进一步研究。
5、在应用方面,PSO算法主要应用于连续问题,包括神经网络训练和函数优化等,而GA除了连续问题之外,还可应用于离散问题,比如TSP问题、货郎担问题、工作车间调度等。
4.5 实验总结与心得体会
参考文献
[1] 税纪钧, 初学者都能懂的深度学习之神经网络(三)反向传播算法, https://blog.youkuaiyun.com/ HISJJ/article/details/126953224?spm=1001.2014.3001.5501, 202.12.31.
[2] 王旭东,邵惠鹤.RBF神经网络理论及其在控制中的应用[J].信息与控制,1997(04):32-44.
[3] 金希东. 遗传算法及其应用[D]. 成都:西南交通大学, 1996.
[4] 吉根林. 遗传算法研究综述[J]. 计算机应用与软件, 2004, 21(2):5.
[5] Wang Q, Spronck P, Tracht R. An overview of genetic algorithms applied to control engineering problems[C]// Machine Learning and Cybernetics, 2003 International Conference on. IEEE, 2003.
[6] 税纪钧, 改进遗传算法(IGA)的自抗扰控制器(ADRC)学习笔记, https://blog.youkuaiyun.com/HISJJ/ article/details/127386770?spm=1001.2014.3001.5501, 2022.12.30.
[7] helloHKTK, 遗传算法调参, https://www.cnblogs.com/helloHKTK/p/9772778.html, 2023.1.4.
[8] 王宇韬, 钱妍竹, Python大数据分析与机器学习[M], 北京, 机械工业出版社, 2020.5, P92-P94.
[9] 李爱国,覃征,鲍复民,贺升平.粒子群优化算法[J].计算机工程与应用,2002(21):1-3+17.
[10] 周志华, 机器学习[M], 北京, 清华大学出版社, 2016.1, P23-43.
[11] 李红亚,彭昱忠,邓楚燕,龚道庆.GA与PSO的混合研究综述[J].计算机工程与应用,2018,54(02):20-28+39.