人工智能9—粒子群优化算法实验

目录

 

一、粒子群优化算法简介

二、算法流程

三、参数设置比较

1.改变C1参数

2.改变C2参数

3.改变w的范围

4.改变sizepop参数

5.改变dim参数

四、POS的优点

五、核心代码


一、粒子群优化算法简介

粒子群优化算法是一种全局搜索算法,作为进化计算的一个分支,同时它也是一种模拟自然界的生物活动以及群体智能的随机搜索算法。因此粒子群优化算法一方面吸取了人工生命、鸟群觅食、鱼群学习和群理论的思想,另一方面又具有进化算法的特点,和遗传算法、进化策略、进化规划等算法有相似的搜索和优化能力。

PSO中,每个优化问题的解都是粒子,所有的粒子都有一个由被优化的函数决定的适应值,粒子会追随当前的最优粒子在解空间中搜索。PSO初始化为一群随机粒子,然后通过迭代找到最优解,在每一次叠代中,粒子通过跟踪两个“极值”来更新自己。第一个就是粒子本身所找到的最优解,这个解叫做个体极值pBest,另一个极值是整个种群找到的最优解,这个极值是全局极值gBest。另外也可以不用整个种群而只是用其中一部分最优粒子的邻居,那么在所有邻居中的极值就是局部极值。

二、算法流程

1.初始化粒子群体、随机位置和速度

2.根据fitness function评价每个粒子的适应度

3.对每个粒子,将其当前适应值与其个体历史最佳位置pbest对应的适应值做比较,如果当前的适应值更高,则将用当前位置更新历史最佳位置pbest

4.对每个粒子,将其当前适应值与全局最佳位置gbest对应的适应值做比较,如果当前的适应值更高,则将用当前粒子的位置更新全局最佳位置pbest

5.根据公式更新每个粒子的速度和位置

6.如果未满足结束条件,则返回步骤2,通常算法达到最大迭代次数Gmax或者最佳适应度值的增量小于某个给定的阈值时算法停止

三、参数设置比较

初始情况运行结果图如下:

    

函数使用如下:

fun.m

function y = fun(x,label)
%函数用于计算粒子适应度值
%x           input           输入粒子 
%y           output          粒子适应度值 
if label==1
    y=Rastrigin(x);
elseif label==2
    y=Schaffer(x);
else
    y= Griewank(x);
end

Drawfunc.m

function Drawfunc(label)

x=-5:0.05:5;%41列的向量
if label==1
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Rastrigin([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end

if label==2
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Schaffer([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp 
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end

if label==3
    y = x;
    [X,Y] = meshgrid(x,y);
    [row,col] = size(X);
    for  l = 1 :col
         for  h = 1 :row
            z(h,l) = Griewank([X(h,l),Y(h,l)]);
        end
    end
    surf(X,Y,z);
    shading interp 
    xlabel('x1-axis'),ylabel('x2-axis'),zlabel('f-axis'); 
    title('mesh'); 
end

1.改变C1参数

c2=1.49445,sizepop=200,dim=10

(1)c1=1.49445

10次的运行结果最优适应度分别为:3.979836,6.964713,3.979836,3.979836,3.979836,0.000000,2.984877,2.984877,5.969754,5.969754,平均值为4.079331。

(2)c1=1

10次的运行结果最优适应度分别为:4.974795,17.909248,0.994959,2.984877,1.199664,0.000000,2.984877,4.974795,6.964713,3.979836,平均值为4.696776。

(3)c1=1.2

10次的运行结果最优适应度分别为:2.984877,4.974795,5.969754,8.954632,4.974795,3.979836,0.994959,5.969754,3.979836,1.023095,平均值为4.380633。

(4)c1=1.4

10次的运行结果最优适应度分别为:3.979836,0.000000,6.964713,4.974795,4.974795,0.994959,5.969754,1.989918,6.964708,3.979836,平均值为4.079331。

(5)c1=1.6

10次的运行结果最优适应度分别为:1.170269,1.989918,4.974795,1.989918,0.994959,4.974795,3.979836,5.969754,1.989918,0.000000,平均值为2.8034162。

(6)c1=1.8

10次的运行结果最优适应度分别为:7.959672,4.974795,1.989918,1.056934,5.969754,6.964713,2.984877,3.979836,5.969754,4.974795,平均值为4.6828203。

(7)c1=2

10次的运行结果最优适应度分别为:3.979836,3.979836,4.974795,8.954632,4.974795,1.989918,4.974795,2.984877,6.964713,0.994959,平均值为4.477316。

2.改变C2参数

同理在c1最好的情况下求c1=1.49445,sizepop=200,dim=10

c2=1时平均值为3.382862,c2=1.2时平均值为2.188910,c2=1.4时平均值为3.815412,c2=1.6时平均值为2.686411,c2=1.8时平均值为4.178827,c2=2时平均值为4.079356。

由实验结果可知c1=1.6,c2=1.6左右的时候最好。c1是自己的经验,c2是社会经验,当二者为1.6的时候是最优的。加速系数c1和c2代表了向自身极值pbest和全局极值gbest推进的加速权值;c1和c2通常为2,代表着对两个引导方向的同等重视,也存在一些c1和c2不相等的设置,但其范围都在0-4之间;将c1线性减少,c2线性增大的设置能动态平衡算法的多样性和收敛性。

3.改变w的范围

c1=1.6,c2=1.6,sizepop=200,dim=10

(1)w范围设置为0.4-0.9,10次的运行结果最优适应度分别为:0.000000,1.989918,1.989918,5.969754,4.974795,2.984877,0.994964,8.954632,0.994959,7.959672,平均值为3.681348。

(2)w范围设置为0.6-0.9,10次的运行结果最优适应度分别为:2.986192,2.984877,0.994959,0.994959,2.984877,4.974795,4.974795,2.984877,0.000000,7.959672,平均值为2.984000。

(3)w范围设置为0.4-0.7,10次的运行结果最优适应度分别为:3.979836,0.000000,0.994959,0.994959,7.959672,3.979836,0.000000,8.954626,4.974795,3.979836,平均值为3.581851。

(4)w范围设置为0.4-0.8,10次的运行结果最优适应度分别为:1.989918,0.000000,4.974795,4.974795,1.989918,2.984877,1.989918,4.974795,6.964713,4.974795,平均值为3.581852。

w线性递减,由实验结果可知w范围设置为w=0.6-0.9是最优的。惯性权重控制着前一速度对当前速度的影响,用于平衡算法的探索和开发能力,一般设置为从0.9线性递减到0.4,也有非线性递减的设置方案,惯性权重设为0.729的同时将c1和c2设为1.49445有利于算法的收敛。

4.改变sizepop参数

c1=1.6,c2=1.6,w=0.6-0.9,dim=10

(1)sizepop=20

10次的运行结果最优适应度分别为:0.000002,0.994963,24.873951,3.979836,3.979836,5.969757,3.979837,2.984877,2.984877,7.959672,平均值为5.770760。

(2)sizepop=40

10次的运行结果最优适应度分别为:8.954626,5.969754,2.984878,1.989918,8.954626,3.979836,2.984877,8.954626,10.944545,2.984878,平均值为5.870256。

(3)sizepop=100

10次的运行结果最优适应度分别为:2.984877,4.974795,4.974795,5.969754,2.984877,5.969754,0.000000,0.994960,5.969754,7.959673,平均值为4.278323。

(4)sizepop=200

10次的运行结果最优适应度分别为:1.989918,3.979836,6.964713,0.000000,3.979836,1.989918,2.984877,6.964713,3.979836,4.974795,平均值为3.780844。

(5)sizepop=300

10次的运行结果最优适应度分别为:0.994959,0.994959,4.974795,5.969754,0.000000,0.000000,0.000000,0.994959,0.994959,5.969754,平均值为2.089413。

(6)sizepop=500

10次的运行结果最优适应度分别为:0.000000,3.979836,4.974795,4.974795,0.000000,3.979836,0.000000,2.984877,1.989921,4.974795,平均值为2.785885。

是实验结果得sizepop=300是最优的,随着种群规模的增大,算法用时也在增加,当在种群规模到500的时候,可以明显感觉到时间比之前久。种群规模影响者算法的搜索能力和计算量,pos对种群规模要求不高,一般取20-40就可以达到很好的求解效果,不过对于比较难的问题或者特定类别的问题,粒子数可以较高。

5.改变dim参数

c1=1.6,c2=1.6,w=0.6-0.9,sizepop=300

(1)dim=4

10次的运行结果最优适应度都为:0.000000,平均值为0.000000。

(2)dim=7

10次的运行结果最优适应度都为:0.000000,平均值为0.000000。

(3)dim=10

10次的运行结果最优适应度分别为:12.934458,2.984877,1.990186,0.000000,0.994959,3.979874,1.989918,4.974795,2.984877,5.969754,平均值为3.527608。

(4)dim=9

10次的运行结果最优适应度分别为:2.984877,0.994959,3.979836,4.974795,1.989918,4.974795,0.000000,0.000000,3.979836,3.979836,平均值为2.785885。

(5)dim=8

10次的运行结果最优适应度分别为:0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.316742,0.000000,0.000000,0.000000,平均值为0.031674。

由实验结果得dim=7-8之间是临界最优的。

四、POS的优点

简单易行,收敛速度快,设置参数少,是一类不确定算法,概率型的全局优化算法,具有本质并行性等。

五、核心代码


%% 清空环境
clc
clear

%% 参数初始化
%粒子群算法中的三个参数
c1 = 1.6;%加速因子
c2 = 1.6;
%w=0.8   %惯性权重
wmax = 0.6;
wmin = 0.9;

maxgen=1000;   % 进化次s数  
sizepop=300;   %种群规模

Vmax=1;       %限制速度围
Vmin=-1;     
popmax=5;    %变量取值范围
popmin=-5;
dim=8;       %适应度函数维数

func=1;       %选择待优化的函数,1为Rastrigin,2为Schaffer,3为Griewank
Drawfunc(func);%画出待优化的函数,只画出二维情况作为可视化输出

%% 产生初始粒子和速度
for i=1:sizepop
    %随机产生一个种群
    pop(i,:)=popmax*rands(1,dim);    %初始种群
    V(i,:)=Vmax*rands(1,dim);             %初始化速度
                                     %计算适应度
    fitness(i)=fun(pop(i,:),func);   %粒子的适应度
end

%% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
gbest=pop(bestindex,:);   %全局最佳
pbest=pop;                %个体最佳
fitnesspbest=fitness;     %个体最佳适应度值
fitnessgbest=bestfitness; %全局最佳适应度值

%% 迭代寻优
for i=1:maxgen
    
    fprintf('第%d代,',i);
    fprintf('最优适应度%f\n',fitnessgbest);
    for j=1:sizepop
        
        w = wmax - (wmax-wmin)/maxgen*i;
        %速度更新
        V(j,:) = w*V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); %根据个体最优pbest和群体最优gbest计算下一时刻速度
        V(j,find(V(j,:)>Vmax))=Vmax;   %限制速度不能太大
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        
        %w = w-(j*(w-0.3))/maxgen;
        %for k=0.4:w
         %   w=k+0.1;
        %end
        
        %种群更新
        pop(j,:)=pop(j,:)+0.5*V(j,:);       %位置更新
        pop(j,find(pop(j,:)>popmax))=popmax;%坐标不能超出范围
        pop(j,find(pop(j,:)<popmin))=popmin;
        
        if rand>0.98                         %加入变异种子,用于跳出局部最优值
            pop(j,:)=rands(1,dim);
        end
        
        %更新第j个粒子的适应度值
        fitness(j)=fun(pop(j,:),func); 
   
    end
    
    for j=1:sizepop
        
        %个体最优更新
        if fitness(j) < fitnesspbest(j)
            pbest(j,:) = pop(j,:);
            fitnesspbest(j) = fitness(j);
        end
        
        %群体最优更新
        if fitness(j) < fitnessgbest
            gbest = pop(j,:);
            fitnessgbest = fitness(j);
        end
    end 
    yy(i)=fitnessgbest;    
        
end
%% 结果分析
figure;
plot(yy)
title('最优个体适应度','fontsize',12);
xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12);

发布了13 篇原创文章 · 获赞 5 · 访问量 1206

猜你喜欢

转载自blog.csdn.net/qq_43653930/article/details/103367322
今日推荐