顯示主程式:
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 數學方法 模擬方法就是所謂的乙個個模擬,乙個乙個出列...