1 简介
粒子群算法因其原理简单,易于编程,适于并行计算等优点而得到了广泛的应用.本文探讨和分析了Matlab粒子群算法工具箱,并提出了基于该工具箱来实现水电站优化调度计算的方法.计算实例表明,Matlab粒子群算法工具箱可以很好地用于解决水电站优化调度问题,可获得比动态规划算法更好的精度.
1 算法介绍
1.1 关于速度和位置
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。
鸟被抽象为没有质量和体积的微粒(点),并延伸到N维空间,粒子i在N维空间的位置表示为矢量Xi=(x1,x2,…,xN),飞行速度表示为矢量Vi=(v1,v2,…,vN)。每个粒子都有一个由目标函数决定的适应值(fitness value),并且知道自己到目前为止发现的最好位置(pbest)和现在的位置Xi。这个可以看作是粒子自己的飞行经验。除此之外,每个粒子还知道到目前为止整个群体中所有粒子发现的最好位置(gbest)(gbest是pbest中的最好值),这个可以看作是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
2.2 速度和位置的更新
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。
对于公式(1):
公式(1)的第①部分称为【记忆项】,表示上次速度大小和方向的影响;
公式(1)的第②部分称为【自身认知项】,是从当前点指向粒子自身最好点的一个矢量,表示粒子的动作来源于自己经验的部分;
公式(1)的第③部分称为【群体认知项】,是一个从当前点指向种群最好点的矢量,反映了粒子间的协同合作和知识共享。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的运动。
以上面两个公式为基础,再来看一个公式:
公式(2)和 公式(3)被视为标准PSO算法。
1.3 标准PSO算法的流程
1)初始化一群微粒(群体规模为N),包括随机位置和速度;
2)评价每个微粒的适应度;
3)对每个微粒,将其适应值与其经过的最好位置pbest作比较,如果较好,则将其作为当前的最好位置pbest;
4)对每个微粒,将其适应值与其经过的最好位置gbest作比较,如果较好,则将其作为当前的最好位置gbest;
5)根据公式(2)、(3)调整微粒速度和位置;
6)未达到结束条件则转第2)步。
迭代终止条件根据具体问题一般选为最大迭代次数Gk或(和)微粒群迄今为止搜索到的最优位置满足预定最小适应阈值。
PSO流程图解
2 部分代码
%min (x-3)^2
%s.t. 1<x<4.
clear all
clc
x=zeros(20,1);%粒子位置
v=zeros(20,1);%粒子速度
vmax=(4-1)./5;%最大速度
fx=zeros(20,1);%粒子适应值
pbest=zeros(20,1);%个体最好位置
fpbest=zeros(20,1);%个体最好适应值
gbest=ones(1,1);%全局最好序号
w=0.9;%惯性权重
c1=2.0;%学习因子
c2=2.0;
gmax=200;%最大迭代次数
%初始化
for i=1:20
x(i,1)=1+rand().*(4-1);%初始化粒子位置
tmp = rand().*vmax;%初始化速度
v(i,1)=tmp;
if rand()<0.5
v(i,1)=-1.*tmp;
end
fx(i)=(x(i,1)-3)^2;%每个个体目标函数值
pbest(i,1)=x(i,1);%初始化个体最好
fpbest(i,1)=fx(i);%初始化个体最好适应值
end
t=1;
while t<gmax
w=0.9-0.5.*t/gmax;%更新惯性权重
for i=1:20
v(i,1)=w.*v(i,1)+c1.*rand().*(pbest(i,1)-x(i,1))+c2.*rand().*(pbest(gbest,1)-x(i,1));%速度更新
if v(i,1)>vmax%速度越界判断
v(i,1)=vmax;
end
if v(i,1)<-1.*vmax
v(i,1)=-1*vmax;
end
x(i,1)=x(i,1)+v(i,1);%位置更新
if x(i,1)>4%限幅
x(i,1)=4;
end
if x(i,1)<1
x(i,1)=1;
end
fx(i,1)=(x(i,1)-3)^2;%计算适应值
if fx(i,1)<fpbest(i,1)%更新个体最好
pbest(i,1)=x(i,1);
fpbest(i)=fx(i);
if fpbest(i)<fpbest(gbest)%更新群体最好
gbest=i;
end
end
end
t=t+1;
end
disp('最小值为');
disp(fpbest(gbest));%输出最好目标
disp('对应的x1为');
disp(pbest(gbest,1));%输出最好解
3 仿真结果
4 参考文献
[1]芮钧, 陈守伦. MATLAB粒子群算法工具箱求解水电站优化调度问题[J]. 中国农村水利水电, 2009(1):3.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。**完整代码获取关注微信公众号天天matlab**