粒子群算法(PSO)matlab代码实现

本文详细介绍了如何在MATLAB中实现粒子群算法(PSO),包括初始化参数、粒子位置和速度的更新、边界处理以及目标函数的求解过程,展示了算法在求解一维函数最小值问题中的应用。
摘要由CSDN通过智能技术生成

粒子群算法(PSO)matlab代码实现

在这里插入图片描述

%% 清空命令行和工作区
clc
clear
%% 目标函数:求解函数在[0,50]区间上的最小值
f=@(x) x.*sin(x).*cos(2*x) - 2.*sin(3*x)+3*x.*sin(4*x);
%% 初始化算法参数
population=50;                % 粒子的数量
dimension=1;                  % 解的维度(一维数轴)
iter_max=100;                % 迭代终止条件
location_limit=[0,50];      % 粒子运动区间限制
velocity_limit=[-10,10];   % 速度限制
omega=0.7;                    % 粒子惯性权重
c1=0.5;                          %自身经验系数
c2=0.5;                          %群体经验系数
%% 绘制目标函数图像
figure(1)   %创建一个图像窗口
ezplot(f,[location_limit(1),location_limit(2)]);
%% 初始化粒子群
pop=location_limit(1)+(location_limit(2)-location_limit(1))*rand(population,dimension);
% 粒子群的初始位置是随机生成的,pop是一个population行dimension列的矩阵

v=rand(population,dimension);
optimal_position1=pop;
optimal_position2=zeros(1,dimension);
optimal_value1=ones(population,dimension)*inf;
optimal_value2=ones(iter_max,1)*inf;
optimal_record=ones(iter_max,1)*inf;

hold on
plot(pop,f(pop),'ro');
title('初始状态图');
hold off
pause(0.2);
figure(2);
%% 迭代循环
for iter=1:iter_max
    % 1.函数值计算及最优解记录更新
    f_value=f(pop);
    for i=1:population
        if f_value(i)<optimal_value1(i)
            optimal_value1(i)=f_value(i);
            optimal_position1(i,:)=pop(i,:);
        end
    end
    if min(optimal_value1)<optimal_value2
        [optimal_value2,index]=min(optimal_value1);
        optimal_position2=optimal_position1(index,:);
    end

    % 2.更新粒子速度和位置
    v=v*omega ...
    + c1*rand*(optimal_position1-pop) ...
    + c2*rand*(repmat(optimal_position2,population,1)-pop);

    % 3.速度越界处理
    v(v<velocity_limit(1))=velocity_limit(1);
    v(v>velocity_limit(2))=velocity_limit(2);

    % 4.更新粒子位置
    pop=pop +v;

    % 5.位置越界处理
    pop(pop<location_limit(1))=location_limit(1);
    pop(pop>location_limit(2))=location_limit(2);

    % 6.迭代过程中记录最优值记录
    optimal_record(iter)=optimal_value2;

    % 7.绘图
    x=location_limit(1):0.01:location_limit(2);

    subplot(1,2,1)
    plot(x,f(x),'b-',pop,f(pop),'ro');

    subplot(1,2,2)
    plot(optimal_record);
    title('最优适应度进化过程');
    pause(0.01);
    iter=iter+1;
end

x=location_limit(1):0.01:location_limit(2);
figure(3);
plot(x,f(x),'b-',pop,f(pop),'ro');
title('最终位置状态');
disp('最优函数值',num2str(optimal_value2));
disp('\n最优解',num2str(optimal_position2));

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

  • 7
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值