?? yichuansufa.m
字號(hào):
ww=[];
for i=1:pp
ww(i,:)=zuojie+jiechang*rand(1,getichangdu); %存放所有權(quán)值和閾值放到一行的pp條染色體
end
for L=1:M
ww;
for i=1:pp
for j=1:c
L0(:,j)=[ww(i,1:mm);ww(i,mm+1:2*mm);ww(i,2*mm+1:3*mm);ww(i,3*mm+1:4*mm)]*xunlianyangben(:,j+i0-1)-[ww(i,getichangdu-k11:getichangdu-1)]'; % p(:,j+i0-1); %=zeros(3,1),; %這步是對(duì)隱層的輸入
LL0(:,j)=(1+exp(-L0(:,j))).^(-1); %對(duì)隱層的輸出
LLL0(:,j)=[ww(i,4*mm+1:4*mm+k11)]*LL0(:,j)-ww(i,getichangdu); %這步是對(duì)輸出層的輸入
LLLL0(:,j)=(1+exp(-LLL0(:,j))).^(-1); %這步是對(duì)輸出層的輸出
y(:,j)=LLLL0(:,j); %再加上輸出層的閾值,得到最后的
T(:,j)=guiyihua(j+i0-1+c,a0);
end
y;
T;
Er=y-T;
Er;
E=(sum(Er.^2));
E;
f(:,i)=1/E; %第i條染色體的適應(yīng)度
end
%為得到最后結(jié)果,下面設(shè)置daishu表明是第幾代,下面的mmm存放每代最大適應(yīng)度個(gè)體在群體的位置,mmmm存放其最大適應(yīng)度對(duì)應(yīng)的個(gè)體
f; %存放一代的所有染色體的適應(yīng)度,f是一行pp列
zd1(:,L)=max(f); %zd1存放每代適應(yīng)度的最大值
for i=1:pp
if max(f)==f(:, i)
mmm(:,L)=i; %mmm存放最大適應(yīng)度個(gè)體對(duì)應(yīng)的序號(hào)
mmmm(L,:)=ww(i,:); %mmmm存放最大適應(yīng)度對(duì)應(yīng)的個(gè)體
end
end
f1=sum(f);
f1;
for i=1:pp
ff(i)=f(i)/f1; %每個(gè)個(gè)體的相對(duì)適應(yīng)度,即每個(gè)個(gè)體在復(fù)制中被選中的概率
end
ff; %按順序存放所有個(gè)體的相對(duì)適應(yīng)度
for i=1:pp
k(i)=sum(ff(:,1:i));%通過ff的前i列求和計(jì)算累計(jì)概率
end
k; %按順序存放所有個(gè)體的累計(jì)概率
%w存放復(fù)制后得到的個(gè)體
w=zeros(round(pp*p1),getichangdu);
%依據(jù)pp*p1是幾,就循環(huán)多少次
for ii=1:round(pp*p1)
r=rand(1,1);
for i=1:pp
if k(i)>r
l=min(i); %以一例說明這步的道理。k=(0.1 0.3 0.5 0.8 1),r=0.34,發(fā)現(xiàn)k(3)=0.5,k(4)=0.8,k(5)=1都大于r,但應(yīng)該取第三個(gè)個(gè)體,所以應(yīng)該取3,4,5的最小值
l;
w(ii,:)=ww(l,:);
break;
end
end
end
w;
%下面選出用于交叉的個(gè)體,個(gè)數(shù)是pppp個(gè),所以需保證pppp是偶數(shù)
if mod(round(pp*p2),2)~=0 %若pp*p2取整后是奇數(shù)
pppp=round(pp*p2)-1; %把奇數(shù)減1使成為偶數(shù)
else %若pp*p2取整后是偶數(shù),按個(gè)數(shù)round(pp*p2)給 pppp進(jìn)行交叉
pppp=round(pp*p2);
end
%下面產(chǎn)生[1,pp]內(nèi)pppp個(gè)隨機(jī)數(shù)以便決定哪些個(gè)個(gè)體交叉
y1=1+(pp-1)*rand(1,1);%選1到pp內(nèi)的隨機(jī)數(shù)
y1;
y2(:,u)=round(y1);%對(duì)隨機(jī)數(shù)y1取整,放到y(tǒng)2(:,u)
bb(u,:)=ww(y2(:,u),:); %對(duì)y1取整對(duì)應(yīng)的整數(shù)是幾,就是種群的第幾個(gè)個(gè)體即第幾行放入bb
pp2(:,u)=f(:,y2(:,u)); %已取出的用于交叉但還未交叉的個(gè)體的適應(yīng)度
end
bb ; %存放取出用于交叉但還未交叉的個(gè)體
pp2;
%下面對(duì)上面產(chǎn)生的bb中的pppp個(gè)個(gè)體實(shí)行交叉
%,交叉方法是:bb中第u1行即第u1個(gè)個(gè)體與第(u1+pppp/2)個(gè)個(gè)體交叉,通過產(chǎn)生兩次隨機(jī)數(shù)得到交叉后的兩個(gè)個(gè)體
%下面依據(jù)pppp/2是幾就循環(huán)多少次
% b1=zeros(2,woo);
% pj(:,L)=sum(f)/pp ; %一代群體適應(yīng)度的平均值
for u1=1:pppp/2
b1(1,:)=bb(u1,:);%取出bb中第u1個(gè)個(gè)體
b1(2,:)=bb((u1+pppp/2),:); %取出bb中第(u1+pppp/2)個(gè)個(gè)體 """""" 把它作為初始解",相當(dāng)于x0"""""""
r1=rand(1,1);
if pp2(:,u1)>pp2(:,u1+pppp/2)
b20(1,:)=b1(1,:)+r1.*(b1(1,:)-b1(2,:));
b20(2,:)=b1(1,:)-r1.*(b1(1,:)-b1(2,:));
while 1
b20(1,:);
s=[];
for i=1:getichangdu
if b20(1,i)>zuojie & b20(1,i)<youjie
s(:,i)=0;
else
s(:,i)=1;
end
end
s;
if sum(s)==0
b20(1,:);
b20(2,:);
break;
else
r2=rand;
b22(1,:)=b1(1,:)+r2.*(b1(1,:)-b1(2,:));
b22(2,:)=b1(1,:)-r2.*(b1(1,:)-b1(2,:));
end
b20(1,:)=b22(1,:);
b20(2,:)=b22(2,:);
end
b2(1,:)=b20(1,:);
b2(2,:)=b20(2,:);
else
r3=rand;
b20(2,:)=b1(2,:)+r3.*(b1(2,:)-b1(1,:));
b20(1,:)=b1(2,:)-r3.*(b1(2,:)-b1(1,:));
while 1
b20(2,:);
s=[];
for i=1:getichangdu
if b20(2,i)>zuojie & b20(2,i)<youjie
s(:,i)=0;
else
s(:,i)=1;
end
end
s;
if sum(s)==0
b20(1,:);
b20(2,:);
break;
else
r4=rand;
b22(2,:)=b1(2,:)+r4.*(b1(2,:)-b1(1,:));
b22(1,:)=b1(2,:)-r4.*(b1(2,:)-b1(1,:));
end
b20(1,:)=b22(1,:);
b20(2,:)=b22(2,:);
end
end
b2(1,:)=b20(1,:);
b2(2,:)=b20(2,:);
bbb(u1,:)=b2(1,:);
bbb(u1+pppp/2,:)=b2(2,:);
end %到此,對(duì)所有交叉?zhèn)€體過程完畢
bbb;
%下面進(jìn)行變異
TL=[];
baaaa=zeros(round(pp*p3),getichangdu);%存放變異后符合條件的個(gè)體
for ii=1:round(pp*p3) %用round(pp*p3)可保證當(dāng)pp*p3是小數(shù)時(shí),循環(huán)次數(shù)也是整數(shù)
y11=1+(pp-1)*rand(1,1);%產(chǎn)生[1,pp]內(nèi)的隨機(jī)數(shù)
y111=round(y11); %產(chǎn)生[1,pp]內(nèi)的隨機(jī)數(shù)后,取整
aaaa1=ww(y111,:); %從初始ww中取出整數(shù)對(duì)應(yīng)的行對(duì)應(yīng)的個(gè)體,即變異前的個(gè)體
xbest=aaaa1; %先假設(shè)變異前的最好
fbest=f(:,y111); %先假設(shè)變異前的最好
pj(:,L)=sum(f)/pp ; %渴望適應(yīng)度水平取做要變異個(gè)體所在父代的群體適應(yīng)度平均值
kw=pj(:,L);%渴望適應(yīng)度水平取做要變異個(gè)體所在父代的群體適應(yīng)度平均值
aaaa1;
for tw0=1:NS %NS是在一個(gè)鄰域內(nèi)的搜索次數(shù)
xbest;
aaaa=aaaa1+(zuojie-aaaa1)+(youjie-aaaa1-(zuojie-aaaa1)).*rand(1,getichangdu);;
%下面計(jì)算變異后的個(gè)體的適應(yīng)度
for j=1:c %c是訓(xùn)練樣本個(gè)數(shù),;
L1(:,j)=[aaaa(1,1:mm);aaaa(1,mm+1:2*mm);aaaa(1,2*mm+1:3*mm);aaaa(1,3*mm+1:4*mm)]*xunlianyangben(:,j+i0-1)-[aaaa(1,getichangdu-k11:getichangdu-1)]'; %LL=zeros(2,1),; %這步是對(duì)隱層的輸入
LL1(:,j)=(1+exp(-L1(:,j))).^(-1); %L1=zeros(2,1); %對(duì)隱層的輸出
LLL1(:,j)=[aaaa(1,4*mm+1:4*mm+k11)]*LL1(:,j)-aaaa(1,getichangdu); %這步是對(duì)輸出層的輸入
LLLL1(:,j)=(1+exp(-LLL1(:,j))).^(-1); %L5=zeros(1,1) %這步是對(duì)輸出層的輸出
y(:,j)=LLLL1(:,j); %y(j) =zeros(1,1) %再加上輸出層的閾值,得到最后的輸出
T(:,j)=guiyihua(j+i0-1+c,a0);%目標(biāo)輸出 %T(j)=zeros(1,1) %對(duì)每個(gè)樣本的目標(biāo)輸出
end
y;
T;
Er=y-T; %Er=zeros(1,1);
Er;
E=(sum(Er.^2));%先求第一個(gè)樣本的誤差,再得所有樣本的誤差E。
E;
PP3=1/E; %變異后染色體的適應(yīng)度
if PP3>kw %把變異后染色體的適應(yīng)度與渴望水平比較
xbest=aaaa;
pp0=xbest;
fbest=PP3;
kw=PP3;
sz=size(TL,2);
if sz>du %整個(gè)迭代中,禁忌表的長(zhǎng)度是固定的,所以若長(zhǎng)度即列數(shù)超過,超過幾就把前幾列去掉,操作中就設(shè)為空陣
dd=sz-du;
TL(:,1:dd)=[];
end
%下面判斷滿足PP3>kw時(shí),PP3是否在禁忌表范圍內(nèi),若不在,存入禁忌表
s3=[];
for tz=1:size(TL,2)
if PP3<=TL(1,tz)-10^(-4) | PP3>=TL(1,tz)+10^(-4)
s3(tz)=0;
else
s3(tz)=1;
end
end
s3;
if sum(s3)==0 %說明aaaa(g1,:)不在禁忌表內(nèi)
TL=[TL PP3];
end %到此,判斷完畢
end
if PP3<=kw
s3=[];%s3只是用于存放相對(duì)于TL的每一個(gè)數(shù)的比較,所以當(dāng)pp1的第一個(gè)數(shù)與TL的每一個(gè)數(shù)比較完,即一次循環(huán)完后,把它置空,開始下一循環(huán)
for tz=1:size(TL,2)
if PP3<=TL(1,tz)-10^(-4) | PP3>=TL(1,tz)+10^(-4)
s3(tz)=0;
else
s3(tz)=1;
end
end
s3;
if sum(s3)==0
xbest=aaaa;
pp0=xbest;
fbest=PP3;
TL=[TL PP3];
else
pp0=xbest;
end
end %到此,一個(gè)變異個(gè)體是否傳到下一代,在一個(gè)鄰域內(nèi)的一次迭代過程中判斷完畢.
xbest=pp0;
end %到此,一個(gè)變異個(gè)體是否傳到下一代,在一個(gè)鄰域內(nèi)的所有迭代過程完畢
xbest; %代表一個(gè)鄰域內(nèi)的最好值
baaaa(ii,:)=xbest;
end %到此,變異過程完畢,遺傳的完整一代完畢
baaaa;
K=zeros(pp,getichangdu);
K=[w;bbb;baaaa]; %K中存放新種群
u=size(K,1);
if u<pp
uu=pp-u;
for rr=1:uu
wh(rr,:)=zuojie+jiechang*rand(1,getichangdu);
end
ww=[K;wh];
elseif u>pp
uu0=pp-u;
K(1:uu0,:)=[];
ww=K;
else
ww=K;
end
ww;
ll=ll+1 %從此,進(jìn)入遺傳的下一代
daishu=[daishu L];
end
zd1;%存放每代的最大適應(yīng)度
mmm; %存放每代的最大適應(yīng)度對(duì)應(yīng)的個(gè)體序號(hào) mmm是(1,L)
mmmm; %存放每代的最大適應(yīng)度對(duì)應(yīng)的個(gè)體 mmmm是(L,28)
uuu=[daishu;mmm;zd1] ;%uuu的第一行為遺傳代數(shù),第二行為每代的最大適應(yīng)度對(duì)應(yīng)的個(gè)體序號(hào),第三行是每代的最大適應(yīng)度對(duì)應(yīng)的個(gè)體
zd2=max(zd1);
for L=1:M
if zd2==zd1(:,L)
U=mmmm(L,:);%取出mmmm第L行,放入U(xiǎn)
UU=uuu(:,L);%UU存放所有代中的適應(yīng)度的最大值對(duì)應(yīng)的那一列
end
end
uuu;
UU;
U; % U是最后需要的最優(yōu)個(gè)體, 到此,整個(gè)遺傳禁忌搜索完畢。%
v1=[U(1,1:mm);U(1,mm+1:2*mm);U(1,2*mm+1:3*mm);U(1,3*mm+1:4*mm)] ; %取出 U的1-24個(gè)數(shù)是輸入與隱層的權(quán)值
vv1=[U(1,4*mm+1:4*mm+k11)]'; % 第25到28個(gè)數(shù)作為隱層到輸出層的權(quán)值
t1=[U(1,getichangdu-k11:getichangdu-1)]'; % 第29到32個(gè)數(shù)作為隱層閾值
tt1=U(1,getichangdu); %最后一個(gè)數(shù)是輸出層閾值
v1;
vv1;
ru1=v1*jianyanyangben(:,i0)-t1;
chu1=(1+exp(-ru1)).^(-1);
ru2=vv1'*chu1-tt1;
chu2=(1+exp(-ru2)).^(-1);
Y=chu2;
TT=guiyihua(i0+c-1+7,a0);
Y1(:,i0)=(max(quanyangben)-min(quanyangben))*(Y-0.1)./(0.9-0.1)+(min(quanyangben)); %再把y換回x=1/2*(max-min)*y+1/2*(max+min)
TT1(:,i0)=(max(quanyangben)-min(quanyangben))*(TT-0.1)./(0.9-0.1)+(min(quanyangben));
t22(:,i0)=(Y1(:,i0)-TT1(:,i0))/Y1(:,i0)*100 ;
end
Y1
TT1
t22
t=toc;
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -