MATLAB PSO優化RBFNN程式(帶注釋)

2021-08-13 04:11:17 字數 4794 閱讀 4852

顯示主程式:

clear all

close all

%g為迭代次數,n為個體長度(包括12個引數),m為總群規模

%w,c1,c2為粒子群演算法中的引數

g =700;

n = 12;%個體長度,乙個粒子的長度

m = 20;

w = 0.1;%慣性權重

c1 = 2;

c2 = 2;

%設定粒子的最小位置與最大位置

for i = 1:3

minx(i) = 0.1*ones(1);

maxx(i) = 3*ones(1);

endfor i = 4:1:9

minx(i) = -3*ones(1);

maxx(i) = 3*ones(1);

endfor i = 10:1:12

minx(i) = -ones(1);

maxx(i) = ones(1);

end%產生初始粒子位置

pop = rands(m,n);%m:20個粒子。n:每個粒子可以設定12個值

for i = 1:m%對超過範圍的粒子,進行處理

for j = 1:3

if pop(i,j) < minx(j)

pop(i,j) = minx(j);

endif pop(i,j) > maxx(j)

pop(i,j) = maxx(j);

endend

for j = 4:9

if pop(i,j) < minx(j)

pop(i,j) = minx(j);

endif pop(i,j) > maxx(j)

pop(i,j) = maxx(j);

endend

for j = 10:12

if pop(i,j) < minx(j)

pop(i,j) = minx(j);

endif pop(i,j) > maxx(j)

pop(i,j) = maxx(j);

endend

end

%初始化速度

v = 0.1*rands(m,n);%20行12列,每個粒子的每個值設定乙個初始的速度,0,1為慣性權重

bsj = 0; %誤差的和,函式的返回值,值越小,說明得到的權值效果越好。即適應度值,適應度函式為神經網路輸出與期望輸出的差值的總和

%根據初始化的種群計算個體好壞,找出群體最優和個體最優

for s = 1:m%粒子群規模

indivi = pop(s,:);%取乙個粒子,為乙個行向量

[indivi,bsj] = chap10_3b(indivi,bsj);%呼叫

error(s) = bsj;%將次粒子的誤差和賦值

end[oderer,indexer] = sort(error);%將error陣列按公升序排列

error;

errorleast = oderer(1);%將最小值賦值

for i = 1:m%種群規模

if errorleast == error(i)

gbest = pop(i,:);%將第i個粒子賦值給gbest,即全域性最優位置

break;

endendibest = pop;%個體極值

for kg = 1:g%迭代次數

kgfor s = 1:m;%種群規模

%個體有4%的變異概率

for j = 1:n%粒子長度

for i = 1:m%種群規模,變異是針對某個粒子的某乙個值的變異

if rand(1)<0.04

pop(i,j) = rands(1);

endend

end%r1,r2為粒子群演算法引數

r1 = rand(1);%產生乙個0-1之間的隨機數

r2 = rand(1);

%個體和速度更新

v(s,:) = w*v(s,:) + c1*r1*(ibest(s,:)-pop(s,:)) + c2*r2*(gbest-pop(s,:));%w為慣性權重

pop(s,:) = pop(s,:) + 0.3*v(s,:);%有些地方加速度那裡的03也為0.5,感覺像乘以時間

%對更新的位置進行判斷,超過設定的範圍就處理下。粒子中不同的值對應不同的範圍

for j = 1:3

if pop(s,j) < minx(j)

pop(s,j) = minx(j);

endif pop(s,j) > maxx(j)

pop(s,j) = maxx(j);

endend

for j = 4:9

if pop(s,j) < minx(j)

pop(s,j) = minx(j);

endif pop(s,j) > maxx(j)

pop(s,j) = maxx(j);

endend

for j = 10:12

if pop(s,j) < minx(j)

pop(s,j) = minx(j);

endif pop(s,j) > maxx(j)

pop(s,j) = maxx(j);

endend

%求更新後的每個個體適應度值

[pop(s,:),bsj] = chap10_3b(pop(s,:),bsj);%輸入為當前的粒子與上乙個粒子對應的適應度值。輸出為當前的粒子與當前粒子對應的適應度值

error(s) = bsj;%將當前粒子對應的適應度值賦值給誤差陣列

%根據適應度值對個體最優和群體最優進行更新

if error(s)

%*****==寫在前面的註解***************

%此函式相當於是神經網路的訓練,而在粒子群演算法中,相當於是每更新一次粒子(迴圈一次),就訓練一回神經網路(給定的輸入和輸出不變,讓神經網路**)。所以粒子群迭代幾次,就讓神經網路訓練幾次。

%rbf網路,由chap10_3a呼叫,返回值b為誤差的和,和越小,說明得到的權值越好

function [p,bsj] = rbf_gaf(p,bsj)

ts = 0.001;

alfa = 0.05;

xite = 0.85;

x = [0,0]';%網路的輸入初值

b = [p(1);p(2);p(3)];%各神經元的方差

c = [p(4) p(5) p(6);%基函式的中心,若網路為兩輸入的話,那麼每個神經元的中心也是兩維的列向量

p(7) p(8) p(9)];

w = [p(10);p(11);p(12)];%各神經元到輸出的權值,網路為一輸出

w_1 = w;w_2 = w_1;

c_1 = c;c_2 = c_1;

b_1 = b;b_2 = b_1;

y_1 = 0;

for k = 1:1:400%這個時間的迴圈????

timef(k) = k*ts; %感覺這個值沒什麼用。

u(k) = sin(5*2*pi*k*ts);

y(k) = u(k)^3 + y_1/(1 + y_1^2); %獲得的是期望輸出的值

x(1) = u(k);%將u(k)賦值給第乙個輸入

x(2) = y(k);%將y(k),即期望輸出賦值給第二個人輸入,為什麼要這樣賦值。。。

for j = 1:1:3%計算啟用函式

h(j) = exp(-norm(x - c(:,j))^2/(2*b(j)*b(j)));%c與b代表的是各神經元中心與方差,h為神經元的啟用函式

endym(k) = w_1'*h';%權值與啟用函式相乘 ,計算此次算出的輸出,迴圈400此的話,一次訓練產生400個輸出。

e(k) = y(k) - ym(k);%計算每一次神經網路輸出與期望輸出的差值

d_w = 0*w;d_b = 0*b;d_c = 0*c;%乘以0全變為0,d_w,d_b,d_c三個值不造是幹嘛的

for j = 1:1:3%計算d_w,d_b,d_c,但是沒有找到這方面的公式。。。。

d_w(j) = xite*e(k)*h(j);%計算權值的增量,根據設定的引數,輸出誤差與啟用函式

d_b(j) = xite*e(k)*w(j)*h(j)*(b(j)^-3)*norm(x-c(:,j))^2;%計算方差的增量,根據設定的引數,輸出誤差,此刻的權值、啟用函式,此時的方差、此時的輸入與中心的差值的二範數

for i = 1:1:2%計算中心的增量,根據設定的引數,此刻的權值、啟用函式,輸入與中心的差值,方差。

d_c(i,j) = xite*e(k)*w(j)*h(j)*(x(i) - c(i,j))*(b(j)^-2);

endend

w = w_1 + d_w + alfa*(w_1 - w_2);%w_1與w_2之前賦值了w,後面在沒變,d_w等值在前面有e(k)與h(j)更新,用來計算權值

b = b_1 + d_b + alfa*(b_1 - b_2);

c = c_1 + d_c + alfa*(c_1 - c_2);

y_1 = y(k);

w_2 = w_1;

w_1 = w;

c_2 = c_1;

c_1 = c;

b_2 = b_1;

b_1 = b;

endb = 0;

for i = 1:1:400%計算誤差的和,

ji(i) = abs(e(i));

b = b + 100*ji(i);%乘100是什麼意思?

endbsj = b;

Mysql limit 優化優化

mysql 效能到底能有多高?用了php半年多,真正如此深入的去思考這個問題還是從前天開始。有過痛苦有過絕望,到現在充滿信心!mysql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統怎麼寫都可以,用xx框架可以實現快速開發。可是資料量到了10萬,百萬至千萬,他的效能還能那...

php優化 nginx優化 mysql優化

php優化 1 將類的方法定義為static。2 盡量使用單引號。3 修改php fpm程序數。4 修改單個指令碼最大可使用記憶體。5 大的陣列使用完之後要及時釋放。6 迴圈的時候,制定最大迴圈次數 7 不使用 遮蔽錯誤 8 盡量採用大量的 php 內建函式 9 使用require代替require...

約瑟夫問題(優化優化再優化)

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。1 模擬方法 2 數學方法 模擬方法就是所謂的乙個個模擬,乙個乙個出列...