欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

粒子群算法简单应用(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

运行结果(不唯一)

粒子群算法简单应用(Matlab实现)
粒子群算法简单应用(Matlab实现)
粒子群算法简单应用(Matlab实现)

代码及实例均参考清风数学建模粒子群算法讲解

相关标签: 1024程序员节