📄 yichuansufa.m
字号:
ww=[];
for i=1:pp
ww(i,:)=zuojie+jiechang*rand(1,getichangdu); %存放所有权值和阈值放到一行的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),; %这步是对隐层的输入
LL0(:,j)=(1+exp(-L0(:,j))).^(-1); %对隐层的输出
LLL0(:,j)=[ww(i,4*mm+1:4*mm+k11)]*LL0(:,j)-ww(i,getichangdu); %这步是对输出层的输入
LLLL0(:,j)=(1+exp(-LLL0(:,j))).^(-1); %这步是对输出层的输出
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条染色体的适应度
end
%为得到最后结果,下面设置daishu表明是第几代,下面的mmm存放每代最大适应度个体在群体的位置,mmmm存放其最大适应度对应的个体
f; %存放一代的所有染色体的适应度,f是一行pp列
zd1(:,L)=max(f); %zd1存放每代适应度的最大值
for i=1:pp
if max(f)==f(:, i)
mmm(:,L)=i; %mmm存放最大适应度个体对应的序号
mmmm(L,:)=ww(i,:); %mmmm存放最大适应度对应的个体
end
end
f1=sum(f);
f1;
for i=1:pp
ff(i)=f(i)/f1; %每个个体的相对适应度,即每个个体在复制中被选中的概率
end
ff; %按顺序存放所有个体的相对适应度
for i=1:pp
k(i)=sum(ff(:,1:i));%通过ff的前i列求和计算累计概率
end
k; %按顺序存放所有个体的累计概率
%w存放复制后得到的个体
w=zeros(round(pp*p1),getichangdu);
%依据pp*p1是几,就循环多少次
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,发现k(3)=0.5,k(4)=0.8,k(5)=1都大于r,但应该取第三个个体,所以应该取3,4,5的最小值
l;
w(ii,:)=ww(l,:);
break;
end
end
end
w;
%下面选出用于交叉的个体,个数是pppp个,所以需保证pppp是偶数
if mod(round(pp*p2),2)~=0 %若pp*p2取整后是奇数
pppp=round(pp*p2)-1; %把奇数减1使成为偶数
else %若pp*p2取整后是偶数,按个数round(pp*p2)给 pppp进行交叉
pppp=round(pp*p2);
end
%下面产生[1,pp]内pppp个随机数以便决定哪些个个体交叉
y1=1+(pp-1)*rand(1,1);%选1到pp内的随机数
y1;
y2(:,u)=round(y1);%对随机数y1取整,放到y2(:,u)
bb(u,:)=ww(y2(:,u),:); %对y1取整对应的整数是几,就是种群的第几个个体即第几行放入bb
pp2(:,u)=f(:,y2(:,u)); %已取出的用于交叉但还未交叉的个体的适应度
end
bb ; %存放取出用于交叉但还未交叉的个体
pp2;
%下面对上面产生的bb中的pppp个个体实行交叉
%,交叉方法是:bb中第u1行即第u1个个体与第(u1+pppp/2)个个体交叉,通过产生两次随机数得到交叉后的两个个体
%下面依据pppp/2是几就循环多少次
% b1=zeros(2,woo);
% pj(:,L)=sum(f)/pp ; %一代群体适应度的平均值
for u1=1:pppp/2
b1(1,:)=bb(u1,:);%取出bb中第u1个个体
b1(2,:)=bb((u1+pppp/2),:); %取出bb中第(u1+pppp/2)个个体 """""" 把它作为初始解",相当于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 %到此,对所有交叉个体过程完毕
bbb;
%下面进行变异
TL=[];
baaaa=zeros(round(pp*p3),getichangdu);%存放变异后符合条件的个体
for ii=1:round(pp*p3) %用round(pp*p3)可保证当pp*p3是小数时,循环次数也是整数
y11=1+(pp-1)*rand(1,1);%产生[1,pp]内的随机数
y111=round(y11); %产生[1,pp]内的随机数后,取整
aaaa1=ww(y111,:); %从初始ww中取出整数对应的行对应的个体,即变异前的个体
xbest=aaaa1; %先假设变异前的最好
fbest=f(:,y111); %先假设变异前的最好
pj(:,L)=sum(f)/pp ; %渴望适应度水平取做要变异个体所在父代的群体适应度平均值
kw=pj(:,L);%渴望适应度水平取做要变异个体所在父代的群体适应度平均值
aaaa1;
for tw0=1:NS %NS是在一个邻域内的搜索次数
xbest;
aaaa=aaaa1+(zuojie-aaaa1)+(youjie-aaaa1-(zuojie-aaaa1)).*rand(1,getichangdu);;
%下面计算变异后的个体的适应度
for j=1:c %c是训练样本个数,;
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),; %这步是对隐层的输入
LL1(:,j)=(1+exp(-L1(:,j))).^(-1); %L1=zeros(2,1); %对隐层的输出
LLL1(:,j)=[aaaa(1,4*mm+1:4*mm+k11)]*LL1(:,j)-aaaa(1,getichangdu); %这步是对输出层的输入
LLLL1(:,j)=(1+exp(-LLL1(:,j))).^(-1); %L5=zeros(1,1) %这步是对输出层的输出
y(:,j)=LLLL1(:,j); %y(j) =zeros(1,1) %再加上输出层的阈值,得到最后的输出
T(:,j)=guiyihua(j+i0-1+c,a0);%目标输出 %T(j)=zeros(1,1) %对每个样本的目标输出
end
y;
T;
Er=y-T; %Er=zeros(1,1);
Er;
E=(sum(Er.^2));%先求第一个样本的误差,再得所有样本的误差E。
E;
PP3=1/E; %变异后染色体的适应度
if PP3>kw %把变异后染色体的适应度与渴望水平比较
xbest=aaaa;
pp0=xbest;
fbest=PP3;
kw=PP3;
sz=size(TL,2);
if sz>du %整个迭代中,禁忌表的长度是固定的,所以若长度即列数超过,超过几就把前几列去掉,操作中就设为空阵
dd=sz-du;
TL(:,1:dd)=[];
end
%下面判断满足PP3>kw时,PP3是否在禁忌表范围内,若不在,存入禁忌表
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,:)不在禁忌表内
TL=[TL PP3];
end %到此,判断完毕
end
if PP3<=kw
s3=[];%s3只是用于存放相对于TL的每一个数的比较,所以当pp1的第一个数与TL的每一个数比较完,即一次循环完后,把它置空,开始下一循环
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 %到此,一个变异个体是否传到下一代,在一个邻域内的一次迭代过程中判断完毕.
xbest=pp0;
end %到此,一个变异个体是否传到下一代,在一个邻域内的所有迭代过程完毕
xbest; %代表一个邻域内的最好值
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 %从此,进入遗传的下一代
daishu=[daishu L];
end
zd1;%存放每代的最大适应度
mmm; %存放每代的最大适应度对应的个体序号 mmm是(1,L)
mmmm; %存放每代的最大适应度对应的个体 mmmm是(L,28)
uuu=[daishu;mmm;zd1] ;%uuu的第一行为遗传代数,第二行为每代的最大适应度对应的个体序号,第三行是每代的最大适应度对应的个体
zd2=max(zd1);
for L=1:M
if zd2==zd1(:,L)
U=mmmm(L,:);%取出mmmm第L行,放入U
UU=uuu(:,L);%UU存放所有代中的适应度的最大值对应的那一列
end
end
uuu;
UU;
U; % U是最后需要的最优个体, 到此,整个遗传禁忌搜索完毕。%
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个数是输入与隐层的权值
vv1=[U(1,4*mm+1:4*mm+k11)]'; % 第25到28个数作为隐层到输出层的权值
t1=[U(1,getichangdu-k11:getichangdu-1)]'; % 第29到32个数作为隐层阈值
tt1=U(1,getichangdu); %最后一个数是输出层阈值
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -