基本信息
源码名称:【优化求解】模拟退火结合粒子群优化算法matlab源码
源码大小:0.78KB
文件格式:.zip
开发语言:MATLAB
更新时间:2021-07-11
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

1 引言

  粒子群算法(Partical Swarm Optimization -PSO)是1995年由Eberhart博士和kennedy 博士共同提出的一种优化算法[1] [2]。它属于群智能算法的一种,和遗传算法相似,它也是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。但是粒子群算法比遗传算法规则更为简单,它没有遗传算法的“交叉”和“变异”操作,它通过追随当前搜索到的最优值来寻找全局最优。这种算法以其实现容易、精度高等优点引起了学术界的重视,并且在解决实际问题中展示了其优越性[3]。

  在标准PSO算法中由于粒子的移动没有选择性,即使粒子的下一个位置的评价函数值很差,粒子依然用这个位置代替当前位置,这就使粒子容易跳出最优解附近的某一邻域,在一定程度上使PSO方法在局部搜索能力上表现较差。因此将粒子群算法与模拟退火算法相结合,利用退火算法在一定概率控制下暂时接受一些劣质解的特性,改善了标准PSO算法的局部寻优能力,并给出了仿真实例,结果证明所提算法具有更好的优化效果。

2 标准粒子群算法

  PSO算法通过个体间的协作与竞争,实现复杂空间中最优解的搜索。PSO先生成初始种群,即在可行解空间中随机初始化一群粒子,每个粒子都为优化问题的一个解,并由目标函数为之确定一个适应值(Fitness Value)。每个粒子将在解空间中运动,并由一个速度决定其方向和距离。通常粒子将追随当前的最优粒子而动,并经逐代搜索,最后得到最优解。

3 模拟退火算法与粒子群算法的结合

  针对上述情况,我们在PSO中引入了模拟退火思想,利用退火算法在一定概率控制下暂时接受一些劣质解的特性改进标准PSO。仿真结果表明,基于模拟退火的粒子群算法能够得到更好的优化效果。

  通过对改进后的算法的研究,发现在粒子运动过程中,当粒子下一代位置比当前位置好时,粒子移动到下一代位置;反之,若下一代位置比当前位置差,则粒子并不直接移动到下一代位置,而是以某一概率进行移动,且通过温度 来控制这一概率。这样粒子不会盲目的直接扑向下一代位置,而是以某种概率“试探”后再行动。因此,当温度下降的足够慢时,粒子不会轻易的跳出有“希望”的搜索区域,从而增强了粒子的局部搜索能力。

4 部分代码

function [xm,fv] = SAPSO(fitness,N,c1,c2,wmax,wmin,M,D)
format long;
%------初始化种群的个体------------

for i=1:N

    for j=1:D

        x(i,j)=randn;  %随机初始化位置

        v(i,j)=randn;  %随机初始化速度

    end

end

%------先计算各个粒子的适应度----------------------

for i=1:N

    p(i)=fitness(x(i,:));

    y(i,:)=x(i,:);

end

pg=x(N,:);             %Pg为全局最优

for i=1:(N-1)

    if fitness(x(i,:))<fitness(pg)

        pg=x(i,:);

    end

end

%------进入主要循环------------

for t=1:M

    for j=1:N
        fv(j) = fitness(x(j,:));
    end
    fvag = sum(fv)/N;
    fmin = min(fv);
    for i=1:N

        if fv(i) <= fvag
            w = wmin   (fv(i)-fmin)*(wmax-wmin)/(fvag-fmin);
        else
            w = wmax;
        end
        v(i,:)=w*v(i,:) c1*rand*(y(i,:)-x(i,:)) c2*rand*(pg-x(i,:));

        x(i,:)=x(i,:) v(i,:);

        if fitness(x(i,:))<p(i)

            p(i)=fitness(x(i,:));

            y(i,:)=x(i,:);

        end

        if p(i)<fitness(pg)

            pg=y(i,:);

        end

    end

end

xm = pg';

fv = fitness(pg);