粒子群算法案例学习-非线性函数寻优
程序员文章站
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)1行2列的(0,1)的随机数
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时,算法性能最好。迭代初期保持较大的全局搜索能力,后期能有利于进行精确的局部开发。
常用的惯性权重选择还包括以下几种:
三、自适应变异粒子群算法
四、动态粒子群算法
上一篇: JS,Python和Java 7的学习算法:七巧板
下一篇: POJ 3984 迷宫问题
推荐阅读