偶然看到自动驾驶的四项关键技术:环境感知,行为决策,路径规划和运动控制。然后看到用了粒子群优化算法。

粒子群优化算法听了很多,但是没有真正研究过,今天稍微看了下,心得如下。

【What】通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。


鸟群觅食现象

 

粒子群优化算法

鸟群

 

搜索空间的一组有效解

觅食空间

 

问题的搜索空间

飞行速度

类比

解的速度向量

所在位置

 

解的位置向量

个体认知和与群体协作

 

速度与位置的更新

找到食物

 

找到全局最优解

公式不好打,这里就不打了。下面这个链接里对粒子群滤波有很白话的讲解。


【Where】粒子群算法从提出以来就受到很大重视,个人觉得比遗传算法还简单点。应用场景随便取几个:路径规划,滤波定位,电力机组组合,顺风车路径等等。随便取知网搜下粒子群应用的论文,很多。

【How】了解一个算法后,最后的目的还是使用。这里贴一下别人做好的简单的MATLAB程序。我做了修改,使权重逐渐减小,目的是使快速达到全局最优,最后收敛到局部最优。

tic   %该函数表示计时开始  
%------初始格式化--------------------------------------------------  
clear all;  
clc;  
format long;  
%------给定初始化条件----------------------------------------------  
c1=1.4962;             %加速常数即学习因子1  
c2=1.4962;             %加速常数即学习因子2 
wmax=0.9;              %最大惯性权重
wmin=0.4;              %最小惯性权重
%w=0.7298;              %惯性权重  
MaxDT=10000;           %最大迭代次数  
D=10;                  %搜索空间维数(测试函数sphere中未知数个数)  
N=40;                  %初始化群体个体数目  
eps=10^(-7);           %设置精度(在已知最小值时候用)  
%------初始化种群的个体(可以在这里限定位置和速度的范围)------------  
for i=1:N  
    for j=1:D  
        x(i,j)=randn;  %产生一个服从正态分布的随机数作为初始化位置  
        v(i,j)=randn;  %产生一个服从正态分布的随机数作为初始化速度  
    end  
end  
%------先计算各个粒子的适应度,并初始化个体最优位置y和全局最优位置Pg--------  
for i=1:N  
    p(i)=sphere(x(i,:),D);%计算适应度,测试函数为sphere  
    y(i,:)=x(i,:);    %初始化个体最优位置y为在时间步t=0时的粒子位置  
end  
Pg=x(1,:);             %Pg为全局最优位置  
for i=2:N  
    if sphere(x(i,:),D)<sphere(Pg,D)  
        Pg=x(i,:);%更新全局最优位置  
    end  
end  
%------进入主要循环,按照公式依次迭代,直到满足精度要求------------  
for t=1:MaxDT  
    for i=1:N  
        w = wmax - t*(wmax-wmin)/MaxDT;
        v(i,:)=w*v(i,:)+c1*rand*(y(i,:)-x(i,:))+c2*rand*(Pg-x(i,:));  
        x(i,:)=x(i,:)+v(i,:);  
        if sphere(x(i,:),D)<p(i)  
            p(i)=sphere(x(i,:),D);%更新适应度  
            y(i,:)=x(i,:);%更新个体最佳位置  
        end  
        if p(i)<sphere(Pg,D)  
            Pg=y(i,:);%更新群体最佳位置  
        end  
        
    end  
    Pbest(t)=sphere(Pg,D);%保存每一代的群体最佳位置  
end  
toc %该函数表示计时结束  
%------最后给出计算结果  
disp('*************************************************************')      
disp('函数的全局最优位置为:')  
for i=1:D  
    fprintf('x(%d)=%s\n',i,Pg(i));  
end  
fprintf('最后得到的优化极值为:%s\n',sphere(Pg,D));  
disp('*************************************************************')
%适应度函数源程序(sphere.m)  
%参数x为变量名,参数D为维数  
function result=sphere(x,D)  
sum=0;  
for i=1:D  
    sum=sum+x(i)^2;  
end  
result=sum;

%%%%%%%%%%%%%%%%%结果

时间已过 1.990896 秒。

 *************************************************************
函数的全局最优位置为:
x(1)=-3.157453e-18
x(2)=-7.122292e-18
x(3)=1.224156e-18
x(4)=-6.638475e-18
x(5)=-2.106536e-17
x(6)=-7.853146e-18
x(7)=1.743824e-18
x(8)=-8.920879e-18
x(9)=8.927001e-18
x(10)=-1.042553e-19
最后得到的优化极值为:7.740109e-34

*************************************************************

时间比原来快了1S左右,还可以通过其他方法改进,使得速度更快的,因为只花了半天时间去了解。想深究的多看看论文。看看他人的方法。

还有一篇博士论文,我看了开头部分,对理解算法去看博士论文是很好的一个方法。李整. 基于粒子群优化算法的机组组合问题的研究[D]. 华北电力大学(北京), 华北电力大学, 2016.

这是第一篇博客,大佬们求轻喷,希望大家有好的职业规划和方向。