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

粒子群算法案例学习-非线性函数寻优

程序员文章站 2022-05-20 22:52:27
...

一、实例

fun.m脚本文件

%%函数用于计算粒子适应度值
function y=fun(x)

%x           input           输入粒子 
%y           output          粒子适应度值 

y=-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+exp(1);
%%当c1=20,e=2.71282,n=2时,寻优的非线性函数为Ackley函数
%存在局部极小值点,最小值点为0,最小值位置(0,0%y=x(1)^2-10*cos(2*pi*x(1))+10+x(2)^2-10*cos(2*pi*x(2))+10;

PSO.m脚本文件

clc
clear 
%速度更新参数
c1=1.49445;
c2=1.49445;
maxgen=100;%迭代次数
sizepop=20;%种群规模
popmax=5;popmin=-5;%个体最值
Vmax=1;Vmin=-1;%速度最值
for i=1:sizepop
    %随机产生一个种群
    pop(i,:)=5*rands(1,2);%初始化粒子 
    %rands(1,2)12列的(01)的随机数
    V(i,:)=rands(1,2);%初始化速度
    %计算粒子的适应度值
    fitness(i)=fun(pop(i,:));
    %将目标优化函数进行适应度值的计算
end
%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
%min返回两个数值 一个是数值最小的 一个是这个最小数值的位置 
zbest=pop(bestindex,:);   %全局最佳
gbest=pop;    %个体最佳
fitnessgbest=fitness;   %个体最佳适应度值
fitnesszbest=bestfitness;   %全局最佳适应度值

%% 迭代寻优
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,:)+0.5*V(j,:);
        pop(j,find(pop(j,:)>popmax))=popmax;
        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)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

%最优个体适应值为0.0328,对应粒子位置在(0.0082-0.0067

二、惯性权重的选择

惯性权重w体现的是粒子当前速度多大程度上继承之前的速度,
较大的惯性权重有利于全局搜索,较小的权重有利于局部搜索。
为了平衡算法的全局与局部搜索能力,提出线性递减惯性权重(Linear Decreasing Inertia Weight,LDIW)粒子群算法案例学习-非线性函数寻优
Wstart 为初始惯性权重;Wend迭代到最大次数时的权重;k为当前的迭代次数;Tmax为最大迭代次数。
一般,初始惯性权重取0.9,迭代到最大次数时的权重取0.4时,算法性能最好。迭代初期保持较大的全局搜索能力,后期能有利于进行精确的局部开发。
常用的惯性权重选择还包括以下几种:
粒子群算法案例学习-非线性函数寻优

三、自适应变异粒子群算法

四、动态粒子群算法

相关标签: 人工智能算法