解决函数极值问题(二元), 采用三种群智能算法实现, 并进行比较分析
求解函数: f ( x , y ) = 6.452 ( x + 0.125 y ) ( cos x − cos ( 2 y ) ) 2 0.8 + ( x − 4.2 ) 2 + 2 ( y − 7 ) 2 + 3.226 y f(x, y)=\frac{6.452(x+0.125 y)(\cos x-\cos (2 y))^{2}}{\sqrt{0.8+(x-4.2)^{2}+2(y-7)^{2}}}+3.226 y f(x,y)=0.8+(x−4.2)2+2(y−7)26.452(x+0.125y)(cosx−cos(2y))2+3.226y的最大值, 其中 x ∈ [ 0 , 10 ) , y ∈ [ 0 , 10 ) x \in[0,10), \quad y \in[0,10) x∈[0,10),y∈[0,10)
利用Matlab绘制函数图形,及使用函数计算最大值如下, 可得函数在该区间的最大值在99.99附近.
代码如下:
% 代码1 粗略绘制函数图形并求最值
clc
clear
clf
x = linspace(0,10,1000);
y = linspace(0,10,1000);
[X,Y] = meshgrid(x,y);
Z = 6.452*(X+0.125.*Y).*((cos(X)-cos(2.*Y)).^2)./sqrt(0.8+(X-4.2).^2+2.*(Y-7).^2)+3.226.*Y;
mesh(X,Y,Z)
hold on
利用Matlab的GA函数, 首先用默认参数进行试验, 发现易陷入局部最优解(如下图)
代码如下:
% 代码2 遗传算法
fun = @(x) 1/(6.452*(x(1)+0.125.*x(2)).*((cos(x(1))-cos(2.*x(2))).^2)./sqrt(0.8+(x(1)-4.2).^2+2.*(x(2)-7).^2)+3.226.*x(2));
nvars = 2;
A = [1, 0; 0, 1; -1, 0; 0, -1]; % Ax不大于b
b = [10; 10; 0; 0];
lb = [];
ub = [];
nonlcon = [];
IntCon = [];
options = optimoptions(@ga)
[x,fval,exitFlag,output,population,scores] = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon,options)
通过optimoptions函数对GA算法的options参数进行修改, 测试结果发现, 在种群规模不太小(>20), 将交配概率与变异概率分别设置为0.8和0.2, 容易找到最优解.
此时, 最优解的坐标为(6.0914, 7.7991, 99.9953).
代码如下:
fun = @(x) 1/(6.452*(x(1)+0.125.*x(2)).*((cos(x(1))-cos(2.*x(2))).^2)./sqrt(0.8+(x(1)-4.2).^2+2.*(x(2)-7).^2)+3.226.*x(2));
nvars = 2;
A = [1, 0; 0, 1; -1, 0; 0, -1]; % Ax不大于b
b = [10; 10; 0; 0];
lb = [];
ub = [];
nonlcon = [];
IntCon = [];
options = optimoptions(@ga, ...
'PopulationType', 'doubleVector',...
'PopulationSize', 50,... % 种群规模
'EliteCount', 1,... % 最佳个体保存
'CrossoverFraction', 0.8, ... % 交配概率
'MigrationDirection', 'forward',...
'MigrationInterval', 20,...
'MigrationFraction', 0.2,... % 变异概率
'Generations', 100,... % 迭代次数
'TimeLimit', Inf,...
'FitnessLimit', -Inf,...
'StallTest', 'averageChange',...
'StallTimeLimit', Inf,...
'TolFun',1.0e-06,...
'Tolcon',1.0e-03,...
'NonlinConAlgorithm','auglag',...
'InitialPenalty', 10,...
'PenaltyFactor', 100,...
'PlotInterval', 1,...
'MutationFcn', {@mutationadaptfeasible [1] [1]},... % 修改
'CreationFcn', @gacreationlinearfeasible,... % 修改
'FitnessScalingFcn', @fitscalingrank,...
'SelectionFcn', @selectionstochunif,...
'CrossoverFcn', @crossoverintermediate,... % 修改
'Display', 'final',...
'Vectorized', 'off')
[x,fval,exitFlag,output,population,scores] = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon,options)
clc
clf
figure(2)
plot(population(:,1),population(:,2),'*r')
xlim([6.05 6.10])
ylim([7.79 7.81])
通过下载安装 P S O t PSOt PSOt工具箱, 对 t e s t _ f u n c . m test\_func.m test_func.m与 t e s t _ m a i n . m test\_main.m test_main.m文件进行编写, 设置初始参数后, 结果如下图所示.
由图可知, 在迭代了大约700次后, PSO算法得出最大值点坐标(6.0914, 7.7991, 99.9953), 与遗传算法获得结果一致.
代码如下:
% test_func函数
function z=test_func(in)
nn=size(in);
x=in(:,1);
y=in(:,2);
nx=nn(1);
for i=1:nx
temp = 1/(6.452*(x(i)+0.125.*y(i)).*((cos(x(i))-cos(2.*y(i))).^2)./sqrt(0.8+(x(i)-4.2).^2+2.*(y(i)-7).^2)+3.226.*y(i));
z(i,:) = temp;
end
% test_main.m文件
clear
clc
x_range=[0,10]; %参数x变化范围
y_range=[0,10]; %参数y变化范围
range = [x_range;y_range]; %参数变化范围(组成矩阵)
Max_V = 0.2*(range(:,2)-range(:,1)); %最大速度取变化范围的10%~20%
n=2; %待优化函数的维数,此例子中仅x、y两个自变量,故为2
pso_Trelea_vectorized('test_func',n,Max_V,range) %调用PSO核心模块
PSO算法中, 调用 p s o _ T r e l e a _ v e c t o r i z e d ( ) pso\_Trelea\_vectorized() pso_Trelea_vectorized()函数的 P S O p a r a m s PSOparams PSOparams参数含义如下表所示(自己查资料总结):
参数 | 含义 |
---|---|
P(1) | 命令窗显示的间隔数, 默认为100, 0则不显示中间过程 |
P(2) | 最大迭代次数, 如算法不收敛, 自动停止, 默认为2000 |
P(3) | 初始粒子数, 越多则越有可能收敛到全局最优值, 默认为24 |
P(4) | 加速度参数, 影响局部最优值, 默认为2 |
P(5) | 加速度参数, 影响全局最优值, 默认为2 |
P(6) | 初始时刻加权值, 默认0.9 |
P(7) | 收敛时刻加权值, 默认0.4 |
P(8) | 当迭代次数超过此值时, 加权取其最小, 默认为1500 |
P(9) | 终止算法的阈值, 连续两次迭代中对于的种群最优值小于此阈值时,算法停止, 默认为1e-25 |
P(10) | 终止算法的阈值, 连续n次迭代函数的梯度没有变化,则算法停止 |
P(11) | 说明优化的情况, NaN表示非约束下的优化问题 |
P(12) | 0则表示通常的PSO算法 |
P(13) | 0表示随机产生种子, 1表示用户自行产生种子 |