📄 variation.m
字号:
%对染色体进行变异运算
function NewW=variation(NewW,gc,gm)
%变异率
Pm=0.05;
%计算交叉次数
m=[size(NewW(1).w1,1),size(NewW(1).w2,1),size(NewW(1).b1,1),size(NewW(1).b2,1)];
n=[size(NewW(1).w1,2),size(NewW(1).w2,2),size(NewW(1).b1,2),size(NewW(1).b2,2)];
P=length(NewW);
MutNum=Pm*m.*n*P;
for i=1:MutNum(1)
%选择参与变异操作的基因座
a=floor(1+(m(1)-1)*rand+0.5);
b=floor(1+(n(1)-1)*rand+0.5);
%选择参与变异操作的染色体
c=floor(2+(P-2)*rand+0.5);
%计算权向量的边界
[bl1 br1]=findminmax(NewW(c).w1);
md=sign(rand-0.5);
if md
NewW(c).w1(a,b)=NewW(c).w1(a,b)-Mutfun(NewW(c).w1(a,b),gc,gm,bl1,br1);
else
NewW(c).w1(a,b)=NewW(c).w1(a,b)+Mutfun(NewW(c).w1(a,b),gc,gm,bl1,br1);
end
end
for i=1:MutNum(2)
%选择参与变异操作的基因座
a=floor(1+(m(2)-1)*rand+0.5);
b=floor(1+(n(2)-1)*rand+0.5);
%选择参与变异操作的染色体
c=floor(2+(P-2)*rand+0.5);
%计算权向量的边界
[bl2 br2]=findminmax(NewW(c).w2(a,b));
md=sign(rand-0.5);
if md
NewW(c).w2(a,b)=NewW(c).w2(a,b)-Mutfun(br2-NewW(c).w2(a,b),gc,gm,bl2,br2);
else
NewW(c).w2(a,b)=NewW(c).w2(a,b)+Mutfun(NewW(c).w2(a,b)-bl2,gc,gm,bl2,br2);
end
end
for i=1:MutNum(3)
%选择参与变异操作的基因座
a=floor(1+(m(3)-1)*rand+0.5);
b=floor(1+(n(3)-1)*rand+0.5);
%选择参与变异操作的染色体
c=floor(2+(P-2)*rand+0.5);
%计算权向量的边界
[bl3 br3]=findminmax(NewW(c).b1(a,b));
md=sign(rand-0.5);
if md
NewW(c).b1(a,b)=NewW(c).b1(a,b)-Mutfun(br3-NewW(c).b1(a,b),gc,gm,bl3,br3);
else
NewW(c).b1(a,b)=NewW(c).b1(a,b)+Mutfun(NewW(c).b1(a,b)-bl3,gc,gm,bl3,br3);
end
end
for i=1:MutNum(4)
%选择参与变异操作的基因座
a=floor(1+(m(4)-1)*rand+0.5);
b=floor(1+(n(4)-1)*rand+0.5);
%选择参与变异操作的染色体
c=floor(2+(P-2)*rand+0.5);
%计算权向量的边界
[bl4 br4]=findminmax(NewW(c).b2(a,b));
md=sign(rand-0.5);
if md
NewW(c).b2(a,b)=NewW(c).b2(a,b)-Mutfun(br4-NewW(c).b2(a,b),gc,gm,bl4,br4);
else
NewW(c).b2(a,b)=NewW(c).b2(a,b)+Mutfun(NewW(c).b2(a,b)-bl4,gc,gm,bl4,br4);
end
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -