粒子群算法matlab源程序function

2021-02-21 數學中國

  

%

function [pso F] = PSO_2D()

% FUNCTION PSO ---USE Particle Swarm Optimization Algorithm

%global present;

% close all;

pop_size = 10; % pop_size 種群大小

part_size = 2; % part_size 粒子大小, ** =n-D

gbest = zeros(1,part_size+1); % gbest 當前搜索到的最小的值

max_gen = 80; % max_gen 最大迭代次數

region=zeros(part_size,2); % 設定搜索空間範圍

region=[-3,3;-3,3]; % **每一維設定不同範圍

rand('state',sum(100*clock)); % 重置隨機數發生器狀態

arr_present = ini_pos(pop_size,part_size); % present 當前位置,隨機初始化,rand()的範圍為0~1

v=ini_v(pop_size,part_size); % 初始化當前速度

pbest = zeros(pop_size,part_size+1); % pbest 粒子以前搜索到的最優值,最後一列包括這些值的適應度

w_max = 0.9; % w_max 權係數最大值

w_min = 0.4;

v_max = 2; % **最大速度,為粒子的範圍寬度

c1 = 2; % 學習因子

c2 = 2; % 學習因子

best_record = zeros(1,max_gen); % best_record記錄最好的粒子的適應度。

% ————————————————————————

% 計算原始種群的適應度,及初始化

% ————————————————————————

arr_present(:,end)=ini_fit(arr_present,pop_size,part_size);

% for k=1:pop_size

% present(k,end) = fitness(present(k,1:part_size)); %計算原始種群的適應度

% end

pbest = arr_present; %初始化各個粒子最優值

[best_value best_index] = min(arr_present(:,end)); %初始化全局最優,即適應度為全局最小的值,根據需要也可以選取為最大值

gbest = arr_present(best_index,:);

%v = zeros(pop_size,1); % v 速度

% ————————————————————————

% 迭代

% ————————————————————————

% global m;

% m = moviein(1000); %生成幀矩陣

x=[-3:0.01:3];

y=[-3:0.01:3];

z=@(x,y) 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ...

- 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ...

- 1/3*exp(-(x+1).^2 - y.^2);

for i=1:max_gen

grid on;

plot3(x,y,z);

% subplot(121),ezmesh(z),hold on,grid on,plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'),hold off;

% subplot(122),ezmesh(z),view([145,90]),hold on,grid on,plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'),hold off;

ezmesh(z),hold on,grid on,plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'),hold off;

drawnow

F(i)=getframe;

% ezmesh(z)

% % view([-37,90])

% hold on;

% grid on;

% % plot(-0.0898,0.7126,'ro');

% plot3(arr_present(:,1),arr_present(:,2),arr_present(:,3),'*'); %改為三維

% axis([-2*pi,2*pi,-pi,pi,-50,10]);

% hold off;

pause(0.01);

% m(:,i) = getframe; %添加圖形

w = w_max-(w_max-w_min)*i/max_gen;

% fprintf('# %i 代開始!\n',i);

% 確定是否對打散已經收斂的粒子群——————————————————————————————

reset = 0; % reset = 1時設置為粒子群過分收斂時將其打散,如果=1則不打散

if reset==1

bit = 1;

for k=1:part_size

bit = bit&(range(arr_present(:,k))<0.1);

end

if bit==1 % bit=1時對粒子位置及速度進行隨機重置

arr_present = ini_pos(pop_size,part_size); % present 當前位置,隨機初始化

v = ini_v(pop_size,part_size); % 速度初始化

for k=1:pop_size % 重新計算適應度

arr_present(k,end) = fitness(arr_present(k,1:part_size));

end

warning('粒子過分集中!重新初始化……'); % 給出信息

display(i);

end

end

for j=1:pop_size

v(j,:) = w.*v(j,:)+c1.*rand.*(pbest(j,1:part_size)-arr_present(j,1:part_size))...

+c2.*rand.*(gbest(1:part_size)-arr_present(j,1:part_size)); % 粒子速度更新 (a)

% 判斷v的大小,限制v的絕對值小於5————————————————————————————

c = find(abs(v)>6); %**最大速度設置,粒子的範圍寬度

v(c) = sign(v(c))*6; %如果速度大於3.14則,速度為3.14

arr_present(j,1:part_size) = arr_present(j,1:part_size)+v(j,1:part_size); % 粒子位置更新 (b)

arr_present(j,end) = fitness(arr_present(j,1:part_size));

if (arr_present(j,end)>pbest(j,end))&(Region_in(arr_present(j,:),region)) % 根據條件更新pbest,如果是最小的值為小於號,相反則為大於號

pbest(j,:) = arr_present(j,:);

end

end

[best best_index] = max(arr_present(:,end)); % 如果是最小的值為min,相反則為max

if best>gbest(end)&(Region_in(arr_present(best_index,:),region)) % 如果當前最好的結果比以前的好,則更新最優值gbest,如果是最小的值為小於號,相反則為大於號

gbest = arr_present(best_index,:);

end

best_record(i) = gbest(end);

end

pso = gbest;

display(gbest);

% figure;

% plot(best_record);

% movie2avi(F,'pso_2D1.avi','compression','MSVC');

% ***************************************************************************

% 計算適應度

% ***************************************************************************

function fit = fitness(present)

fit=3*(1-present(1)).^2.*exp(-(present(1).^2) - (present(2)+1).^2) ... %**需要求極值的函數,本例即peaks函數

- 10*(present(1)/5 - present(1).^3 - present(2).^5).*exp(-present(1).^2-present(2).^2) ...

- 1/3*exp(-(present(1)+1).^2 - present(2).^2);

function ini_present=ini_pos(pop_size,part_size)

ini_present = 3*rand(pop_size,part_size+1); %初始化當前粒子位置,使其隨機的分布在工作空間 %** 6即為自變量範圍

function ini_velocity=ini_v(pop_size,part_size)

ini_velocity =3/2*(rand(pop_size,part_size)); %初始化當前粒子速度,使其隨機的分布在速度範圍內

function flag=Region_in(pos_present,region)

[m n]=size(pos_present);

flag=1;

for j=1:n-1

flag=flag&(pos_present(1:j)>=region(j,1))&(pos_present(1:j)<=region(j,2));

end

function arr_fitness=ini_fit(pos_present,pop_size,part_size)

for k=1:pop_size

arr_fitness(k,1) = fitness(pos_present(k,1:part_size)); %計算原始種群的適應度

end

