粒子群寻优算法及案例说明
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
k 1 k k 1 (2) X id X id Vid 其中,w 为惯性权重,d 为空间维数,d 1, 2,, D; i 1, 2,, n; k 为当前迭代次数; Vid 为粒子的速度; c1 和 c2 是非负的常数,称为加速度因子; r1 和 r2 是分布于 [0,1] 区间的随 机数。为防止粒子的盲目搜索,一般建议将其位置和速度限制在一定的区间 [ X max , X max ] , [Vmax ,Vmax ] 。
%初始种群
V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 %% 迭代寻优 for i=1:maxgen for j=1:sizepop %速度更新 V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest pop(j,:)); V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); pop(j,find(pop(j,:)>popmax))=popmax; pop(j,find(pop(j,:)<popmin))=popmin; %适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) < fitnessgbest(j) gbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) < fitnesszbest zbest = pop(j,:); fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end s(k,:)=yy; end %% 结果分析 for m=1:300 s(101,m)=sum( s(:,m) )/100;%把100次得到的最优值平均
来自百度文库
V(j,:) =w* V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:)); V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); pop(j,find(pop(j,:)>popmax))=popmax; pop(j,find(pop(j,:)<popmin))=popmin; %适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) < fitnessgbest(j) gbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) < fitnesszbest zbest = pop(j,:); fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end s(k,:)=yy; end %% 结果分析 for m=1:300 s(101,m)=sum( s(:,m) )/100;%将100次得到的最优值平均 end plot(s(101,:),'b-') title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 七、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取函数w=ws-(ws-we)*(i/maxgen)^2。 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445;
pop(j,find(pop(j,:)<popmin))=popmin; %新粒子适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) <fitnessgbest(j)%如果得到的新粒子适应度值小于原来的个体极 值适应度值 gbest(j,:) = pop(j,:);%将个体位置赋值给个体极值位置 fitnessgbest(j) = fitness(j);将个体适应度值赋给个体极值适应度值 end %群体最优更新 if fitness(j) < fitnesszbest%如果得到的新粒子适应度值小于原来的群体极值 适应度值 zbest = pop(j,:); %将个体位置赋值给群体极值位置 fitnesszbest = fitness(j); %将个体适应度值赋给群体极值适应度值 end end yy(i)=fitnesszbest; %将每代最优值记录到yy数组 end %% 结果分析 plot(yy) title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 五、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取常数1。 %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; %进化次数 sizepop=20; %种群规模 Vmax=1; Vmin=-1; popmax=5; popmin=-5; for k=1:100 %% 产生初始粒子和速度 k for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2);
《智能优化算法》作业之粒子群算法寻优
PSO算法首先在可行解空间中初始化一群粒子, 每个粒子都代表极值优化问题的一个潜 在最优解,用位置、速度和适应度值三项指标表示该粒子特征,适应度值由适应度函数计 算得到,其值的好坏表示粒子的优劣。PSO算法初始化为一群随机粒子后,会得到相应的随 机解,然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己: 第一个就是粒子本身所找到的最优解, 这个解称为个体极值;另一个就是整个种群目前找到 的最优解,这个极值是全局极值。 在每次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,即 k 1 k k k k k Vid wVid c1r1( P id X id ) cr( P gd X id ) (1)
end plot(s(101,:),'k') title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 六、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取函数w=ws-(ws-we)*i/maxgen。 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; %进化次数 sizepop=20; %种群规模 Vmax=1; Vmin=-1; popmax=5; popmin=-5; ws=0.9; we=0.4; for k=1:100 %% 产生初始粒子和速度 k for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2); %初始种群 V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 %% 迭代寻优 for i=1:maxgen w(i)=ws-(ws-we)*i/maxgen%计算惯性权重值 for j=1:sizepop %速度更新
在速度更新的公式(1)中有三部分组成:第一部分为惯性或动量部分,反映了粒子运动 习惯,代表粒子有维持自己先前速度的趋势;第二部分为认知部分,反映了粒子对自身历史经 验的记忆或回忆,代表粒子有向自身历史最佳位置逼近的趋势;第三部分为社会部分,反映了 粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋 势 。 惯性权重,它使粒子保持运动惯性,使其扩展搜索空间的趋势,有能力搜索新的区域。它 可以取一常数作为固定的权重值,也可以取一个函数作为在迭代过程中改变的权重值,通常用 线性递减的惯性权重。在算法初期,全局搜索能力较强,如果找不到最优值的位置,随着权重 值的减少,局部搜索能力加强,容易陷入局部极值,然而选取步长较小的线性递减惯性权重, 权重的变化幅度较小,不易陷入局部最优。关于步长的大小变化对结果的影响可以在后面的程 序结果中比较得到 PSO算法的优势是采用实数编码,不需要像遗传算法一样采用二进制编码。
三、随机产生20个初始粒子作为一个种群规模来求出个体最佳位置及群体最佳位置,以及 相应的个体最佳适应度值及全局最佳适应度值 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; % 进化次数 sizepop=20; %种群规模 Vmax=1;%速度最大值 Vmin=-1;%速度最小值 popmax=5;%位置最大值 popmin=-5;位置最小值 %% 产生初始粒子和速度 for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2); %初始种群 V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 四、迭代300次,即用300个种群规模为20的种群来进行寻优,此时惯性权重取常数1。 %% 迭代寻优 for i=1:maxgen for j=1:sizepop %速度更新 V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest pop(j,:)); %如果更新后的粒子速度大于给定的速度最大值,则将其记为速度最大值 V(j,find(V(j,:)>Vmax))=Vmax; %如果更新后的粒子速度小于给定的速度最小值,则将其记为速度最小值 V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); %如果更新后的粒子位置大于给定的位置最大值,则将其记为位置最大值 pop(j,find(pop(j,:)>popmax))=popmax; %如果更新后的粒子位置小于给定的位置最小值,则将其记为位置最小值
下面用PSO算法来寻找非线性函数
f ( x) x2 y 2 10cos(2 x) 10cos(2 y) 20
的极小值 一、适应度函数代码如下: function y = fun(x) %函数用于计算粒子适应度值 %x input 输入粒子 %y output 粒子适应度值 y=x(1).^2+x(2).^2-10*cos(2*pi*x(1))-10*cos(2*pi*x(2))+20; %适应度函数取的是函数本身。 二、画出所求函数图像,估计最优极值及其位置,以此来验证所求结果的准确性 clear,clc,close all; %% rastrigrin function [x,y]=meshgrid(-5:0.1:5,-5:0.1:5); z=x.^2+y.^2-10*cos(2*pi*x)-10*cos(2*pi*y)+20; mesh(x,y,z)
%初始种群
V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 %% 迭代寻优 for i=1:maxgen for j=1:sizepop %速度更新 V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest pop(j,:)); V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); pop(j,find(pop(j,:)>popmax))=popmax; pop(j,find(pop(j,:)<popmin))=popmin; %适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) < fitnessgbest(j) gbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) < fitnesszbest zbest = pop(j,:); fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end s(k,:)=yy; end %% 结果分析 for m=1:300 s(101,m)=sum( s(:,m) )/100;%把100次得到的最优值平均
来自百度文库
V(j,:) =w* V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:)); V(j,find(V(j,:)>Vmax))=Vmax; V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); pop(j,find(pop(j,:)>popmax))=popmax; pop(j,find(pop(j,:)<popmin))=popmin; %适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) < fitnessgbest(j) gbest(j,:) = pop(j,:); fitnessgbest(j) = fitness(j); end %群体最优更新 if fitness(j) < fitnesszbest zbest = pop(j,:); fitnesszbest = fitness(j); end end yy(i)=fitnesszbest; end s(k,:)=yy; end %% 结果分析 for m=1:300 s(101,m)=sum( s(:,m) )/100;%将100次得到的最优值平均 end plot(s(101,:),'b-') title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 七、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取函数w=ws-(ws-we)*(i/maxgen)^2。 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445;
pop(j,find(pop(j,:)<popmin))=popmin; %新粒子适应度值 fitness(j)=fun(pop(j,:)); end for j=1:sizepop %个体最优更新 if fitness(j) <fitnessgbest(j)%如果得到的新粒子适应度值小于原来的个体极 值适应度值 gbest(j,:) = pop(j,:);%将个体位置赋值给个体极值位置 fitnessgbest(j) = fitness(j);将个体适应度值赋给个体极值适应度值 end %群体最优更新 if fitness(j) < fitnesszbest%如果得到的新粒子适应度值小于原来的群体极值 适应度值 zbest = pop(j,:); %将个体位置赋值给群体极值位置 fitnesszbest = fitness(j); %将个体适应度值赋给群体极值适应度值 end end yy(i)=fitnesszbest; %将每代最优值记录到yy数组 end %% 结果分析 plot(yy) title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 五、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取常数1。 %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; %进化次数 sizepop=20; %种群规模 Vmax=1; Vmin=-1; popmax=5; popmin=-5; for k=1:100 %% 产生初始粒子和速度 k for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2);
《智能优化算法》作业之粒子群算法寻优
PSO算法首先在可行解空间中初始化一群粒子, 每个粒子都代表极值优化问题的一个潜 在最优解,用位置、速度和适应度值三项指标表示该粒子特征,适应度值由适应度函数计 算得到,其值的好坏表示粒子的优劣。PSO算法初始化为一群随机粒子后,会得到相应的随 机解,然后通过迭代找到最优解。在每一次迭代中,粒子通过跟踪两个极值来更新自己: 第一个就是粒子本身所找到的最优解, 这个解称为个体极值;另一个就是整个种群目前找到 的最优解,这个极值是全局极值。 在每次迭代过程中,粒子通过个体极值和群体极值更新自身的速度和位置,即 k 1 k k k k k Vid wVid c1r1( P id X id ) cr( P gd X id ) (1)
end plot(s(101,:),'k') title('最优个体适应度','fontsize',12); xlabel('进化代数','fontsize',12);ylabel('适应度','fontsize',12); 六、迭代300次,即用300个种群规模为20的种群来进行寻优,并将这个过程进行100次后, 再取其最优值的平均值,此时惯性权重取函数w=ws-(ws-we)*i/maxgen。 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; %进化次数 sizepop=20; %种群规模 Vmax=1; Vmin=-1; popmax=5; popmin=-5; ws=0.9; we=0.4; for k=1:100 %% 产生初始粒子和速度 k for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2); %初始种群 V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 %% 迭代寻优 for i=1:maxgen w(i)=ws-(ws-we)*i/maxgen%计算惯性权重值 for j=1:sizepop %速度更新
在速度更新的公式(1)中有三部分组成:第一部分为惯性或动量部分,反映了粒子运动 习惯,代表粒子有维持自己先前速度的趋势;第二部分为认知部分,反映了粒子对自身历史经 验的记忆或回忆,代表粒子有向自身历史最佳位置逼近的趋势;第三部分为社会部分,反映了 粒子间协同合作与知识共享的群体历史经验,代表粒子有向群体或邻域历史最佳位置逼近的趋 势 。 惯性权重,它使粒子保持运动惯性,使其扩展搜索空间的趋势,有能力搜索新的区域。它 可以取一常数作为固定的权重值,也可以取一个函数作为在迭代过程中改变的权重值,通常用 线性递减的惯性权重。在算法初期,全局搜索能力较强,如果找不到最优值的位置,随着权重 值的减少,局部搜索能力加强,容易陷入局部极值,然而选取步长较小的线性递减惯性权重, 权重的变化幅度较小,不易陷入局部最优。关于步长的大小变化对结果的影响可以在后面的程 序结果中比较得到 PSO算法的优势是采用实数编码,不需要像遗传算法一样采用二进制编码。
三、随机产生20个初始粒子作为一个种群规模来求出个体最佳位置及群体最佳位置,以及 相应的个体最佳适应度值及全局最佳适应度值 %% 清空环境 clc clear %% 参数初始化 %粒子群算法中的两个参数 c1 = 1.49445; c2 = 1.49445; maxgen=300; % 进化次数 sizepop=20; %种群规模 Vmax=1;%速度最大值 Vmin=-1;%速度最小值 popmax=5;%位置最大值 popmin=-5;位置最小值 %% 产生初始粒子和速度 for i=1:sizepop %随机产生一个种群 pop(i,:)=5*rands(1,2); %初始种群 V(i,:)=rands(1,2); %初始化速度 %计算适应度 fitness(i)=fun(pop(i,:)); %染色体的适应度 end %% 个体极值和群体极值 [bestfitness bestindex]=max(fitness); zbest=pop(bestindex,:); %全局最佳 gbest=pop; %个体最佳 fitnessgbest=fitness; %个体最佳适应度值 fitnesszbest=bestfitness; %全局最佳适应度值 四、迭代300次,即用300个种群规模为20的种群来进行寻优,此时惯性权重取常数1。 %% 迭代寻优 for i=1:maxgen for j=1:sizepop %速度更新 V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest pop(j,:)); %如果更新后的粒子速度大于给定的速度最大值,则将其记为速度最大值 V(j,find(V(j,:)>Vmax))=Vmax; %如果更新后的粒子速度小于给定的速度最小值,则将其记为速度最小值 V(j,find(V(j,:)<Vmin))=Vmin; %种群更新 pop(j,:)=pop(j,:)+V(j,:); %如果更新后的粒子位置大于给定的位置最大值,则将其记为位置最大值 pop(j,find(pop(j,:)>popmax))=popmax; %如果更新后的粒子位置小于给定的位置最小值,则将其记为位置最小值
下面用PSO算法来寻找非线性函数
f ( x) x2 y 2 10cos(2 x) 10cos(2 y) 20
的极小值 一、适应度函数代码如下: function y = fun(x) %函数用于计算粒子适应度值 %x input 输入粒子 %y output 粒子适应度值 y=x(1).^2+x(2).^2-10*cos(2*pi*x(1))-10*cos(2*pi*x(2))+20; %适应度函数取的是函数本身。 二、画出所求函数图像,估计最优极值及其位置,以此来验证所求结果的准确性 clear,clc,close all; %% rastrigrin function [x,y]=meshgrid(-5:0.1:5,-5:0.1:5); z=x.^2+y.^2-10*cos(2*pi*x)-10*cos(2*pi*y)+20; mesh(x,y,z)