MATLAB机器学习系列-11:粒子群优化原理及其matlab实现
生活随笔
收集整理的這篇文章主要介紹了
MATLAB机器学习系列-11:粒子群优化原理及其matlab实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
粒子群優化原理
粒子群算法思想來源于實際生活中鳥捕食的過程。假設在一個n維的空間中,有一群鳥(m只)在捕食,食物位于n維空間的某個點上,對于第i只鳥某一時刻來說,有兩個向量描述,一個是鳥的位置向量,第二個是鳥的速度。假設鳥能夠判斷一個位置的好壞,所謂“好壞”,就是離食物更近了還是更遠了。鳥在捕食的過程中會根據自己的經驗以及鳥群中的其他鳥的位置決定自己的速度,根據當前的位置和速度,可以得到下一刻的位置,這樣每只鳥通過向自己和鳥群學習不斷的更新自己的速度位置,最終找到食物,或者離食物足夠近的點。更新速度和位置的表達式如下。
- 粒子群優化(PSO, particle swarm optimization)算法是計算智能領域,除了蟻群算法,魚群算法之外的一種群體智能
的優化算法,該算法最早由Kennedy和Eberhart在1995年提出的,該算法源自對鳥類捕食問題的研究。 - PSO算法首先在可行解空間中初始化一群粒子,每個粒子都代表極值優化問題的一個潛在最優解,用位置、速度和適應度
值三項指標表示該粒子特征。 - 粒子在解空間中運動,通過跟蹤個體極值Pbest和群體極值Gbest更新個體位置,個體極值Pbest是指個體所經歷位置中計
算得到的適應度值最優位置,群體極值Gbest是指種群中的所有粒子搜索到的適應度最優位置。 - 粒子每更新一次位置,就計算一次適應度值,并且通過比較新粒子的適應度值和個體極值、群體極值的適應度值更新個體
極值Pbest和群體極值Gbest位置。
粒子群優化和遺傳算法對比
相同點
- 種群隨機初始化
- 適應度函數值與目標最優解之間的映射
不同點
- PSO算法沒有選擇、交叉、變異等操作算子
- PSO有記憶的功能
- 信息共享機制不同,遺傳算法是互相共享信息,整個種群的移動是比較均勻地向最優區域移動,而在PSO中,只有gBest或lBest給出信息給其他粒子,屬于單向的信息流動,整個搜索更新過程是跟隨當前最優解的過程。因此,在一般情況下,PSO的收斂速度更快。
案例一:一元函數優化
適應度函數
fun.m
main.m 部分
第一步:
%% I. 清空環境 clc clear all第二步:
x的取值范圍1-2
%% II. 繪制目標函數曲線圖 x = 1:0.01:2; y = sin(10*pi*x) ./ x; figure plot(x, y) hold on第三步:
%% III. 參數初始化 c1 = 1.49445; c2 = 1.49445;maxgen = 50; % 進化次數 sizepop = 10; %種群規模Vmax = 0.5;%最大速度 Vmin = -0.5;%最小速度 popmax = 2;%x邊界 popmin = 1;%x邊界第四步:
%% IV. 產生初始粒子和速度 for i = 1:sizepop %遍歷每一個個體% 隨機產生一個種群pop(i,:) = (rands(1) + 1) / 2 + 1; %初始種群%變化范圍是1-2即x的取值V(i,:) = 0.5 * rands(1); %初始化速度% 計算適應度fitness(i) = fun(pop(i,:)); end種子pop
初始化速度
適應度函數值
第五步:
%% V. 個體極值和群體極值 [bestfitness bestindex] = max(fitness); zbest = pop(bestindex,:); %全局最佳 gbest = pop; %個體最佳 fitnessgbest = fitness; %個體最佳適應度值 fitnesszbest = bestfitness; %全局最佳適應度值在本例子中bestindex=1,因為是隨機化,所以每次運行不一樣
第六步:
%% VI. 迭代尋優 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;%X的最大邊界限制pop(j,find(pop(j,:)<popmin)) = popmin;%x的最小邊界限制% 適應度值更新fitness(j) = fun(pop(j,:)); endfor 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);%則群體最優適應度函數值更新endend yy(i) = fitnesszbest; %一輪的群體最優適應度函數值賦值給yy(i) endyy有50個值
我們從圖中可以發現fitnesszbest,zbest 是最優值(對比前面出現的函數圖)第七步:
%% VII. 輸出結果并繪圖 [fitnesszbest zbest] plot(zbest, fitnesszbest,'r*')figure plot(yy) title('最優個體適應度','fontsize',12); xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);從圖中發現到20輪時就基本找到最大值啦。
案例二:二元函數優化
二元函數代碼和前面一元函數類似
fun.m
main.m
%% I. 清空環境 clc clear%% II. 繪制目標函數曲線 figure [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) hold on%% III. 參數初始化 c1 = 1.49445; c2 = 1.49445;maxgen = 1000; % 進化次數 sizepop = 100; %種群規模Vmax = 1; Vmin = -1; popmax = 5; popmin = -5;%% IV. 產生初始粒子和速度 for i = 1:sizepop% 隨機產生一個種群pop(i,:) = 5*rands(1,2); %初始種群V(i,:) = rands(1,2); %初始化速度% 計算適應度fitness(i) = fun(pop(i,:)); %染色體的適應度 end%% V. 個體極值和群體極值 [bestfitness bestindex] = max(fitness); zbest = pop(bestindex,:); %全局最佳 gbest = pop; %個體最佳 fitnessgbest = fitness; %個體最佳適應度值 fitnesszbest = bestfitness; %全局最佳適應度值%% VI. 迭代尋優 for i = 1:maxgenfor 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,:)); endfor j = 1:sizepop % 個體最優更新if fitness(j) > fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end% 群體最優更新if fitness(j) > fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endend yy(i) = fitnesszbest; end %% VII.輸出結果 [fitnesszbest, zbest] plot3(zbest(1), zbest(2), fitnesszbest,'bo','linewidth',1.5)figure plot(yy) title('最優個體適應度','fontsize',12); xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);MATLAB 2014b之后好像有粒子群的工具箱。自己去研究吧。
MATLAB非我主語言。
MATLAB-pso工具箱
作者:電氣工程的計算機萌新-余登武
總結
以上是生活随笔為你收集整理的MATLAB机器学习系列-11:粒子群优化原理及其matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡额度最高多少
- 下一篇: 开面包店需要多少钱 很值得创业者们看一看