找回密码
 立即注册
查看: 465|回复: 0

传统(经典)粒子群算法(PSO)解决单目标优化问题

[复制链接]
发表于 2021-12-12 19:01 | 显示全部楼层 |阅读模式
智能算法:粒子群算法(particle swarm optimizer)—PSO

%原理:(1)种群初始化–N(种群数)–D(个体数)–x(i)(粒子位置)–v(i)(粒子速度)
% (2)计算每个粒子的适应度值–而适应度值需要选择适应度函数
% (3)对于每个粒子,使用它的适应度值fit和个体的极值pbest(i)进行比较,如果fit>pbest(i),则pbest(i)=fit
% (4)同理,对每个粒子用它的适应值与全局极值进行比较,如果比它大,则替换它,st.fit=gbest(i)
% (5)根据v(i,d)=wv(i,d)+c1r1(p(i,d)-x(i,d))+c2*r2(p(g,d)-x(i,d))更新粒子的位置
% (6)根据 x(i,d)=x(i,d)+v(i,d)进行更新粒子的速度
%时间:2021.3.14
PSO算法m文件夹

function[xm,fv]=PSO(fitness,N,c1,c2,w,M,D)    %创建粒子群算法函数,可以直接调用
%------给定初始化条件----------------------------------------------
% c1学习因子1------c1,c2的取值通常在2左右
% c2学习因子2
% w惯性权重--------通常取[0,1]
% M最大迭代次数-----迭代次数根据自己的需要进行设定
% D搜索空间维数(未知数个数)-----
% N初始化群体个体数目---------通常来说对于种群数和个体数之间的关系并没有准确的一个比例,通常来说设置为N=[5D,10D],如果种群和个体数相差太多会影响收敛性

%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
format long;

xmin=-1;
xmax=2;
for i=1:N
    for j=1:D
        x=xmin+rand(N,D)*(xmax-xmin); %随机初始化位置
        v=rand(N,D); %随机初始化速度
    end
end

%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i=1:N
    p(i)=fitness(x(i,:));  %计算初始粒子的适应度值
    y(i,:)=x(i,:);         %个体极值中的变量值等于粒子的初始值---为了后期进行保存全局最优值
end
pg=x(N,:);           %Pg为全局最优值---将初始位置的最后一列元素赋给全局最优值---目的在于保存全局最优值
for i=1:(N-1)
    if fitness(x(i,:)) <fitness(pg)   
        pg=x(i,:);          %更新全局最优值,保存最优值
    end
end

%------进入主要循环,按照公式依次迭代,直到满足精度要求------------
for t=1:M   %做一个主循环,用于迭代
      time(t)=t;
    for i=1:N     %更新速度、位移
        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(pg-x(i,:));
     %做防止越界
        if v(i,:)<xmin         
            v(i,:)=xmin;
        end
            if v(i,:)>xmax
                v(i,:)=xmax;
            end
        x(i,:)=x(i,:)+v(i,:);     %更新之后的点
        
        if fitness(x(i,:))< p(i)      %使用选择函数
            p(i)=fitness(x(i,:));
            y(i,:)=x(i,:);%更新个体极值
            
        end
        if p(i)<fitness(pg)           %选择保存最优值
            pg=y(i,:);
           % pg=x(i,:);
        end
    end
    Pbest(t)=fitness(pg);     %将全局最优值赋给Pbest
end

%------最后给出计算结果
disp('*************************************************************')
disp('目标函数取最小值时的自变量:')
xm=pg'
disp('目标函数的最小值为:')
fv=fitness(pg)
plot(time,Pbest(time),'r-*')
xlabel('迭代次数');ylabel('最优值');
title('迭代后的最小值')     
disp('*************************************************************')

%涉及到对于给定区间上的函数最小值,也就是说对于边界越俗问题的探讨测试函数文件夹

function F=fitness(x)
global D
F=0;
for i=1:D
    F=F+x(i)^2+x(i)-6;
end主测试文件:

clear
clc
% c1学习因子1------c1,c2的取值通常在2左右
% c2学习因子2
% w惯性权重--------通常取[0,1]
% M最大迭代次数-----迭代次数根据自己的需要进行设定
% D搜索空间维数(未知数个数)-----
% N初始化群体个体数目---------通常来说对于种群数和个体数之间的关系并没有准确的一个比例,通常来说设置为N=[5D,10D],如果种群和个体数相差太多会影响收敛
global D
N=100;
c1=1.5;
c2=2.5;
w=0.5;
M=200;
D=3;
[xm2,fv2]=PSO(N,c1,c2,w,M,D);运行结果:

*************************************************************
目标函数取最小值时的自变量:
xm =
  -0.499999986278295
  -0.499999963611686
  -0.499999988364467
目标函数的最小值为:
fv =
-18.750000000000000
*************************************************************

这里推荐一本粒子群优化的书籍供大家学习:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 06:50 , Processed in 0.144671 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表