📄 genetic.m
字号:
c=25;
p=rands(100,c)*5;
T=rand(1,c)*0;
A=[1.40,1.80,3.70;4.28,4.96,1.31;1.18,4.29,3.35;1.96,1.90,2.70;1.85,1.43,3.52;3.66,1.60,2.46;3.64,2.14,1.95;4.51,1.52,2.51;3.77,1.45,2.70;4.84,4.32,1.33;1.05,2.55,4.63;4.51,1.37,2.80;1.84,4.43,1.97;1.67,2.81,2.47;2.03,1.88,2.66;3.62,1.95,2.08;1.67,2.23,2.75;3.38,3.70,1.51;2.83,3.70,1.60;1.48,4.44,2.44;3.37,2.13,1.99;2.84,1.24,3.42;1.19,1.53,4.99;4.10,1.71,2.27;1.65,1.38,3.94;2.00,2.06,2.52;2.71,4.13,1.58;1.78,1.11,4.71;3.63,2.27,1.87;2.24,3.74,1.79;1.81,3.18,2.20;4.85,4.66,1.30;3.41,3.88,1.48;1.38,2.55,3.14;2.46,2.12,2.22;2.66,4.42,1.56;4.44,4.71,1.32;3.11,1.06,4.08;4.47,3.66,1.42;1.35,1.76,3.91;1.24,1.41,5.05;2.81,1.35,1.97;1.92,4.25,1.92;4.61,2.68,1.63;3.04,4.97,1.44;4.82,3.80,1.39;2.58,1.97,2.29;4.14,4.76,1.33;4.35,3.90,1.40;2.22,1.35,3.39]';%A原始数据
group=p;
for g=1:5000
sum1=0;
for i=1:25
group(1,i)=T(i);
end
for j=1:100
w1=[group(j,1),group(j,2);group(j,3),group(j,4);group(j,5),group(j,6);group(j,7),group(j,8);group(j,9),group(j,10)];% w1 输入之隐层输入权值
w01=[group(j,11);group(j,12);group(j,13);group(j,14);group(j,15)];% w01 隐层阈值
w2=[group(j,16),group(j,17),group(j,18),group(j,19),group(j,20)];% w2 隐层权值
w02=[group(j,21)];% w02 输出层阈值
sum=0;
for k=1:50% 计算适应值函数
x11=A(1,k)/5;
x12=A(2,k)/5;
x=[x11;x12];
u1=w1*x-w01;
o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
y=w2*o1-w02;
e=A(3,k)-y;
sum=sum+e^2;
end
group(j,22)=(50/sum);%group(j,22) 为个体适应值
fit=group(j,22);
sum1=sum1+fit;
end
average_fit(g)=sum1/100;%平均适应值
for i=1:100
group(i,24)=group(i,22)/ (sum1);% 个体适应值与群体适应值的比值
end
for i=1:100% 按适应值的大小排序
for j=1:(100-i)
m=j+1;
w=group(j,:);
z=group(m,:);
D=[w;z];
if group(j,22)<group(m,22);
F=flipud(D);%矩阵上下翻转
group(j,:)=F(1,:);
group(m,:)=F(2,:);
end
end
end
for i=1:25
T(i)=group(1,i);
end
f=T;
select_du=rand(60,c); % 选择算子产生交配池, select_du为交配池。
r=1;
for j=1:100
Pc=rand(1);
pc1=group(j,24)*10;
if Pc<pc1;
select_du(r,:)=group(j,:);
r=r+1;
end
end
m=round(r/2); %交叉算子
cross_p=rand(m*2,c);%交配后新个体放入 cross_p中
E=rand(1,c);
B=rand(1,c);
C=rand(1,c);
D=rand(1,c);
for i=1:m
as=rand(1);
ad=rand(1);
p1=round(as*m);
p2=round(ad*m);
if p1==0
select_p1=p1+1;
else
select_p1=p1;
end
if p2==0;
select_p2=p2+1;
else
select_p2=p2;
end
E=select_du (select_p1,:);%从交配池中选择交叉个体1
B=select_du( select_p2,:);%从交配池中选择交叉个体2
a=rands(1); %确定交叉概率
cross_loc=round(rand(1)*20)+1;
for l=1:21
if l<cross_loc
C(l)=E(l);%交配池后新个体1
D(l)=B(l);%交配池后新个体2
else
C(l)=a*E(l)+(1-a)*B(l);
D(l)=(1-a)*E(l)+a*B(l);
end
end
cross_p(i,:)=C;
t=m*2-i+1;
cross_p(t,:)=D;
end
Pm=0.2;%变异算子
H=rand(1,c);
G=rand(1,c);
for i=1:2*m
mut_p=rand(1);%变异概率
if mut_p<Pm;
H=cross_p(i,:);%选择变异个体
G=H;
end
mut_loc=round(rand(1)*21)+1;%变异位置
if mut_loc==0
mut_loc=mut_loc+1;
end
if g<1000
v=30;
else if g<2000
v=20;%变异量大小
else if g<3000
v=5;
else v=1;
end
end
end
G(mut_loc)=mut_p*H(mut_loc)+v*rands(1);%变异
cross_p(i,:)=G;
end
for i=1:2*m%变异后的个体放入前一代群体中形成新群体
s=95-i;
group(s,:)=cross_p(i,:);
end
w12=[T(1),T(2);T(3),T(4);T(5),T(6);T(7),T(8);T(9),T(10)];% w12 输入之隐层输入权值
w012=[T(11);T(12);T(13);T(14);T(15)];% w012 隐层阈值
w22=[T(16),T(17),T(18),T(19),T(20)];% w22 隐层权值
w022=[T(21)];% w022 输出层阈值
sum5=0;
l=0;
for l=1:50% 计算最佳个体适应值函数
x1=A(1,l)/5;
x2=A(2,l)/5;
x=[x1;x2];
u1=w12*x-w01;
o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
y2(l)=w22*o1-w022;
e=A(3,l)-y2(l);
sum5=sum5+e^2;
end
n(g)=T(22);
end
sum1=0;
S1=rand(2,50)*4;
S1=0.1*ones(size(S1))+S1+ones(size(S1));%随即产生检验样本
sume=0;
for k=1:50
x1(k)=S1(1,k);
x2(k)=S1(2,k);
y11(k)=(1+x1(k)^(-2)+x2(k)^(-1.5))^2;
x=[x1(k)/5;x2(k)/5];
u1=w12*x-w012;
o1=[1/(1+exp(-u1(1)));1/(1+exp(-u1(2)));1/(1+exp(-u1(3)));1/(1+exp(-u1(4)));1/(1+exp(-u1(5)))];
y1(k)=w22*o1-w022;
e(k)=y11(k)-y1(k);
sum=sum+e(k)^2;
sum1=sum1+e(k);
average_E(k)=sum1/50;
SE=sum/50;
sume=sume+e(k)^2;
end
average_E=sum1/20%平均误差
S=sqrt(sume/19)%均方差
max=0;
for i=1:50
if abs(max)<abs(e(i))
max=e(i);%最大误差
end
end
max
subplot(3,1,1);plot(e);
grid;
xlabel('检验数据个数');
ylabel('误差');
title('检验误差曲线');
subplot(3,1,2);plot(n);
xlabel('遗传代数T');
ylabel('最佳个体适应值');
%title('最佳个体适应值曲线');
grid;
subplot(3,1,3);plot(average_fit);
xlabel('遗传代数T');
ylabel('平均适应值');
%title('平均适应值曲线');
grid;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -