粒子群算法和蟻群算法,粒子群算法及其matlab實現

 2023-12-25 阅读 38 评论 0

摘要:粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于對鳥群覓食行為的研究。設想這樣一個場景:一群鳥在隨機搜尋食物,在這個區域里只有一塊食物,所有的鳥都不知道食物在哪里,但

粒子群算法( Particle Swarm Optimization, PSO)最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于對鳥群覓食行為的研究。設想這樣一個場景:一群鳥在隨機搜尋食物,在這個區域里只有一塊食物,所有的鳥都不知道食物在哪里,但是它們知道當前的位置離食物還有多遠。最簡單有效的策略?尋找鳥群中離食物最近的個體來進行搜素。PSO算法就從這種生物種群行為特性中得到啟發并用于求解優化問題。

用一種粒子來模擬上述的鳥類個體,每個粒子可視為N維搜索空間中的一個搜索個體,粒子的當前位置即為對應優化問題的一個候選解,粒子的飛行過程即為該個體的搜索過程.粒子的飛行速度可根據粒子歷史最優位置和種群歷史最優位置進行動態調整.粒子僅具有兩個屬性:速度和位置,速度代表移動的快慢,位置代表移動的方向。每個粒子單獨搜尋的最優解叫做個體極值,粒子群中最優的個體極值作為當前全局最優解。不斷迭代,更新速度和位置。最終得到滿足終止條件的最優解。
粒子群算法是一門新興算法,此算法與遺傳算法有很多相似之處,其收斂于全局最優解的概率很大。
①相較于傳統算法計算速度非常快,全局搜索能力也很強;
②PSO對于種群大小不十分敏感,所以初始種群設為500-1000,速度影響也不大;
③粒子群算法適用于連續函數極值問題,對于非線性、多峰問題均有較強的全局搜索能力。
在群鳥覓食模型中,每個個體都被看成一個粒子,則群鳥可以被看成一個粒子群。假設在一個D維空間里,有m個粒子組成一個群體,其中第i個粒子(i=1,2,…,m)位置表示xi=(xi1,xi2,...,xiD)x_i=(x_i^1,x_i^2,...,x_i^D)xi?=(xi1?,xi2?,...,xiD?),即第i個粒子在D維空間的最好位置是xix_ixi?,粒子個體經歷的最好位置記為Pi=(pi1,pi2,...,piD)P_i=(p_i^1,p_i^2,...,p_i^D)Pi?=(pi1?,pi2?,...,piD?),整個群體所有粒子經歷的最好位置記為Pg=(pg1,pg2,...,pgD)P_g=(p_g^1,p_g^2,...,p_g^D)Pg?=(pg1?,pg2?,...,pgD?)。粒子速度記為Vi=(vi1,vi2,...,viD)V_i=(v_i^1,v_i^2,...,v_i^D)Vi?=(vi1?,vi2?,...,viD?)
粒子采用如下算法對粒子所在的位置進行不斷的更新(單位時間1):
vid=wvid+c1r1(pid?xid)+c2r2(pgd?xid)v_i^d=wv_i^d+c_1r_1(p_i^d-x_i^d)+c_2r_2(p_g^d-x_i^d)vid?=wvid?+c1?r1?(pid??xid?)+c2?r2?(pgd??xid?)
xid=xid+avidx_i^d=x_i^d+av_i^dxid?=xid?+avid?
其中,i=1,2,...,m;d=1,2,...,D;wi=1,2,...,m;d=1,2,...,D;wi=1,2,...,m;d=1,2,...,D;w是非負數,稱為加速因子;加速常數c1c_1c1?c2c_2c2?是常數;r1r_1r1?r2r_2r2?是[0,1]范圍內變換的隨機數;aaa是約束因子,目的是控制速度權重。此外,vidv_i^dvid?屬于[?vmaxd,vmaxd][-v_{max}^d,v_{max}^d][?vmaxd?,vmaxd?]

function main()
clc;clear all;close all;
tic;                              %程序運行計時
E0=0.001;                        %允許誤差
MaxNum=100;                    %粒子最大迭代次數
narvs=1;                         %目標函數的自變量個數
particlesize=30;                    %粒子群規模
c1=2;                            %每個粒子的個體學習因子,也稱為加速常數
c2=2;                            %每個粒子的社會學習因子,也稱為加速常數
w=0.6;                           %慣性因子
vmax=0.8;                        %粒子的最大飛翔速度
x=-5+10*rand(particlesize,narvs);     %粒子所在的位置
v=2*rand(particlesize,narvs);         %粒子的飛翔速度
%用inline定義適應度函數以便將子函數文件與主程序文件放在一起,
%目標函數是:y=1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2))
%inline命令定義適應度函數如下:
fitness=inline('1/(1+(2.1*(1-x+2*x.^2).*exp(-x.^2/2)))','x');
%inline定義的適應度函數會使程序運行速度大大降低
for i=1:particlesizefor j=1:narvsf(i)=fitness(x(i,j));end
end
personalbest_x=x;
personalbest_faval=f;
[globalbest_faval i]=min(personalbest_faval);
globalbest_x=personalbest_x(i,:);
k=1;
while k<=MaxNumfor i=1:particlesizefor j=1:narvsf(i)=fitness(x(i,j));endif f(i)<personalbest_faval(i) %判斷當前位置是否是歷史上最佳位置personalbest_faval(i)=f(i);personalbest_x(i,:)=x(i,:);endend[globalbest_faval i]=min(personalbest_faval);globalbest_x=personalbest_x(i,:);for i=1:particlesize %更新粒子群里每個個體的最新位置v(i,:)=w*v(i,:)+c1*rand*(personalbest_x(i,:)-x(i,:))...+c2*rand*(globalbest_x-x(i,:));for j=1:narvs    %判斷粒子的飛翔速度是否超過了最大飛翔速度if v(i,j)>vmax;v(i,j)=vmax;elseif v(i,j)<-vmax;v(i,j)=-vmax;endendx(i,:)=x(i,:)+v(i,:);endif abs(globalbest_faval)<E0,break,endk=k+1;
end
Value1=1/globalbest_faval-1; Value1=num2str(Value1);
% strcat指令可以實現字符的組合輸出
disp(strcat('the maximum value','=',Value1));
%輸出最大值所在的橫坐標位置
Value2=globalbest_x; Value2=num2str(Value2);
disp(strcat('the corresponding coordinate','=',Value2));
x=-5:0.01:5;
y=2.1*(1-x+2*x.^2).*exp(-x.^2/2);
plot(x,y,'m-','linewidth',3);
hold on;
plot(globalbest_x,1/globalbest_faval-1,'kp','linewidth',4);
legend('目標函數','搜索到的最大值');xlabel('x');ylabel('y');grid on;toc;

粒子群算法和蟻群算法?運行結果:
在這里插入圖片描述

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196824.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息