粒子群算法简单应用(Matlab实现)
程序员文章站
2022-03-13 16:49:47
...
求解问题
求函数 y = 11 * sin(x) + 7 * cos(5 * x)的最大值
x ∈ [-3,3]
核心公式
位置更新公式: x(d + 1) = x(d) + v(d) * t
速度更新公式: v(d) = w * v(d) + c1 * r1 * (p_best - x(d)) + c2 * r2 *(g_best - x(d)) (r1、r2为随机数)
Code1
clc, clear %清屏,清变量
%% 画出函数图初步判定最大值在哪里
x = -3:0.01:3;
y = 11 * sin(x) + 7 * cos(5 * x);
plot(x, y, 'b-');
title('y = 11 * sin(x) + 7 * cos(5 * x)');
hold on; %图像不关闭,方便后续展现动画效果
%% 初始化算法参数
K = 50; %迭代次数
n = 10; %变量个数
c1 = 2; %个人学习因子
c2 = 2; %社会学习因子
w = 0.9;%速度惯性权重
v_max = 1.2;%最大速度值
x_lb = -3; %自变量下界
x_ub = 3; %自变量上界
narvs = 1; %自变量个数
%% 初始化速度值、位置值、最佳位置值
x = zeros(n, narvs); %初始化位置
for i = 1:n
x(i,:) = x_lb + rand(1, narvs) * (x_ub - x_lb);
end
v = zeros(n, narvs); %初始化速度
for i = 1:n
v(i,:) = -v_max + 2 * v_max * rand(1,narvs);
end
fit = zeros(n, 1); %计算目标值
for i = 1:n
fit(i) = Obj_fun(x(i,:));
end
p_best = x; %初始化个体的历史最优位置值
ind = find(fit == max(fit), 1);
g_best = x(ind,:); %初始化所有个体的历史最优位置值
%%
h = scatter(x, fit, 80, 'r*'); %%动画效果
%%
fit_best = zeros(K, 1); %初始化每一代的最优函数值,后续画迭代图
for k = 1:K
for i = 1:n %更新速度值
v(i,:) = w * v(i,:) + c1 * rand(1) * (p_best(i,:) - x(i,:)) + c2 * rand(1) * (g_best - x(i,:));
for j = 1:narvs %判断速度有无越界
if v(i,j) < -v_max
v(i,j) = -v_max;
elseif v(i,j) > v_max
v(i,j) = v_max;
end
end
x(i,:) = x(i,:) + v(i,:); %利用更新后的速度值更新位置值
for j = 1: narvs %判断位置有无越界
if x(i,j) < x_lb
x(i,j) = x_lb;
elseif x(i,j) > x_ub
x(i,j) = x_ub;
end
end
fit(i) = Obj_fun(x(i,:)); %计算单个个体的目标函数值
if Obj_fun(x(i,:)) > Obj_fun(p_best(i,:)) %判断目标函数值是否优于其本身的历史最优函数值
p_best(i,:)= x(i,:); %是,则更新自身历史最优位置值
end
if Obj_fun(x(i,:)) > Obj_fun(g_best) %判断目标函数值是否优于所有个体的历史最优函数值
g_best = x(i,:); %是,则将当前位置值作为所有个体的历史最优位置值
end
end
pause(0.1) %暂停0.1秒
h.XData = x; %动画效果,更新
h.YData = fit; %动画效果,更新
fit_best(k) = Obj_fun(g_best); %记录第k次迭代中,历史最优的目标函数值
end
%% 输出结果
figure(2)
plot(fit_best); %画出迭代图
disp('最优位置值为:'); disp(g_best);
disp('对应的最优目标函数值为:'); disp(Obj_fun(g_best));
Code2
function y = Obj_fun(x)
y = 11 * sin(x) + 7 * cos(5 * x);
end
运行结果(不唯一)
代码及实例均参考清风数学建模粒子群算法讲解