欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

粒子群算法的matlab实现

程序员文章站 2022-06-08 12:30:11
...

转自:https://blog.csdn.net/just_do_it_123/article/details/50993439

粒子群算法,也称粒子群优化算法(Particle Swarm Optimization),缩写为 PSO, 是近年来发展起来的一种新的进化算法(Evolutionary Algorithm - EA)。PSO 算法属于进化算法的一种,和模拟退火算法相似,它也是从随机解出发,通过迭代寻找最优解,它也是通过适应度来评价解的品质,但它比遗传算法规则更为简单,它没有遗传算法的“交叉”(Crossover) 和“变异”(Mutation) 操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高、收敛快等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性。粒子群算法是一种并行算法。 
粒子群算法的matlab实现


下面具体介绍粒子群算法的matlab实现: 
目标函数:f = x1**2+x2**2-x3**2+3*sin(x1*x2*x3) 
求解:在坐标范围x~(-10,10) z~(-10,10) y~(-10,10)的范围中的最大值,以及最大值所对应的x1,x2,x3

算法步骤:


首先初始化参数
%参数初始化
c1=1.49445;c2=1.49445;
maxgen=200; % 最大进化次数                                                      
sizepop=100; %粒子总数                                                        
psize = 3; % 粒子大小
Vmax=5;Vmin=-5; % 粒子移动速度范围                                           
lb = ones(psize,1)*(-10);
ub = ones(psize,1)*10;
bound = [lb,ub]; % 粒子移动的范围
wstart = 0.9;wend = 0.4; % 惯性权重
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

其中,惯性权重用来调节算法的寻优能力,当权重较大时,算法有较强的全局寻优能力,当权重较小时,算法有较强的局部寻优能力,在算法的运行当中,调节权重由大到小的变化,提升算法的性能。


惯性权重调节公式:
w = wstart-(wstart-wend)*((i1/maxgen)^2);
  • 1

粒子群初始化,初始化粒子群中各个粒子的速度和位置
%产生初始粒子位置和速度
pop=zeros(sizepop,psize);
V=zeros(sizepop,psize);
fitness=zeros(1,sizepop);
for i1=1:sizepop
    %随机产生一个种群
    pop(i1,:) = (bound(:,2)-bound(:,1))'.*rand(1,psize)+bound(:,1)';
    V(i1,:)=rands(1,psize)*(Vmax-Vmin)+Vmin;                                        %随机初始化粒子速度
    %计算适应度
    fitness(i1)=fun(pop(i1,:));
end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
粒子速度更新
V(i2,:)=w*V(i2,:)+c1*rand*(gbest(i2,:) - pop(i2,:))+c2*rand*(zbest - pop(i2,:));
  • 1
限制粒子的速度上下限
tempV = V(i2,:);
tempV(tempV > Vmax) = Vmax;
tempV(tempV < Vmin) = Vmin;
V(i2,:) = tempV;
  • 1
  • 2
  • 3
  • 4
粒子位置更新
pop(i2,:)=pop(i2,:)+V(i2,:);
  • 1
限制粒子位置的上下限
% 粒子位置限制
        for i3 = 1:psize
            if pop(i2,i3) >= bound(i3,2)
                pop(i2,i3) = bound(i3,2);
            end
            if pop(i2,i3) <= bound(i3,1)
                pop(i2,i3) = bound(i3,1);
            end
        end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

算法运行结果


粒子群算法的matlab实现


平均适应度值和最优适应度值随着进化代数变化 
粒子群算法的matlab实现

对比之前用python实现的粒子群算法,python用了1.2秒左右,matlab却只用了0.6秒左右,而之前对比了python和matlab实现的遗传算法,python又比matlab要快,看来语言的快慢有时候并不是算法性能的绝对因素,算法的具体实现技巧也很关键!