⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yichuanbp.txt

📁 利用bp算法训练神经网络
💻 TXT
字号:
%我这优异份遗传算法实现BP神经网络的程序,但是用Matlab程序编的,不晓得对你有没有用?
f1=[696,704,694,698,695,694,660,658,658,655,658,663,697,694,693,696,695,696,666,660,665,663,663,664];
a=[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  2 3 1 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  3 4 2 1 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  2 3 4 5 1 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  3 4 5 6 1 2 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  4 5 6 7 1 2 3 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  5 6 7 8 1 2 3 4 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  6 7 8 9 1 2 3 4 5 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  7 8 9 10 1 2 3 4 5 6 11 12 13 14 15 16 17 18 19 20 21 22 23 24;
  8 9 10 11 1 2 3 4 5 6 7 12 13 14 15 16 17 18 19 20 21 22 23 24;
  9 10 11 12 1 2 3 4 5 6 7 8 13 14 15 16 17 18 19 20 21 22 23 24;
  10 11 12 13 1 2 3 4 5 6 7 8 9 14 15 16 17 18 19 20 21 22 23 24;
  11 12 13 14 1 2 3 4 5 6 7 8 9 10 15 16 17 18 19 20 21 22 23 24;
  12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 16 17 18 19 20 21 22 23 24;
  13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 17 18 19 20 21 22 23 24;
  14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 18 19 20 21 22 23 24;
  15 16 17 18 1 2 3 4 5 6 7 8 9 10 11 12 13 14 19 20 21 22 23 24;
  16 17 18 19 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 20 21 22 23 24;
  17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 21 22 23 24;
  18 19 20 21 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 23 24 22;
  19 20 21 22 6 7 8 9 10 11 12 13 14 15 16 17 18 1 2 3 4 5 24 23;
  20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19;
  19 20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18;
  18 19 20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17;
  15 16 17 18 19 20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11 12 13 14;
  12 13 14 15 16 17 18 19 20 21 22 23 24 1 2 3 4 5 6 7 8 9 10 11;
  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1 2 3 4 5 6 7 8;
  3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2 1;
  7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 21 22 23 24 17 18 19 20;
  5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 24 20 22 21 23 2 3 4 1];
pc=0.4;%交叉概率%
pv=0.01;%变异概率%
for n=1:20000

%计算各种群的适应度
for i=1:30
  for j=1:24
    a1(i,j)=f1(a(i,j));
  end
end

for i=1:30
  m=a(i,:);
f(i)=max(0,10^9-(10^3*(((sum(m(1:4))^2+sum(m(5:8))^2+sum(m(9:12))^2+sum(m(13:16))^2+sum(m(17:20))^2+sum(m(21:24))^2)/6-(sum(m)/6)^2)+max(0,(((m(1)+m(2)+m(3)+m(4))-(m(5)+m(6)+m(7)+m(8)))^2-64))+max(0,(((m(5)+m(6)+m(7)+m(8))-(m(9)+m(10)+m(11)+m(12)))^2-64))+max(0,(((m(9)+m(10)+m(11)+m(12))-(m(13)+m(14)+m(15)+m(16)))^2-64))+max(0,(((m(13)+m(14)+m(15)+m(16))-(m(17)+m(18)+m(19)+m(20)))^2-64))+max(0,(((m(17)+m(18)+m(19)+m(20))-(m(21)+m(22)+m(23)+m(24)))^2-64))+max(0,(((m(21)+m(22)+m(23)+m(24))-(m(1)+m(2)+m(3)+m(4)))^2-64)))));
end

shiying=f;
c=shiying;
%d1为最大适应度种群
for j=1:30
  if c(j)==max(c)
    c(j)=-1;
    t(1)=j;
    d1=a(j,:);
    break;
  end
end
%d2为次大适应度种群
for j=1:30
  if c(j)==max(c)
    t(2)=j;
    d2=a(j,:);
    break;
  end
