基于matlab的粒子群算法实现

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

    粒子群算法基于“种群”和“进化”的概念,通过个体间的协作与竞争,实现复杂空间最优解得搜索 。
    下面我们介绍带有惯性权重的粒子群优化算法,其进化过程如下式:

在这里插入图片描述 上式中,第一部分表示粒子的初始速度,保证算法的全局收敛能力;第二、三部分使算法具有局部收敛能力。惯性权重w表示在多大程度上保留原来的速度:w较大时,全局收敛能力强,局部收敛能力弱;w较小时,全局收敛能力弱,局部收敛能力强。
实验结果表明:w在0.8~1.2之间时,粒子群算法具有更快的收敛速度。
在这里插入图片描述
在搜索过程中可以对w进行动态调整,如上式所示:在算法开始时,可给w赋予较大正值,随着搜索的进行,可以线性地使w逐渐减小,这样可以保证在算法开始时,各粒子能够以较大的速度步长在全局范围内探测到较好的区域;而在搜索后期,较小的w值则保证粒子能够在极值点周围做精细的搜索,从而使算法有较大的概率向全局最优解位置收敛。对w进行调整,可以权衡全局搜索和局部搜索能力。

一、粒子群算法的实现步骤

(1)初始化粒子群,群体规模,每个粒子的位置和速度。
(2)计算每个粒子的适应度值。
(3)将每一个粒子的适应度值和个体极值进行比较,若适应度值更优,则用其替代个体极值。
(4)将每一个粒子的适应度值和全局极值进行比较,若适应度值更优,则用其替代个体极值。
(5)迭代更新粒子的速度和位置。
(6)进行边界条件的处理。
(7)判断是否满足终止条件:若满足,结束算法;若不满足,返回步骤(2)。

二、示例代码

用matlab实现函数f(x)=xsin(x)cos(2x)-2xsin(3x)+3xsin(4x)的最小值的计算

%% 初始化种群  
clc
clear all
close all
%% Sphere
f= @(x) x .* sin(x) .* cos(2 * x) - 2 * x .* sin(3 * x) +3 * x .* sin(4 * x);%相当于建立了一个函数文件
N = 20;                         % 初始种群个数  
d = 1;                          % 可行解维数  
ger = 100;                      % 最大迭代次数       
limit = [0, 50];               % 设置位置参数限制  
vlimit = [-10, 10];               % 设置速度限制  
w = 0.8;                        % 惯性权重  
c1 = 0.5;                       % 自我学习因子  
c2 = 0.5;                       % 群体学习因子   
figure(1);ezplot(f,[0,0.01,limit(2)]);   %曲线
x = limit(1) + (  limit( 2 ) -  limit( 1)  ) .* rand(N, d);%初始种群的位置  
v = rand(N, d);                  % 初始种群的速度  
xm = x;                          % 每个个体的历史最佳位置  
ym = zeros(1, d);                % 种群的历史最佳位置  
fxm = ones(N, 1)*inf;               % 每个个体的历史最佳适应度  
fym = inf;                       % 种群历史最佳适应度  
hold on  
plot(xm, f(xm), 'ro');title('初始状态图');  
figure(2)  
%% 群体更新  
iter = 1;  
% record = zeros(ger, 1);          % 记录器  
while iter <= ger  
     fx = f(x) ; % 个体当前适应度     
     for i = 1:N        
        if fx(i)  <fxm(i) 
            fxm(i) = fx(i);     % 更新个体历史最佳适应度  
            xm(i,:) = x(i,:);   % 更新个体历史最佳位置(取值)  
        end   
     end  
    if  min(fxm)  < fym 
        [fym, nmin] = min(fxm);   % 更新群体历史最佳适应度  
        ym = xm(nmin, :);      % 更新群体历史最佳位置  
    end  
    v = v * w + c1 * rand * (xm - x) + c2 * rand * (repmat(ym, N, 1) - x);% 速度更新  
    % 边界速度处理  
    v(v > vlimit(2)) = vlimit(2);  
    v(v < vlimit(1)) = vlimit(1);  
    x = x + v;% 位置更新  
    % 边界位置处理  
    x(x > limit(2)) = limit(2);  
    x(x < limit(1)) = limit(1);  
    record(iter) = fym;%最大值记录  
    x0 = 0 : 0.01 : limit(2);  
    subplot(1,2,1)
    plot(x0, f(x0), 'b-', x, f(x), 'ro');title('状态位置变化')
    subplot(1,2,2);plot(record);title('最优适应度进化过程')  
    pause(0.01)  
    iter = iter+1;  
end  
x0 = 0 : 0.01 : limit(2);  
figure(4);plot(x0, f(x0), 'b-', x, f(x), 'ro');title('最终状态位置')  
disp(['最大值:',num2str(fym)]);  
disp(['变量取值:',num2str(ym)]);  

三、结果展示

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值