粒子群算法是模仿鳥(niǎo)類(lèi)捕食的一種智能仿生算法,具有流程簡(jiǎn)單,算子復(fù)雜度低的特點(diǎn),是一種常用的智能算法,特別適用于自變量為實(shí)數(shù)的問(wèn)題優(yōu)化模型,維數(shù)較多時(shí)具有很好的效率,比f(wàn)mincon之類(lèi)的確定性算法具有更快的速度,在有限的時(shí)間內(nèi)可以獲得較好的結(jié)果。
粒子群算法的核心是通過(guò)用粒子在多維空間的坐標(biāo)來(lái)映射問(wèn)題優(yōu)化模型的解,通過(guò)粒子的當(dāng)前位置、歷史最優(yōu)位置、種群的歷史最優(yōu)位置、均勻分布隨機(jī)適量,?經(jīng)過(guò)不同權(quán)重的組合,得到粒子下一代的位置,依此不斷迭代得到近似最優(yōu)解。
粒子群算法的主要流程如下圖所示:
粒子群算法的兩個(gè)核心公式如下:
(1)粒子的速度更新公式:
(2)粒子的位置更新公式:
其中:
vidk是第i個(gè)粒子在第d維的速度值
xidk是第i個(gè)粒子第d維第k代的位置
pidk為第i個(gè)粒子第d維的第k代的個(gè)體最優(yōu)位置。
gdk為粒子群第d維的第k代的全局最優(yōu)位置。
w為慣性權(quán)重,?即保持原來(lái)速度的系數(shù)。
c1是粒子跟蹤自己歷史最優(yōu)值的權(quán)重系數(shù),它代表的是粒子對(duì)自身的知識(shí)的認(rèn)知數(shù)值,也可以稱(chēng)為自我認(rèn)知值。通常設(shè)置為2。
c2是粒子對(duì)群體最優(yōu)值的權(quán)重系數(shù),它表示粒子對(duì)整個(gè)群體知識(shí)的認(rèn)識(shí),也可以稱(chēng)為社會(huì)認(rèn)知值。通常設(shè)置為2
ξ和η是[0,1]區(qū)間內(nèi)均勻分布的隨機(jī)數(shù),賦予粒子方向變化以隨機(jī)性。
下面我們給出用MATLAB編程求解如下待優(yōu)化的目標(biāo)函數(shù)的代碼:
程序結(jié)果如下:
主程序代碼main.m如下:
%% 清空環(huán)境
clc;clear all;close all;warning off;%關(guān)閉警報(bào)
rand('seed', 100);
randn('seed', 100);
format long g;
%% 設(shè)置算法參數(shù)
popsize_my=50;% 粒子數(shù)
maxgen_my=100;% 迭代次數(shù)
dimension_my=10;% 粒子維度數(shù)
c1_my=1.8;% 速度更新參數(shù)1
c2_my=1.7;% 速度更新參數(shù)2
wMax_my=0.95;% 慣性權(quán)重最大值
wMin_my=0.85;% 慣性權(quán)重最小值
%% 設(shè)置變量區(qū)間
lb_my=0*ones(1,dimension_my);
ub_my=1*ones(1,dimension_my);
%% 設(shè)置速度的區(qū)間
vlb_my=(ub_my-lb_my)*-0.15;
vub_my=(ub_my-lb_my)*0.15;
[po_my,V]=genfun_my(popsize_my,dimension_my,lb_my,ub_my,vlb_my,vub_my);% 初始化
Va_pso_my=ddpso_my(po_my,popsize_my);% 計(jì)算目標(biāo)值
%% 初始化全局最優(yōu)值
[bestValue_pso_my,bestindex_pso_my]=min(Va_pso_my);
pbest_my=po_my(bestindex_pso_my,:);% 全局最優(yōu)值
gb_my=po_my;% 最優(yōu)個(gè)體
Vgb_my=Va_pso_my;% 個(gè)體最優(yōu)值
Vb_my=bestValue_pso_my;% 全局最優(yōu)值
tic;
mat_pso_my=zeros(maxgen_my,2);%
for i=1:maxgen_my
w=wMax_my-i*(wMax_my-wMin_my)./maxgen_my;% w為慣性權(quán)重
for j=1:popsize_my
%% 速度更新
V(j,:) = w*V(j,:) + c1_my*rand*(gb_my(j,:) - po_my(j,:)) + c2_my*rand*(pbest_my - po_my(j,:));% 速度更新
V(j,:)=lipeedfun(V(j,:),vlb_my,vub_my,dimension_my);% 限制速度
%% 粒子更新
po_my(j,:)=po_my(j,:)+V(j,:);%更新種群
po_my(j,:)=limitfun_my(po_my(j,:),lb_my,ub_my);
end
Va_pso_my=ddpso_my(po_my,popsize_my);%從新計(jì)算適應(yīng)度值
for j=1:popsize_my
% 計(jì)算個(gè)體最優(yōu)更新
if Va_pso_my(j) < Vgb_my(j)
gb_my(j,:) = po_my(j,:);
Vgb_my(j) = Va_pso_my(j);
end
% 計(jì)算群體最優(yōu)
if Va_pso_my(j) < Vb_my
pbest_my = po_my(j,:);
Vb_my = Va_pso_my(j);
end
end
mat_pso_my(i,1)=Vb_my;
mat_pso_my(i,2)=mean(Va_pso_my);
end
%% 結(jié)果繪圖、輸出數(shù)據(jù)
disp('最優(yōu)目標(biāo)值');
Vb_my
disp('最優(yōu)粒子');
pbest_my
%% 匯總迭代曲線(xiàn)
figure;
plot(mat_pso_my(:,1),'r-','linewidth',1.5);
hold on;
plot(mat_pso_my(:,2),'b-','linewidth',1.5);
legend({'最佳值','平均值'},'fontname','宋體');
xlabel('迭代次數(shù)','fontname','宋體');
ylabel('目標(biāo)函數(shù)值','fontname','宋體');
title('粒子群算法迭代曲線(xiàn)','fontname','宋體');
目標(biāo)函數(shù)代碼myfun.m如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-705691.html
function y = myfun(x)
% 目標(biāo)函數(shù)
y=sum((x-0.5).^2);
完整代碼可以私信我,?或者從https://download.csdn.net/download/corn1949/87990740下載.文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-705691.html
到了這里,關(guān)于粒子群算法及其MATLAB實(shí)現(xiàn)(附完整代碼和講解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!