PSO算法(matlab实现)

老师布置的作业,仿照B站上的PSO教学视频,完成PSO算法。
这里是借助matlab,用PSO算法对内置的peaks函数进行了一个函数优化,并进行了粒子群的仿真。

下面是收敛动画和代码。

在这里插入图片描述

clc
clear all
%% Parameter
varmax=3;
varmin=-3;
epoches=100;
w=1;
wdamp=0.99;
c1=2;
c2=2;
cost=@(x)3*(1-x(1)).^2.*exp(-(x(1).^2) - (x(2)+1).^2) ... 
   - 10*(x(1)/5 - x(1).^3 - x(2).^5).*exp(-x(1).^2-x(2).^2) ... 
   - 1/3*exp(-(x(1)+1).^2 - x(2).^2);
n=50;

%% Initialize
gcost=inf;
gbest=zeros([1 2]);
for i=1:n
     swarm(i).pos=unifrnd(varmin,varmax,[1 2]);
     swarm(i).v=zeros([1 2]);
     swarm(i).cost=cost(swarm(i).pos);
     swarm(i).ibest=swarm(i).pos;
     swarm(i).icost=swarm(i).cost;
     if swarm(i).cost<gcost
         gbest=swarm(i).pos;
         gcost=swarm(i).cost;
     end
end

%% Alogrithm
for i=1:epoches
    % update
    pos=zeros([n 2]);
    for j=1:n
        swarm(j).v=w*swarm(j).v+c1*rand([1,2]).*(gbest-swarm(j).pos)+c2*rand([1 2]).*(swarm(j).ibest-swarm(j).pos);
        swarm(j).pos=swarm(j).pos+swarm(j).v;
        swarm(j).pos=min(swarm(j).pos,varmax);
        swarm(j).pos=max(swarm(j).pos,varmin);
        pos(j,:)=swarm(j).pos;
        swarm(j).cost=cost(swarm(j).pos);
        if swarm(j).icost>swarm(j).cost
            swarm(j).icost=swarm(j).cost;
            swarm(j).ibest=swarm(j).pos;
            if gcost>swarm(j).cost
                gcost=swarm(j).cost;
                gbest=swarm(j).pos;
            end
        end
    end
    w=w*wdamp;
    figure(1)
    plot(pos(:,1),pos(:,2),'ro');
    hold on
    contour(linspace(-3,3,100),linspace(-3,3,100),peaks(100))
    colorbar
    hold off
    disp(['the ' num2str(i) 'th iterator''s cost is ' num2str(gcost)])
    loss(i)=gcost;
    pause(0.1);
end
figure(2)
plot(loss,'b')
title('best cost changes with time')
disp(['best coefficient is ' num2str(gbest(1)) ' ' num2str(gbest(2)) ' ,and cost is ' num2str(gcost)])
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值