zoukankan      html  css  js  c++  java
  • 粒子群算法

     

    粒子群算法是基于鸟群觅食的行为提出来的,每一个单一个体鸟视为搜索空间的一个粒子,都被视为问题的可能解,每个粒子都有一个由待优化函数决定的适应度函数,通过适应度值迭代更新粒子的位置和速度

    粒子速度和位置的维度由问题的未知量决定,例如,求sin(∑i=1 to kxi-4)的最小值,如果k=2,那么速度V和位置X就是二维的,如果k=20,那么V和X都是20维的

    设粒子i的历史最优位置为p,种群粒子的历史最优位置为pg,粒子按照下式来更新位置和速度:

    v=w*v+c1r1(p-x)+c2r2(pg-x) c1和c2是加速常数,r1和r2是[0,1]之间的随机数

    x=x+v

    w*x表示粒子有维持自身速度的趋势,c1r1(p-x)表示粒子有向粒子历史最优位置移动的趋势,c2r2(pg-x)表示粒子有想群体最优位置逼近的趋势

    算法流程:

    1,初始化粒子群体,包括粒子种群数,每个粒子的速度和位置

    2,计算各个粒子的适应度值

    3,对于每个粒子,用它的适应度值与个体极值比较,如果fit>p,就p=fit

    4,比较p和pg如果,p>pg,那么pg=p

    5,根据上面的两式更新x和v

    6,直到满足条件,否则返回2

    下面的例子是由matlab实现的

    function pso()
    c1=2;
    N=50;
    D=30;
    M=500;
    c2=2;
    w=0.7;
    xx=zeros(1,D);
    F=fitnessfunction(xx);
    [x,y]=tso(@fitnessfunction,c1,c2,w,N,D,M);
    end
    %适应度函数
    function F=fitnessfunction(x)
    F=0;
    for i=1:30
        F=F+x(i)^2+x(i)-6;
    end
    end
    
    function [x,y]=tso(fitness,c1,c2,w,N,D,M)
    %初始化位置和速度 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,:) for i=1:(N-1) if fitness(x(i,:))<fitness(pg) pg=x(i,:); end end
    %更新速度和位置,相应地,随着迭代的进行,个体极值和全局极致也在变化 for i=1:M for j=1:N v(j,:)=w*v(j,:)+c1*rand*(y(j,:)-x(j,:))+c2*rand*(pg-x(j,:)); x(j,:)=x(j,:)+v(j,:); if fitness(x(j,:))<p(j) p(j)=fitness(x(j,:)); y(j,:)=x(j,:); end if p(j)<fitness(pg) pg=y(j,:) end end end disp('the position is:') x=pg' disp('the value is') y=fitness(pg) end
  • 相关阅读:
    关于MySQL错误 2005
    Eclipse如何导入第三方jar包
    Codeforces Round #377 (Div. 2) D. Exams
    18110 Koishi's travel, Satori's travel
    用Java做的类似皇家守卫战的游戏
    Notepad++如何编译、运行Java
    Codeforces Round #341 (Div. 2)--C. Wet Shark and Flowers
    hdu 2120 Ice_cream's world I
    FZU 1851 组合数
    HUST 1599 Multiple
  • 原文地址:https://www.cnblogs.com/semen/p/6886283.html
Copyright © 2011-2022 走看看