演算法沒有和影象處理直接相關,不過對於影象分類中的模式識別相關演算法,也許會用到這個優化演算法。
演算法步驟:
1.首先確定粒子個數與迭代次數。
2.對每個粒子隨機初始化位置與速度。
3.採用如下公式更新每個粒子的位置與速度。
px=px+pv*t; %位置更新公式
pv=pv+(c1*rand*(gx-px))+(c2*rand*(pbx-px)); %速度更新公式
這裡c1和c2是加速因子,和梯度下降演算法那裡的加速因子我感覺很類似。
gx是粒子群中最佳粒子的位置,pbx為當前粒子最佳位置。
4.每次迭代,首先檢查新粒子適應度是否高於原最優適應度,如果高於則對自己的位置和適應度進行更新。然後再判斷此粒子適應度是否高於全域性最優粒子,如果高於則更新全域性最優粒子適應度和位置。
因為自己不是主要研究這方面演算法的,所以還有一些疑問(自問自答?)。
1.演算法需要目標函式,如果沒有目標函式怎麼辦。也許就不用這個演算法了,或者其他什麼演算法先求出了目標函式了。
2.既然給了目標函式,那麼直接遍歷所有值再max()應該就能求得最佳位置。而pso演算法是不是只是為了減少運算量,比如我這裡200*200的矩陣,本來需要計算40000次函式,而pso只計算了100次函式就得到近似最優解了。
難怪叫優化演算法,反正我暫時只能這樣理解了,其他細節**注釋的很清楚了。
下圖展示了乙個pso的執行結果,目標函式是高斯函式,綠點代表最佳粒子的位置:
matlab**如下:
main.m
clear all;close all;clc;update_par.m[x y]=meshgrid(-100:100,-100:100
);sigma=50
;img = (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2
)); %目標函式,高斯函式
mesh(img);
hold on;
n=10
; %粒子群粒子個數
%初始化粒子群,定義結構體
%結構體中八個元素,分別是粒子座標,粒子速度,粒子適應度,粒子最佳適應度,粒子最佳座標
par=struct();
for i=1
:n par(i).x=-100+200*rand(); %[-100
100]對x位置隨機初始化
par(i).y=-100+200*rand(); %[-100
100]對y位置隨機初始化
par(i).vx=-1+2*rand(); %[-1
1]對vx速度隨機初始化
par(i).vy=-1+2*rand(); %[-1
1]對vy速度隨機初始化
par(i).fit=0
; %粒子適應度為0初始化
par(i).bestfit=0
; %粒子最佳適應度為0初始化
par(i).bestx=par(i).x; %粒子x最佳位置初始化
par(i).besty=par(i).y; %粒子y最佳位置初始化
endpar_best=par(1
); %初始化粒子群中最佳粒子
for k=1:10
plot3(par_best.x+100,par_best.y+100,par_best.fit,'
g*'); %畫出最佳粒子的位置,+100
為相對偏移
for p=1
:n [par(p) par_best]=update_par(par(p),par_best); %更新每個粒子資訊
endend
function [par par_best]=update_par(par,par_best)compute_fit.m%px=px+pv*t,這裡t=1
,px為當前粒子的位置,pv為當前粒子的速度
par.x=par.x+par.vx;
par.y=par.x+par.vy;
par.fit=compute_fit(par); %計算當前粒子適應度
%pv=pv+(c1*rand*(gx-px))+(c2*rand*(pbx-px))
%這裡c1,c2為加速因子
%gx為具有最佳適應度粒子的位置
%pbx為當前粒子的最佳位置
c1=1
; c2=1
; par.vx=par.vx+c1*rand()*(par_best.x-par.x)+c2*rand()*(par.bestx-par.x);
par.vy=par.vy+c1*rand()*(par_best.y-par.y)+c2*rand()*(par.besty-par.y);
if par.fit>par.bestfit %如果當前粒子適應度要好於當前粒子最佳適應度
par.bestfit=par.fit; %則更新當前粒子最佳適應度
par.bestx=par.x; %更新當前粒子最佳位置
par.besty=par.y;
if par.bestfit>par_best.fit %如果當前粒子最佳適應度好於最佳粒子適應度
par_best.fit=par.bestfit; %則更新最佳粒子適應度
par_best.x=par.x; %更新最佳粒子位置
par_best.y=par.y;
endend
end
function re=compute_fit(par)x=par.x;
y=par.y;
sigma=50
;
if x100 || y100
re=0
; %超出範圍適應度為0
else
%否則適應度按目標函式求解
re= (1/(2*pi*sigma^2))*exp(-(x.^2+y.^2)/(2*sigma^2
));
endend
粒子群優化的matlab實現
在youtube上依葫蘆畫瓢寫了乙個matlab的粒子群演算法來實現多變數函式的優化,程式最終能輸出迭代後的最優解,並以半對數座標的形式展示出每一代的最優解。對於不同的問題只需修改costfunction 待優化的函式 nvar 待優化函式的變數個數 varmin和varmax 待優化函式變數的上下...
粒子群優化演算法 粒子群演算法
粒子群演算法 particle swarm optimization,pso 屬於進化演算法的一種,該演算法最初是受到飛鳥集群活動的規律性啟發,進而利用群體智慧型建立的乙個簡化模型。粒子群演算法在對動物集群活動行為觀察基礎上,利用群體中的個體對資訊的共享使整個群體的運動在問題求解空間中產生從無序到有...
粒子群優化演算法
粒子群優化演算法 1.概念 粒子群優化演算法 pso 是一種進化計算技術。源於對鳥群捕食的行為研究。粒子群優化演算法的基本思想 是通過群體中個體之間的協作和資訊共享來尋找最優解 pso的優勢 在於簡單容易實現並且沒有許多引數的調節。目前已被廣泛應用於函式優化 神經網路訓練 模糊系統控制以及其他遺傳演...