1 简介
粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食物还有多远。最简单有效的策略?寻找鸟群中离食物最近的个体来进行搜素。PSO算法就从这种生物种群行为特性中得到启发并用于求解优化问题。
用一种粒子来模拟上述的鸟类个体,每个粒子可视为N维搜索空间中的一个搜索个体,粒子的当前位置即为对应优化问题的一个候选解,粒子的飞行过程即为该个体的搜索过程.粒子的飞行速度可根据粒子历史最优位置和种群历史最优位置进行动态调整.粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子单独搜寻的最优解叫做个体极值,粒子群中最优的个体极值作为当前全局最优解。不断迭代,更新速度和位置。最终得到满足终止条件的最优解。
算法流程如下:
1、初始化
首先,我们设置最大迭代次数,目标函数的自变量个数,粒子的最大速度,位置信息为整个搜索空间,我们在速度区间和搜索空间上随机初始化速度和位置,设置粒子群规模为M,每个粒子随机初始化一个飞翔速度。
2、 个体极值与全局最优解
定义适应度函数,个体极值为每个粒子找到的最优解,从这些最优解找到一个全局值,叫做本次全局最优解。与历史全局最优比较,进行更新。
3、 更新速度和位置的公式
4、 终止条件
(1)达到设定迭代次数;(2)代数之间的差值满足最小界限
2 部分代码
%------主函数源程序-周调度(main.m)
%------基本粒子群优化算法(Particle Swarm Optimization)-----------
%------名称:基本粒子群优化算法(PSO)
%------作用:求解优化问题(周调度)
%------说明:全局性,并行性,高效的群体智能算法
%------初始格式化--------------------------------------------------
tic
clear all;
clc;
format short;
%% ------给定水电站初始化条件----------------------------------------------
%------------水电站1---------------------------------------
Vmax1=9015*10^4; %水库容量上限(m3)
Vmin1=7000*10^4; %水库容量下限(m3)
H1=640; %水库容量初始值水位(m)
V1=(2.0554*H1^2-2413.5002*H1+709934.65)*10^4 ; %水库库容与水位的关系
h1=91; %初始水库水头(m)
qr(:,1:7)=[20.4 25.2 22.1 19.3 16.4 23.3 28.6 ]; %水库来水流量(m3/s)
qmax1=44; %水库引用流量上限(m3/s)
qmin1=0; %水库引用流量下限(m3/s)
A1=9.8*10^3; %水库出力系数
k1=0.65; %发电效率
t=8.64*10^4; %水库发电引用流量时间段(s)
fengdian1=[10 15 11 12 16 17 18];%水库1每个时段风电发电量
%-----------水电站2--------------------------------------
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------
q=zeros(N,2*T); %位置随机初始化位置
v=rand(N,2*T); %速度随机初始化速度
%------适应度函数源程序(fitness.m)----------------------------
%% -----------------最后给出计算结果------------------------------------
disp('****************************结果显示*******************************')
Best
disp('水库来水预测流量(米/秒):')
QR1=Qr1(r,:)
QR2=Qr2(r,:)
disp('水库各时段初始水位(米):')
HS1=Hs1(r,:)
HS2=Hs2(r,:)
disp('水库各时段平均库容大小(万立方米):')
VJ1=Vj1(r,:)/(10^4)
VJ2=Vj2(r,:)/(10^4)
disp('水库各时段发电量(万kWh):')
HJ1=Hj1(r,:)
e1=k1*A1*Best(1,1:7).*(HJ1-539.3).*t/(3.6*10^10) %-----************************************
sum(e1)
disp('水库各时段发电量(万kWh):')
HJ2=Hj2(r,:)
e2=k2*A2*Best(1,8:14).*(HJ2-478.28).*t/(3.6*10^10)
sum(e2)
disp('水库平均发电量功率(万kW):')
e1/24
e2/24
disp('水库总发电量(万kWh):')
E
disp('水库各时段弃水量(万立方米):')
Quit1=((quit1(r,:)')/(10^4))'
Quit2=((quit2(r,:)')/(10^4))'
disp('水库总弃水量(万立方米):')
ZQuit1=sum(Quit1)
ZQuit2=sum(Quit1)
%------------------------仿真结果------------------------------------
figure(1)
x=1:7;
subplot(2,3,1),bar(x,Best(:,1:7),'g'),title('引用流量与时段的关系' ),xlabel('时段T'),ylabel('发电水量(米/秒)'),grid
subplot(2,3,2),bar(x,QR1,'b'),title('来水预测流量与时段的关系'),xlabel('时段T'),ylabel('来水量(米/秒)'),grid
subplot(2,3,3),bar(x,VJ1,'c'),title('平均库容与时段的关系'),xlabel('时段T'),ylabel('库容(万立方米)'),grid
x=1:8;
subplot(2,3,4),plot(x,HS1,'b'), hold on ,plot(x,HS1,'*r'), hold off ,title('各时段初始水位与时段的关系'),xlabel('时段T'),ylabel('水位(米)'),grid,
x=1:7;
subplot(2,3,5),bar(x,e1,'m'),title('发电量与时段的关系'),xlabel('时段T'),ylabel('发电量(万kWh)'),grid
subplot(2,3,6),bar(x,Quit1,'k'),title('弃水量与时段的关系'),xlabel('时段T'),ylabel('弃水量(万立方米)'),grid
figure(2)
x=1:7;
subplot(2,3,1),bar(x,Best(:,8:14),'g'),title('引用流量与时段的关系' ),xlabel('时段T'),ylabel('发电水量(米/秒)'),grid
subplot(2,3,2),bar(x,QR2,'b'),title('来水预测流量与时段的关系'),xlabel('时段T'),ylabel('来水量(米/秒)'),grid
subplot(2,3,3),bar(x,VJ2,'c'),title('平均库容与时段的关系'),xlabel('时段T'),ylabel('库容(万立方米)'),grid
x=1:8;
subplot(2,3,4),plot(x,HS2,'b'), hold on ,plot(x,HS2,'*r'), hold off ,title('各时段初始水位与时段的关系'),xlabel('时段T'),ylabel('水位(米)'),grid,
x=1:7;
subplot(2,3,5),bar(x,e2,'m'),title('发电量与时段的关系'),xlabel('时段T'),ylabel('发电量(万kWh)'),grid
subplot(2,3,6),bar(x,Quit2,'k'),title('弃水量与时段的关系'),xlabel('时段T'),ylabel('弃水量(万立方米)'),grid
disp('****************************结果显示*******************************')
%----------------算法结束---DreamSun GL & HF-------------------------------
figure(3)
plot(y)
xlabel('迭代次数')
ylabel('弃水量')
% axis([0 1500 200 300])
toc
3 仿真结果
4 参考文献
[1]夏燕, 冯仲恺, 牛文静,等. 基于混合量子粒子群算法的梯级水电站群调度[J]. 水力发电学报, 2018, 37(11):12.
部分理论引用网络文献,若有侵权联系博主删除。
5 MATLAB代码与数据下载地址
见博客主页