end

%保留两个适应度最大的不参与复制、交叉和变异

for j=max(t):29
  a(j,:)=a(j+1,:);
end

for j=min(t):29
  a(j,:)=a(j+1,:);
end

a(29,:)=d2;
a(30,:)=d1;
x=a;                         

%相当于将适应度最大的排到矩阵的最后两行,其他的依次向前进一位   

for i=1:30
  for j=1:24
    a1(i,j)=f1(a(i,j));      %f1为适应度函数
  end
end           

for i=1:30
  m=a(i,:);
  f(i)=max(0,10^9-(10^3*(((sum(m(1:4))^2+sum(m(5:8))^2+sum(m(9:12))^2+sum(m(13:16))^2+sum(m(17:20))^2+sum(m(21:24))^2)/6-(sum(m)/6)^2)+max(0,(((m(1)+m(2)+m(3)+m(4))-(m(5)+m(6)+m(7)+m(8)))^2-64))+max(0,(((m(5)+m(6)+m(7)+m(8))-(m(9)+m(10)+m(11)+m(12)))^2-64))+max(0,(((m(9)+m(10)+m(11)+m(12))-(m(13)+m(14)+m(15)+m(16)))^2-64))+max(0,(((m(13)+m(14)+m(15)+m(16))-(m(17)+m(18)+m(19)+m(20)))^2-64))+max(0,(((m(17)+m(18)+m(19)+m(20))-(m(21)+m(22)+m(23)+m(24)))^2-64))+max(0,(((m(21)+m(22)+m(23)+m(24))-(m(1)+m(2)+m(3)+m(4)))^2-64)))));
end

shiying=f;
gailv=shiying(1:28)./sum(shiying(1:28));%计算前28个组群在圆盘上的概率
count=zeros(1,28);
m=rand(1,28);

for j=1:28
  for i=1:27
    if m(j)<sum(gailv(1:(i+1)))&m(j)>sum(gailv(1:i))
      count(i+1)=count(i+1)+1;
      break;
    else 
      if m(j)<gailv(1) 
      count(1)=count(1)+1;
      break;
    else 
      if m(j)==sum(gailv(1:i))
          if gailv(i)>=gailv(i+1)
            count(i)=count(i)+1;
            break;
          else count(i+1)=count(i+1)+1;
            break;
          end
      end
    end
  end
end

end       
%按转盘思想标记         
xin=zeros(30,24);
for i=1:28
  if count(i)>0
    for j=1:28
        if xin(j,:)==zeros(1,24)
          break;
        end
    end
    for k=j:(sum(count(1:i)))
        xin(k,:)=x(i,:);
    end
  end
end

xin(29,:)=x(29,:);
xin(30,:)=x(30,:);
% 选择   
x=xin;

for j=1:28
  m=rand(1);
  if m>pc
    x(j,:)=zeros(1,24);
  end
end     %按照交叉概率构成一组父本群x 

k=0;
for j=1:28
  if x(j,:)~=zeros(1,24)
    k=k+1;
    xuhao(k)=j;%将父本的序号给数组xuhao 
  end
end

while k<2
  x=xin;
for j=1:28
  m=rand(1);
  if m>pc
    x(j,:)=zeros(1,24);
  end
end     %按照交叉概率构成一组父本群x

k=0;

for j=1:28
  if x(j,:)~=zeros(1,24)
    k=k+1;
    xuhao(k)=j; %将父本的序号给数组xuhao
  end
end
end

%保证至少有两个父本进行交叉       

k=0;

for j=1:28
  if x(j,:)~=0
    k=k+1;
    xz(k,:)=x(j,:);
  end
end     %xz矩阵和xuhao是一一对应的   

for i=1:k
  gailv_1(i)=1/k;
end

m_1=rand(1,2);
for i=1:(k-1)
  if m_1(1)<=sum(gailv_1(1:(i+1)))&m_1(1)>sum(gailv_1(1:i))
      weizhi_1=i+1;
    else 
      if m_1(1)<=gailv_1(1) 
      weizhi_1=1;
      end
  end
end

for i=1:(k-1)
  if m_1(2)<=sum(gailv_1(1:(i+1)))&m_1(2)>sum(gailv_1(1:i))
      weizhi_2=i+1;
    else 
      if m_1(2)<=gailv_1(1) 
      weizhi_2=1;
      end
  end
end
if weizhi_1==weizhi_2
  t=1;
else 
  t=0;
end

while t==1
  m_1=rand(1,2);
for i=1:(k-1)
  if m_1(1)<=sum(gailv_1(1:(i+1)))&m_1(1)>sum(gailv_1(1:i))
      weizhi_1=i+1;
    else 
      if m_1(1)<=gailv_1(1) 
      weizhi_1=1;
      end
  end
end

for i=1:(k-1)
  if m_1(2)<=sum(gailv_1(1:(i+1)))&m_1(2)>sum(gailv_1(1:i))
      weizhi_2=i+1;
    else 
      if m_1(2)<=gailv_1(1) 
      weizhi_2=1;
      end
  end
end

if weizhi_1==weizhi_2
  t=1;
else 
  t=0;
end
end

%在父本中随机取两个在新矩阵中的位置weizhi_1,weizhi_2   

%即在原矩阵xin中 xuhao(weizhi_1) 和 xuhao(weizhi_2) 位置上的组群发生交叉 

for i=1:24
gailv_2(i)=1/24;
end

m_2=rand(1,2);

for i=1:23
if m_2(1)<=sum(gailv_2(1:(i+1)))&m_2(1)>sum(gailv_2(1:i))
      weizhi_3=i+1;
    else 
      if m_2(1)<=gailv_2(1) 
      weizhi_3=1;
      end
end
end

for i=1:23
if m_2(2)<=sum(gailv_2(1:(i+1)))&m_2(2)>sum(gailv_2(1:i))
      weizhi_4=i+1;
    else 
      if m_2(2)<=gailv_2(1) 
      weizhi_4=1;
      end
end
end

if weizhi_3==weizhi_4
  k=1;
else
  k=0;
end

while k==1
  m_2=rand(1,2);
for i=1:23
if m_2(1)<=sum(gailv_2(1:(i+1)))&m_2(1)>sum(gailv_2(1:i))
      weizhi_3=i+1;
    else 
      if m_2(1)<=gailv_2(1) 
      weizhi_3=1;
      end
end
end

for i=1:23
if m_2(2)<=sum(gailv_2(1:(i+1)))&m_2(2)>sum(gailv_2(1:i))
      weizhi_4=i+1;
    else 
      if m_2(2)<=gailv_2(1) 
      weizhi_4=1;
      end
end
end

if weizhi_3==weizhi_4
  k=1;
else
  k=0;
end

end

%随机取基因位的起点和终点       

v1=xin(xuhao(weizhi_1),min(weizhi_3,weizhi_4):max(weizhi_3,weizhi_4));
v2=xin(xuhao(weizhi_2),min(weizhi_3,weizhi_4):max(weizhi_3,weizhi_4));   
v1((abs(weizhi_3-weizhi_4)+2):(25+(abs(weizhi_3-weizhi_4))))=xin(xuhao(weizhi_2),:);
v2((abs(weizhi_3-weizhi_4)+2):(25+(abs(weizhi_3-weizhi_4))))=xin(xuhao(weizhi_1),:);
for i=1:(abs(weizhi_3-weizhi_4)+1)
  for j=(abs(weizhi_3-weizhi_4)+2):(24+(abs(weizhi_3-weizhi_4)+1))
    if v1(i)==v1(j)
        v1(j:(24+(abs(weizhi_3-weizhi_4))))=v1(j+1:(25+(abs(weizhi_3-weizhi_4))));
        break;
    end
  end
end

for i=1:(abs(weizhi_3-weizhi_4)+1)
  for j=(abs(weizhi_3-weizhi_4)+2):(24+(abs(weizhi_3-weizhi_4)+1))
    if v2(i)==v2(j)
        v2(j:(24+(abs(weizhi_3-weizhi_4))))=v2(j+1:(25+(abs(weizhi_3-weizhi_4))));
        break;
    end
  end
end

xin(xuhao(weizhi_1),:)=v1(1:24);
xin(xuhao(weizhi_2),:)=v2(1:24);

%交叉后形成新的组群

xin
x=xin;         

for j=1:28
  m=rand(1);
  if m>pv
    x(j,:)=zeros(1,24);
  end
end     %按照变异概率构成一组父本群x

k=0;
for j=1:28
  if x(j,:)~=zeros(1,24)
    k=k+1;
    xuhao(k)=j;   %将父本的序号给数组xuhao
  end
end

k=0;

if sum(xuhao)~=0
  for j=1:28
  if x(j,:)~=zeros(1,24)
    k=k+1;
    xz(k,:)=x(j,:);
  end
  end
end
for i=1:k
gailv_3(i)=1/k;
end

m_3=rand(1);
for i=1:(k-1)
if m_3<=sum(gailv_3(1:(i+1)))&m_3>sum(gailv_3(1:i))
      weizhi_1=i+1;
    else 
      if m_3<=gailv_3(1) 
      weizhi_1=1;
      end
end
end

%让xin矩阵中第xuhao(weizhi_1)个组群发生变异

for i=1:24
gailv_4(i)=1/24;
end

m_4=rand(1,2);
for i=1:23
if m_4(1)<=sum(gailv_4(1:(i+1)))&m_4(1)>sum(gailv_4(1:i))
      weizhi_2=i+1;
    else 
      if m_4(1)<=gailv_4(1) 
      weizhi_2=1;
      end
end
end

for i=1:23
if m_4(2)<=sum(gailv_4(1:(i+1)))&m_4(2)>sum(gailv_4(1:i))
      weizhi_3=i+1;
    else 
      if m_4(2)<=gailv_4(1) 
      weizhi_3=1;
      end
end
end

if weizhi_2==weizhi_3
  k=1;
else
  k=0;
end
while k==1
  m_4=rand(1,2);
for i=1:23
if m_4(1)<=sum(gailv_4(1:(i+1)))&m_4(1)>sum(gailv_4(1:i))
      weizhi_2=i+1;
    else 
      if m_4(1)<=gailv_4(1) 
      weizhi_2=1;
      end
end
end

for i=1:22
if m_4(2)<=sum(gailv_4(1:(i+1)))&m_4(2)>sum(gailv_4(1:i))
      weizhi_3=i+1;
    else 
      if m_4(2)<=gailv_4(1) 
      weizhi_3=1;
      end
end
end

if weizhi_2==weizhi_3
  k=1;
else
  k=0;
end
end

%xin(xuhao(weizhi_1),:)随机生成的数的位置是weizhi_2,weizhi_3

for i=min(weizhi_2,weizhi_3):max(weizhi_2,weizhi_3)
  h=xin(xuhao(weizhi_1),i);
  xin(xuhao(weizhi_1),i)=xin(xuhao(weizhi_1),(max(weizhi_2,weizhi_3)+min(weizhi_2,weizhi_3)-i));
  xin(xuhao(weizhi_1),(max(weizhi_2,weizhi_3)+min(weizhi_2,weizhi_3)-i))=h;
end

a=xin;

y1(n)=mean(f);

y2(n)=min(f);

y3(n)=max(f);

end

a

%运行结果如下:

%二万代:m=[704 693 658 658 694 663 696 664 655 698 666 695 660 663 696 695 658 697 665 694 694 660 663 696];

%计算方差得最优解为:1.8056

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -