Java教程

【优化调度】基于粒子群算法求解水火电调度优化问题含Matlab源码

本文主要是介绍【优化调度】基于粒子群算法求解水火电调度优化问题含Matlab源码,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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源码的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!