?? genepwb.m
字號:
% genepwb.m %文件名
pausetime = 0.1;
load datapv % 裝載in1和out1
k1 = 0.000024015;
in=in1*k1;
out=out1/2^15; % 因計算機中采用的是16位D/A板,...
% % 故用1/2^15將輸出限制在1以內。
X11 = in(1:100:4000); % 取40個數據對
X21 = out(1:100:4000);
[Q,S]=size(X21);
P=[X11';X21']; % 根據圖7.16構造訓練網絡用輸入/輸出對
T=X21';
N=50; % 確定種群數
% 賦初始值
SSE=[zeros(1,N)];A2=[zeros(N,Q)];
WB1=[zeros(N,21)*2];
m=[zeros(1,N)]; mm=1;
WB=rands(N,21)*2;
NWB=WB;
min=1000;
G=200; % 進化代數
for j=1:200, % 開始直至G代的遺傳進化
SS=0;
for i= 1:N, % 求50組種群
W1=[NWB(i,1) NWB(i,2);NWB(i,3) NWB(i,4);NWB(i,5) NWB(i,6);NWB(i,7) NWB(i,8);NWB(i,9) NWB(i,10)];
B1=[NWB(i,11);NWB(i,12);NWB(i,13);NWB(i,14);NWB(i,15)];
W2=[NWB(i,16) NWB(i,17) NWB(i,18) NWB(i,19) NWB(i,20)];
B2=NWB(i,21);
%Calculate the fitness values
% PRESENTATION PHASE
A1 = tansig(W1*P+B1*ones(1,Q)); % 計算神經網絡的輸出A2
A2(i,:) = purelin(W2*A1+B2*ones(1,Q));
E = T-A2(i,:); % 計算網絡誤差
F(i) = sumsqr(E); % 求每一組適配值
if F(i)<0.00001, j=j-1,break,end % 當適配值小于給定的0.00001,結束進化
SS=SS+F(i); % 求N個種群適應值和
end
% % 復制操作(reproduction)
AF=SS/N; % 求N個種群適應值的平均值
n=1;nn=1;min1=0;
for i=1:N, % 尋找記錄N個種群中小于平均適應值AF的個體
dif=AF-F(i);
if dif>=0,
m(n)=i; % 記錄個數n和所處序號i
n=n+1;
min1=F(i)-min; % 尋找本代最優(最小)適應值
if min1<=0, min = F(i); nn=i;end % 并把其序號保存到nn, 其值保存到min中
end
end
plot(F(1:N)), % 繪出本代中50個適應值各自的值
pause2(pausetime),
min
if j==mm*5, nj=j % 每5代顯示一次網絡輸出跟蹤目標矢量的情況
plot([X21 A2(nn,:)']),pause2(pausetime),mm=mm+1;
end
% 交換操作(crossover)
WB1(1,:)=NWB(nn,:); % 將本代最優個體放置1號位
for i=1:n-1, % 將記錄中低于平均適應值的個體從2號位起順序排放
WB1(i+1,:)=NWB(m(i),:); % 只取少于s = 3*N/4的個體數進行淘汰
end
if n>3*N/4,s=3*N/4;
else s=n;
end
for i=s:N, % 用隨機值補齊被淘汰的個體
WB1(i,:)=rands(1,21)*2;
end
%k=fix(rand*10);
if j<=60, intwb=fix(WB1*10)/10; % 60代前取權值個位及四位小數中的前一位
else if j>60 &j<=80,intwb=fix(WB1*100)/100; % 61-80代取權值小數中的前兩位
else intwb=fix(WB1*1000)/1000; % 81-200代取權值小數中的前三位
end
end
poiwb=WB1-intwb; % 求權值在不同代中的小數部分
NWB(1,:)=WB1(1,:); % 將本代最優個體直接進化到下一代
for i=2:N/2, % 將2到N/2與N-1到N/2 - 1的個體之間的權值的小數...
NWB(i,:)=intwb(i,:)+poiwb(N+1-i,:); % 進行交換
end
for i=1+N/2:N,
NWB(i,:)=intwb(i-N/2,:)+poiwb(i,:);
end
% 變異操作(mutation)
if j<=40, jk=N/2; % 選擇變異的頻率
else if j>40 & j<=70, jk=fix(N/3); % 從每N/2個個體中變異一次增長到
else if j>70 & j<=100, jk=fix(N/4); % 每N/3到N/4個個體中變異一次
end
end
for i=5:jk:N,
k=fix(rand*10); % 隨機取一個9以內的整數
mu1=num2str(NWB(i,:)); % 將所選定的個體中的權值數碼中與隨機...
mu2=strrep(mu1,'k','k-1'); % 數k相同的數變為k - 1
hh=sscanf(mu2,'%f')';
[in,im]=size(hh);
if im<21, NWB(i,:)=[hh 0.];
else NWB(i,:)=hh;end
end
end
end
NWB=NWB(1,:); % 取最佳權值
save plantwb NWB % 將訓練結果存入文件plantwb.mat中
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -