zoukankan      html  css  js  c++  java
  • PSO粒子群算法及matlab实现

    1原理:

    根据鸟类寻食的仿生学,结合个体的最优解和群体的最优解不断地迭代来寻找区域的最优解。
    在N维的目标空间中,有m个粒子组成一个群体,
    第i个粒子的位置表示为:
    每个位置对应一个潜在解,把代入适应函数中即可得到对应的适应值。
    粒子个体经过的最好的位置为:
    整个群体的最优位置为:
    粒子i的速度为:
    粒子群位置根据以下公式进行跟新:




    PSO的参数选取:
    粒子数m,个数越多越容易找到全局最优解,但程序耗时长。
    惯性因子w,越大越容易找到全局最优解,但可能对局部的搜索能力不好
    加速常数c1和c2,选取无特定规则,一般都选为1.

    2程序实现

    本程序可以求解一个一维上的最优解,多维可以仿照实现。
    代码:

      

    clc,clear
    %%
    %define the function
    
    fitness=inline('(2.1*(1-x+2*x.^2).*exp(-x.^2/2))+sin(x)+x','x');
    
    %%
    E0=0.001;
    Max_num=50;
    particlesize=30;
    c1=0.5;
    c2=1;
    w=0.3;
    vc=0.5;
    vmax=0.6;
    x=-5+10*rand(particlesize,1);
    v=1*rand(particlesize,1);
    %%
    f=fitness(x);
    personalbest_x=x;
    personalbest_f=f;
    
    [groupbest_f i]=max(personalbest_f);
    groupbest_x=x(i);
    for j=1:Max_num
           v=w*v+c1*rand*(personalbest_x-x)+c2*rand*(groupbest_x*ones(particlesize,1)-x);
            for kk=1:particlesize
                  if v(kk)>vmax
                         v(kk)=vmax;
                  else if v(kk)<-vmax
                          v(kk)=-vmax;
                      end
                  end
            end
            x=x+vc*v;
         f=fitness(x);
         for kk=1:particlesize
             if f(kk)>personalbest_f(kk)
                 personalbest_f(kk)=f(kk);
                 personalbest_x(kk)=x(kk);
             end
         end
         [groupbest_f i]=max(personalbest_f);
         groupbest_x=x(i);
         ddd(j)=groupbest_f;
    end
       str=num2str(groupbest_f)
       %%
    subplot(2,1,1)
      x_0=-5:0.01:5;
      f_0=fitness(x_0);
    plot(x_0,f_0,'r','linewidth',2);
    hold on
    plot(groupbest_x,groupbest_f,'b+','linewidth',6);
    legend('所求函数','最优解位置');
    subplot(2,1,2)
    plot(1:Max_num,ddd,'linewidth',2);
    legend('最优解的变化');
    xlabel('迭代次数');
    ylabel(str);

    注:运行时间(i5,8G,win7,64位),1s左右

    程序输出:

  • 相关阅读:
    java单例设计模式
    java实现直接排序冒泡排序二分查找数组反转
    使用LinkedList模拟洗牌功能
    使用LinkedList实现堆栈和队列数据结构存储方式
    Jdeveloper运行缓慢或启动报错【Unable to create an instance of the Java Virtual Machine】解决方法
    java线程——守护线程
    OAF常用配置文件(Profile)
    pl/sql动态根据cursor插入数据(含'&等特殊字符)
    java多线程介绍(二)
    eclipse 3.6 + tomcat 6.0 开发SSH框架学习
  • 原文地址:https://www.cnblogs.com/jacksin/p/8830787.html
Copyright © 2011-2022 走看看