一、粒子群算法简介
1 粒子群算法的概念
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解.网上有关内容很多,也有书籍,不懂可以问。此处略。
2 粒子群算法分析
2.1基本思想
粒子群算法通过设计一种无质量的粒子来模拟鸟群中的鸟,粒子仅具有两个属性:速度和位置,速度代表移动的快慢,位置代表移动的方向。每个粒子在搜索空间中单独的搜寻最优解,并将其记为当前个体极值,并将个体极值与整个粒子群里的其他粒子共享,找到最优的那个个体极值作为整个粒子群的当前全局最优解,粒子群中的所有粒子根据自己找到的当前个体极值和整个粒子群共享的当前全局最优解来调整自己的速度和位置。网上有关内容很多,也有书籍,不懂可以问。此处略。
2 更新规则
PSO初始化为一群随机粒子(随机解)。然后通过迭代找到最优解。在每一次的迭代中,粒子通过跟踪两个“极值”(pbest,gbest)来更新自己。在找到这两个最优值后,粒子通过下面的公式来更新自己的速度和位置。网上有关内容很多,也有书籍,不懂可以问。此处略。
二、部分源代码
% 基于matlab粒子群算法求解梯级水电站调度优化
clc;clear all;close all;
format long;%修改显示数据小数位数
Function_name='F2';%定义函数名
[lb,ub,dim,fobj]=Func(Function_name);% 调用自定义目标函数,返回优化变量范围,维度,句柄
PopNum=10; %种群个数
MaxIter=20;% 最大迭代次数
%调用粒子群算法 返回最优值,最优位置(即最优解 最优策略),最优曲线
[fMin_PSO,bestX_PSO,PSO_curve]=PSO(PopNum,MaxIter,lb,ub,dim,fobj);
%绘图 可视化显示
figure(1)
plot(PSO_curve);
fMin_PSO
bestX_PSO
%% 粒子群优化算法
function [gBestScore,gBest,cg_curve]=PSO(PopNum,MaxIter,lb,ub,dim,fobj)
%% 判断优化变量的上界或下界是否相等
if size(ub,1)==1
ub = ub.*ones(1,dim);% ub 1行8列
lb = lb.*ones(1,dim);
end
%最大速度 %权重上下界
Vmax=6; wMax=0.9; wMin=0.6;
% 两个加速度因子
c1=2; c2=2;
%% 初始化种群
% 给初始化种群分配内存空间
pos=zeros(PopNum,dim);%种群
vel=zeros(PopNum,dim);% 速度
pBestScore=zeros(1,PopNum);%个体最优值
pBest=zeros(PopNum,dim);%个体最优解
gBest=zeros(1,dim);%全局最优值
cg_curve=zeros(1,MaxIter);%全局最优值曲线
% 给初始化种群的位置及速度 赋初值、注意上下界范围
for i=1:PopNum
for j=1:dim
pos(i,j)=(ub(j)-lb(j))*rand()+lb(j);
vel(i,j)=0.3*rand();
end
end
%% 测试函数以及 阶梯水库优化调度目标函数,适应度函数
function [lb,ub,dim,fobj] = Func(F)
switch F
case 'F1'% 测试函数
fobj = @F1;
lb=-50; ub=50; dim=20;
case 'F2'
fobj = @F2;
lb=[211.800000000000,205,202,176.040000000000,164.820357638888,120.895844907407,265.801214120370,260.771649305555];
ub=[212.300000000000,206,203,177.500000000000,230,123,426.900000000000,426.900000000000];
dim=8;
case 'F3'% 多峰测试函数
fobj = @F3;
lb=-50; ub=50; dim=20;
end
end
% 单峰测试函数
function o = F1(x)
% o=sum(-x.*sin(sqrt(abs(x))));
o=sum(x.^2);
end
%% 目标函数的 M 文件
function o=F2(x)
%4个阶梯水库群的水位
x1=x(:,1); x2=x(:, 2); x3=x(:,3); x4=x(:, 4);
%4个阶梯水库群的流量
y1=x(:, 5); y2=x(:, 6); y3=x(:, 7); y4=x(:, 8);
xNum=size(x,1);%x的行数
for i=1:xNum
a=8.63;%%出力综合系数
由于代码限制,全部代码可以发邮箱咨询:807905604@qq.com