粒子群算法1

一.PSO算法理论

PSO算法首先在可行解空间中初始化蚁群粒子,每个粒子都代表极值优化问题的一个潜在的最优解,用位置,速度和适应度3项指标表示该粒子特征,适应度值是有适应度函数计算得到的,一般来说,适应度函数就是我们所要求的目标函数。

粒子在解空间中运动,通过个体极值Pbest和群体的极值Gbest来更新个体的位置。

个体极值Pbest:指通过个体的位置计算得到的适应度值的最优位置。

群体的极值Gbest:指种群中的所有粒子搜索到的适应值的最优位置。



在每次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,即:


其中:

w为惯性权重;

d=1,2,......D ;  

i=1,2,3.....n; 

k为当前的迭代次数

Vid为粒子的速度;

c1,c2是非负的常数,称为加速度因子;

r1,r2是分布在[0,1]区间的随机数。

 

说明:为了防止粒子的盲目搜索,一般会限制其的位置和速度,用区间可以表示为:[-Xmax,Xmax],[-Vmax,Vmax]

 

外加几个重要参数的说明:

粒子的维度:由优化问题决定,就是问题解的维度。

粒子的范围:由优化问题决定,每一维可设不同的范围。

加速度因子:有地方也称学习因子,学习因子使粒子具有自我总结和向优秀个体学习的能力,从而向群体的最优点靠近,通常取c1,c22,但也可以取其他值,一般c1=c2,且范围在04之间。

惯性权重:决定了对粒子当前速度的继承的多少,合适的选择可以使粒子具有均衡的探索能力和开发能力,惯性权重的取法一般有:常系数法,线性递减法,自适应法等。

 

二.举例及实现:

下面来求解如下函数的最大值:


算法步骤如下:




matlab代码的实现:
%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的两个参数
c1 = 1.49445;
c2 = 1.49445;

maxgen=300;   % 进化次数  
sizepop=100;   %种群规模   去100个。这个时候基本上最大值是固定的,但是位置是不固定的
%%%%%%%每个粒子的维度为2
Vmax=0.5;
Vmin=-0.5;
popmax=2;
popmin=-2;

%% 产生初始粒子和速度
for i=1:sizepop
    %随机产生一个种群
    pop(i,:)=2*rands(1,2);    %初始种群
    V(i,:)=0.5*rands(1,2);  %初始化速度
    %计算适应度
    fitness(i)=fun(pop(i,:));   %染色体的适应度
end

%% 个体极值和群体极值
[bestfitness bestindex]=max(fitness);
zbest=pop(bestindex,:);   %全局最佳
fitnesszbest=bestfitness;   %全局最佳适应度值

gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值


%% 迭代寻优
for i=1:maxgen
    
    for j=1:sizepop
        
        %速度更新
        V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;%相当于一个阈值截断的思想,大于某一个数的值就复制为这个阈值
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        %种群更新
        pop(j,:)=pop(j,:)+V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;%如果为空,那么pop中的数据不会发生变化
        pop(j,find(pop(j,:)<popmin))=popmin;
        
        %适应度值
        fitness(j)=fun(pop(j,:)); 
   
    end
    
    for j=1:sizepop
        
        %个体最优更新
        if fitness(j) > fitnessgbest(j)
            gbest(j,:) = pop(j,:);
            fitnessgbest(j) = fitness(j);
        end
        
        %群体最优更新
        if fitness(j) > fitnesszbest
            zbest = pop(j,:);
            fitnesszbest = fitness(j);
        end
    end 
    yy(i)=fitnesszbest;    
        
end
%% 结果分析
plot(yy)
disp(['位置为:',num2str(zbest)]);
disp(['最大值为:',num2str(yy(end))]);
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);
ylabel('适应度','fontsize',12);


运行结果:


最终的计算结果为:

位置为:-0.00017983  0.00010285

最大值为:1.0054

 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值