相關焦點

  • MATLAB數學建模(六) | 粒子群優化(PSO)算法講解 (上)
    本次推文B站視頻講解連結:https://b23.tv/ZurR5V粒子群優化算法顧名思義是一種群智能優化算法,在使用PSO求解問題時,每一個粒子可以被看做問題的一個解。既然是PSO是智能優化算法,那麼在搜索問題解的過程中,PSO一定會存在其與其它智能優化算法不同的地方,PSO的獨特之處主要在於PSO是通過全局更新與個體更新相結合的方式更新粒子的位置。粒子群中包含若干個粒子,粒子群中的粒子在搜索過程中通過若干次迭代,不斷更新粒子位置最終完成搜索,以找到最終的解。
  • 小波變換進行圖像壓縮matlab原始碼源程序
    小波變換進行圖像壓縮matlab原始碼源程序
  • matlab代寫hmm算法程序(隱馬爾科夫模型)需要注意什麼?
    目前已有svm/rf算法,預測準確率大概為85%左右。我要做的就是把svm/rf算法的輸出,作為hmm算法的輸入,然後來預測行為。1.Svm/rf算法的輸出也是預測意圖,我想通過hmm算法結合svm/rf的輸出得到更好的預測結果。
  • 粒子群算法粗解——如何形象理解粒子群算法
    今天給大家介紹一種優化算法。粒子群優化算法,也叫作鳥群算法,英文簡稱PSO算法。現在假設這樣一個問題,在一個空間內,有一定數量的鳥群,在這個空間中的某個位置存放了食物,但是鳥群中的鳥不知道什麼位置存放了食物,僅知道其當前位置與食物的距離,問題就是我們的鳥群需要在最快的時間內找到食物的位置。算法是這樣定義的,首先對於鳥群中的鳥,其所擁有的變量有三個,第一,是其當前的位置信息。
  • matlab矩陣及其運算(五)
    二狗在MATLAB矩陣及其運算(三)篇章中,給大家留下關於自編行列式運算的小程序,本期二狗在此給大家解答一下自編行列式程序思路及代碼,再給大家講一下廣逆矩陣的概念,為深入學習廣逆矩陣做準備。承上 :行列式自編程序以一個四階行列式為例我們以第一行的每列展開,N階矩陣拆分成(N-1)階矩陣的程序自編。
  • GPS放射源旋轉角度解釋及源抽樣測試程序分享
    GeneralParticleSource為通用粒子源,在Geant4可以通過宏文件來做複雜的放射源抽樣,最近幫人模擬伽馬刀(不懂的自行搜索什麼是伽馬刀),需要做多源抽樣且放射源的角度需要偏轉,查看手冊《BookForApplicationDevelopers.pdf》的第28頁,如下圖:這個rot1和rot2的旋轉角度說的很玄乎,也可能是我的數學不好
  • 算法工匠MATLAB專訓營:Matlab繪圖,小試牛刀
    隨著講課的越來越深入,我給出的程序會越來越實用,接近於實際產品。在本次課中我就給出了一個實用的算法程序,程序名是dqpsk_IF_wholeframe_Release.m。那麼這個程序和網上的順序有什麼差別呢?可以明確的說網上的程序大多就是一個理論仿真,根本不考慮實際環境的因素。那這樣的程序是培養不了大家的算法思維的。
  • 基於蟻群算法求解函數的最大最小值的Matlab源碼「肥波貓」
    基於蟻群算法求解函數的最大最小值的Matlab源碼「肥波貓」上一篇基於遺傳算法求解函數的最大最小值的Matlab源碼「肥波貓」,本次用蟻群算法同樣可以解決。蟻群算法最早是由Marco Dorigo等人在1991年提出,他們在研究新型算法的過程中,發現蟻群在尋找食物時,通過分泌一種稱為信息素的生物激素交流覓食信息從而能快速的找到目標,據此提出了基於信息正反饋原理的蟻群算法。
  • 用matlab設計的IIR濾波器源程序-IIR一階低通/高通
    用matlab設計的IIR濾波器源程序(1)IIR一階低通濾波器 P576clear;fi=1;fs=10;Gc2=0.9;wc=2*pi*fi/fs; omegac=tan(wc/2);alpha=(sqrt
  • 蟻群算法即相關代碼實現詳解—matlab之智能算法
    蟻群算法即相關代碼實現詳解 一.算法背景 蟻群算法是近年來剛剛誕生的隨機優化方法,它是一種源於大自然的新的仿生類算法.由義大利學者Dorigo最早提出,螞蟻算法主要是通過螞蟻群體之間的信息傳遞而達到尋優的目的,最初又稱蟻群優化方法(Ant Colony
  • 求解HWBB結構模態及反應譜法求解位移和內力(附matlab程序)
    本文介紹《Higher mode effects in hinged wall with BRBs in base-frame structures using distributed parameter models》中關於底部帶BRB的鉸支牆(HWBB)-鉸接框架的模態和內力求解的matlab
  • 基於粒子群優化算法的結構可靠度敏感性分析方法:相對收斂率
    中文摘要:目的:採用粒子群優化算法(PSO)提高可靠指標計算效率,探討PSO求解過程中粒子群在不同維上統計特性及其收斂速率表徵的物理含義,研究優化過程中粒子收斂速率與隨機變量敏感性的關係,提出可靠度敏感性分析新方法。
  • matlab矩陣及其運算(三)
    有流量的可以直接戳視頻二狗在用matlab學習編程過程中,發現matlab中有大量矩陣運算,矩陣的知識了解不到位,在學習算法的過程中無法找到合適的解決問題的方法或者出現編程錯誤。好比英語發音規則都不懂,如何說一口流利的英語?地基不牢,地動山搖。這不前兩天二狗做BP算法的時候涉及到矩陣求導,這可難到二狗了,非方陣矩陣的逆矩陣怎麼求?
  • 資料|MATLAB優化算法案例分析與應用(進階篇)
    書中結合算法分析的理論和流程,詳解了大量的工程案例及其具體的代碼實現,讓讀者可以深入學習和掌握各種算法在相關領域中的具體應用。本書共分兩篇。第1篇為MATLAB常用算法應用設計,包括貝葉斯分類器的數據處理、背景差分的運動目標檢測、小波變換的圖像壓縮、BP的模型優化預測、RLS算法的數據預測、GA優化的BP網絡算法分析、分形維數應用、碳排放約束下的煤炭消費量優化預測、焊縫邊緣檢測算法對比分析、指紋圖像細節特徵提取、多元回歸模型的礦井通風量計算、非線性多混合擬合模型的植被過濾帶計算、伊藤微分方程的布朗運動分析、Q學習的無線體域網路由方法和遺傳算法的公交排班系統分析
  • 用Matlab探索分形世界
    畫Manderbrot集寫的時候在主程序中沒有寫具體的函數,而是直接在Iterateb函數中對於z的迭代進行賦值Main code:xspace=linspace(-2,2,1000);yspace=linspace(-2,2,1000);[x,y]=meshgrid(xspace,yspace);
  • 麻雀算法
    接上次的粒子群算法,這次更新2020年提出的最新的優化算法-麻雀算法。優化問題是科學研究和工程實踐領域中的熱門問題。智能優化算法大多是受到人類智能、生物群體社會性或自然現象規律的啟發,在解空間內進行全局優化。麻雀算法於2020年由薛建凱[1]首次提出,是基於麻雀種群的覓食和反捕食行為的一種新型智能優化算法。
  • matlab下實現FFT信號分析
    利用matlab做頻譜分析前我們需要了解分析過程中的一些基礎知識,matlab中的 fft 函數用法、fftshift 函數的用法函數 1  fft :作用:快速傅立葉變換。語法:Y = fft(X)Y = fft(X,n)Y = fft(X,n,dim)語法:Y = fft(X) 用快速傅立葉變換 (FFT) 算法計算 X 的離散傅立葉變換 (DFT)。
  • MATLAB基礎教程-臺大郭彥甫-學習筆記6
    functionplot()plot(x,y) plots each vector pairs(x , y)matlab會 refresh ,把之前的圖給清掉,如果 想保留,用 指令 hold on現在為了區分這四個函數,需要添加legend圖標legend('sin(x)','cos(x)','Sigmoid','Causs function');
  • MATLAB數學建模(十一) | 人工蜂群算法(附MATLAB代碼)
    https://www.bilibili.com/video/BV1Ka4y1H7r7後臺有很多小夥伴留言說想學習一下人工蜂群算法(artificial bee colony,ABC),所以今天我們為各位講解ABC,讓各位小夥伴能夠快速掌握這種算法。
  • 2019數學建模國賽|Matlab 求解微分方程(組)
    (4)因為沒有一種算法可以有效的解決所有的 ODE 問題,為此,Matlab 提供了多種求解器 solver,對於不同的 ODE 問題,採用不同的 solver3.在 matlab 命令窗口、程序或函數中創建局部函數時,可用內聯函數 inline,inline 函數形式相當於編寫 M 函數文件,但不需編寫 M-文件就可以描述出某種數學關係.調用 inline