能不能帮忙看个程序啊
clc
clear
%读取数据
%节点个数
inputnum=15;
hiddennum=31;
outputnum=5;
%训练数据和预测数据
P=[0.112 0.123 0.1348 0.1251 0.1351 0.1296 0.1143 0.1025 0.1321 0.1287;
0.8087 0.7641 1.096 0.8505 0.4881 0.6257 0.8843 0.6868 0.7741 0.8212;
0.5615 0.6731 1.0763 0.9772 0.8487 0.5155 0.8392 0.6281 0.7732 0.5213;
0.8224 0.847 1.2066 0.9704 0.9307 0.7015 1.1443 0.8903 0.9843 1.0228;
0.7873 0.784 1.2069 0.9005 0.4663 0.6051 0.8972 0.6713 0.5632 0.6342;
0.65 0.639 0.9221 0.8575 0.6365 0.848 0.5214 0.7389 0.5332 0.4213;
0.5245 0.832 0.6127 0.622 0.9831 1.211 0.1762 0.489 0.9881 0.2565;
0.5218 1.282 0.9217 0.3729 0.711 0.1528 0.299 0.4772 1.292 0.7018;
0.228 0.274 0.5821 0.723 1.2103 0.6624 0.493 0.3516 0.7355 0.5218;
0.9882 0.583 0.7742 0.902 0.4026 0.9528 0.5629 0.4218 0.8923 0.532;
0.8372 0.8374 0.1142 0.638 0.263 0.7008 0.8249 0.3746 0.827 0.1004;
1.21 0.7218 0.5218 0.218 0.3759 0.3024 0.4933 0.856 0.3975 0.8274;
0.1384 0.1102 0.9005 0.832 0.4664 0.2565 0.8003 0.2355 0.6392 0.6623;
0.21 0.3736 0.8572 0.133 0.9712 0.3028 0.4771 0.8236 0.1039 1.037;
0.319 0.8203 0.7371 1.173 0.7392 0.2821 0.3924 0.593 0.7029 0.9928];
P_test=[0.102 0.123 0.1348 0.1331 0.1351 0.1296 0.1143 0.1025 0.1321 0.1287;
0.9087 0.7641 1.096 0.8505 0.5881 0.6257 0.8843 0.7868 0.7741 0.8212;
0.8824 0.847 1.2066 0.9704 0.8307 0.7015 1.1443 0.8903 0.9843 1.022]';
T=[0 0 0 0 1;0 0 0 0 1;0 0 0 0 1;0 0 0 1 0;0 0 0 1 0;0 0 0 1 0;0 0 1 0 0;0 0 1 0 0;0 0 1 0 0;
0 1 0 0 0;0 1 0 0 0;0 1 0 0 0;1 0 0 0 0;1 0 0 0 0;1 0 0 0 0]';
%选连样本输入输出数据归一化
% [inputn,inputps]=mapminmax(input_train);
% [outputn,outputps]=mapminmax(output_train);
P=minmax(P);
T=minmax(T);
%构建网络
net= newff(minmax(P),[31,5],{'tansig','logsig'},'trainlm');
% 参数初始化
%粒子群算法中的两个参数
numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;
c1 = 1.49445;
c2 = 1.49445;
maxgen=100; % 进化次数
sizepop=20; %种群规模
Vmax=1;
Vmin=-1;
popmax=5;
popmin=-5;
for i=1:sizepop
pop(i,:)=5*rands(1,numsum);
V(i,:)=rands(1,numsum);
fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,P,T);
end
% 个体极值和群体极值
[bestfitness bestindex]=min(fitness);
zbest=pop(bestindex,:); %全局最佳
gbest=pop; %个体最佳
fitnessgbest=fitness; %个体最佳适应度值
fitnesszbest=bestfitness; %全局最佳适应度值
%% 迭代寻优
for i=1:maxgen
i
for j=1:sizepop
%速度更新
V(j,:) = V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)
%种群更新
pop(j,:)=pop(j,:)+0.2*V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)
%自适应变异
pos=unidrnd(21);
if rand>0.95
pop(j,pos)=5*rands(1,1);
end
%适应度值
fitness(j)=fun(pop(j,:),inputnum,hiddennum,outputnum,net,P,T);
end
for j=1:sizepop
%个体最优更新
if fitness(j) < fitnessgbest(j)
gbest(j,:) = pop(j,:);
fitnessgbest(j) = fitness(j);
end
%群体最优更新
if fitness(j) < fitnesszbest
zbest = pop(j,:);
fitnesszbest = fitness(j);
end
end
yy(i)=fitnesszbest;
end
%% 结果分析
plot(yy)
title(['适应度曲线 ' '终止代数=' num2str(maxgen)]);
xlabel('进化代数');ylabel('适应度');
x=zbest;
%% 把最优初始阀值权值赋予网络预测
% %用遗传算法优化的BP网络进行值预测
w1=zbest(1:inputnum*hiddennum);
B1=zbest(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=zbest(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=zbest(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2';
% net=newff(inputnum,outputnum,hiddennum);
%% BP网络训练
%网络进化参数
net.trainParam.epochs=100;
net.trainParam.lr=0.1;
%net.trainParam.goal=0.00001;
%网络训练
net=train(net,P,T);
%% BP网络预测
%数据归一化
y=sim(net,P);
y_test=sim(net,P_test)
子程序如下:
function error = fun(x,inputnum,hiddennum,outputnum,net,P,T)
%该函数用来计算适应度值
%x input 个体
%inputnum input 输入层节点数
%outputnum input 隐含层节点数
%net input 网络
%inputn input 训练输入数据
%outputn input 训练输出数据
%error output 个体适应度值
%提取
w1=x(1:inputnum*hiddennum);
B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
%网络权值赋值
net.iw{1,1}=reshape(w1,hiddennum,inputnum);
net.lw{2,1}=reshape(w2,outputnum,hiddennum);
net.b{1}=reshape(B1,hiddennum,1);
net.b{2}=B2';
% %
% % %网络训练
an=sim(net,P);
% %
error=sum(abs(an-T));
In an assignment A(I) = B, the number of elements in B and
I must be the same.
Error in ==> PSO at 62
fitness(i)=fun(pop(i,:),inputnum,hiddennum,outputnum,net,P,T);