PSO算法
Particle Swarm Optimization
PSO是一種基于種群的隨機優化技術,由Eberhart和Kennedy于1995年提出。主要模仿昆蟲、獸群、鳥群和魚群等的集群行為。
以鳥群覓食為例,粒子群算法中有粒子、粒子群、粒子的位置及飛行速度、最優解、粒子的適應度、最優粒子、粒子的個體經驗及群體經驗,它們可以類比于一只鳥、鳥群、鳥的位置與飛行速度、食物的位置、鳥與食物位置的距離、離食物最近的鳥、鳥的記憶能和學習能力。
| 粒子群優化算法 | 鳥群覓食 |
|---|---|
| 粒子(問題的一個解) | 鳥(個體) |
| 粒子群 | 鳥群(種群) |
| 粒子的位置與飛行速度 | 鳥的位置與飛行速度 |
| 粒子飛行速度的動態調整 | 鳥的飛行動態 |
| 最優解 | 食物位置 |
| 粒子的適應值 | 鳥與食物位置的距離 |
| 最優粒子(當前最好的解) | 距離食物最近的鳥 |
| 粒子群的鄰域拓撲 | 鳥群的信息交互途徑 |
| 粒子的個體最優經驗與鄰域最優經驗 | 鳥類的記憶能力與學習能力 |
而粒子群優化算法的重要手段就在粒子位置和速度的更新上,通過不斷改變粒子速度從而改變粒子位置讓粒子群更加接近最優解的位置。速度的更新與位置的更新都有具體的公式:
vi=vi+c1?rand()?(pbesti?xi)+c2?rand()?(gbesti?xi)v_i=v_i+c_1 *rand()*(pbest_i-x_i)+c_2*rand()*(gbest_i-x_i)vi?=vi?+c1??rand()?(pbesti??xi?)+c2??rand()?(gbesti??xi?)
xi=xi+vix_i=x_i+v_ixi?=xi?+vi?
其中i表示粒子的id,rand()是生成(0,1)的隨機數,v和x表示粒子的速度和位置,c1和c2為自我學習因子和社會學習因子,pbest為粒子自己的最佳歷史位置,gbest是社會中粒子的最佳歷史位置。本文中社會代之整個種群,gbest指的就是整個種群中最好的個體位置。
算法流程圖:
代碼實現:
lb,ub分別表示粒子位置的上下限;lv,uv分別表示粒子速度的上下限;n表示種群中粒子個數;D表示粒子的維度;c1和c2表示粒子的自我學習因子和社會學習因子大小;w表示慣性系數;iterator表示迭代次數。
初始化粒子群的速度和位置:
position=lb+(ub-lb)*rand(n,D);
velocity=lv+(uv-lv)*rand(n,D);
定義目標函數,以Rastrigin‘s函數為例:
function f=fun(X) %目標函數f=20+X(:,1).^2+X(:,2).^2-10*(cos(2*pi.*X(:,1))+cos(2*pi.*X(:,2))); %Rastrigin‘s函數
end
粒子速度更新:
velocity=w.*velocity+c1*rand().*(pbest-position)+c2*rand().*(gbest-position); %更新速度
index=find(velocity>uv | velocity<lv); %速度越界懲罰
velocity(index)=lv+(uv-lv)*rand(1,length(index));
粒子位置更新:
position=position+velocity; %更新位置
完整代碼實現(以Rastrigin‘s函數為例):
function [best,gbest]=pso(lb,ub,lv,uv,n,D,c1,c2,w,iterator)
%初始化起始位置和原始速度
position=lb+(ub-lb)*rand(n,D);
velocity=lv+(uv-lv)*rand(n,D);
fit=fun(position);%計算適應度
old_fit=fit; %保留適應度以便更新最優歷史
[best,location]=min(fit); %計算全局最優結果
pbest=position; %初始最優歷史位置
gbest=position(location,:); %初始化全局最優位置
history=zeros(1,iterator);
history(1)=best; %保留全局的歷史最優值
old_best=best;
ite=1; %初始化迭代器
temp=(w-0.1)/iterator;
while ite<iteratorvelocity=w.*velocity+c1*rand().*(pbest-position)+c2*rand().*(gbest-position); %更新速度index=find(velocity>uv | velocity<lv); %速度越界懲罰velocity(index)=lv+(uv-lv)*rand(1,length(index));position=position+velocity; %更新位置fit=fun(position); %重新評估[best,location]=min(fit); index=find(fit-old_fit<0); %尋找非負優化粒子pbest(index,:)=position(index,:); %更新歷史最優if best<old_bestgbest=position(location,:); %更新全局最優位置endold_fit=fit; %保存適應度ite=ite+1;if best<history(ite-1)history(ite)=best;elsehistory(ite)=history(ite-1);endold_best=best;w=w-temp;
end
best=history(end);function f=fun(X) %目標函數f=20+X(:,1).^2+X(:,2).^2-10*(cos(2*pi.*X(:,1))+cos(2*pi.*X(:,2))); %Rastrigin‘s函數end
plot(history,'linewidth',3);
end
取參數執行:
總結
- 上一篇: 学习向量量化LVQ
- 下一篇: FuzzyCMeans算法