PSO | 基础概念+两个简单的案例

PSO自用学习笔记

  

实践(2维)——matlab

求解:f(x)=xsin(x)cos(2x)-2xsin(3x)+3xsin(4x)在[0,50]的最小值。

%%初始化种群
close all
clear
clc
%%Sphere
clear
f=@(x)x.*sin(x).*cos(2*x)-2*x.*sin(3*x)+3*x.*sin(4*x);
N=20; %初始种群个数
d=1; %可行解维数
ger=500; %最大迭代次数
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);

    hold on
    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);
hold on
plot(x0,f(x0),'b-',x,f(x),'ro');title("最终状态位置");
disp(['最大值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);

 

 

实践(3维)——matlab

求解:20+x^2+y^2-10cos(2πx)-10cos(2πy)在[-5.12,5.12]的最小值

%初始化种群
close all
clear
clc
f=@(x,y) 20+x.^2+y.^2-10*cos(2*pi.*x)-10*cos(2*pi.*y);%[-5.12,5.12]

x0=[-5.12:0.05:5.12];
y0=x0;
[X,Y]=meshgrid(x0,y0);
Z=f(X,Y);
figure(1);mesh(X,Y,Z);
colormap(parula(5));

N=50; %初始种群个数
d=2;%可行解维数
ger=100;%最大迭代次数
limit=[-5.12,5.12];%设置位置参数限制
vlimit=[-.5,.5];%设置速度限制
w=0.8; %惯性权重
c1=0.5;%自我学习因子
c2=0.5;%群体学习因子

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; %种群历史最佳适应度
%record=zeros(ger,1);
hold on
%[X,Y]=meshgrid(x(:,1),x(:,2));
%Z=f(X,Y);
scatter3(x(:,1),x(:,2),f(x(:,1),x(:,2)),'r*');
figure(2)
record=[];

%%群体更新
iter=1;
%record=zeros(ger,1);%记录器
while iter<=ger
    fx=f(x(:,1),x(:,2));
    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;%最大值记录
    subplot(1,2,1)
    mesh(X,Y,Z)
    hold on
    scatter3(x(:,1),x(:,2),f(x(:,1),x(:,2)),'r*');
    title(['状态位置变化','迭代次数',num2str(iter)])
    subplot(1,2,2);plot(record);title('最优适应度进化过程')
    pause(0.01)
    iter=iter+1;
end
figure(4);mesh(X,Y,Z);hold on
scatter3(x(:,1),x(:,2),f(x(:,1),x(:,2)),'r*'),title('最终状态位置')
disp(['最优值:',num2str(fym)]);
disp(['变量取值:',num2str(ym)]);

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值