%% 遗传算法的优化计算
%% 清空环境变量
clear all
clc
warning off
%% 声明全局变量
global P_train T_train P_test T_test mint maxt S s1
S = 19;
s1 = round(sqrt(19+1)+1);
%% 导入数据
load data3.mat
% 训练数据
P_train = input';
T_train = output;
% 测试数据
P_test = test';
T_test = test_output;
% 显示实验条件
count_1 = length(find(output == 1));
count_2 = length(find(output == 2));
count_3 = length(find(output == 3));
count_4 = length(find(output == 4));
number_1 = length(find(test_output == 1));
number_2 = length(find(test_output == 2));
number_3 = length(find(test_output == 3));
number_4 = length(find(test_output == 4));
disp('实验条件为:');
disp( ['训练集样本总数:' num2str(16)]);
disp( ['活塞敲缸响:' num2str(count_1)]);
disp( ['活塞销子响:' num2str(count_2)]);
disp( ['连杆轴承响:' num2str(count_3)]);
disp( ['曲轴轴承响:' num2str(count_4)]);
disp( ['测试集样本总数:' num2str(8)]);
disp( ['活塞敲缸响:' num2str(number_1)]);
disp( ['活塞销子响:' num2str(number_2)]);
disp( ['连杆轴承响:' num2str(number_3)]);
disp( ['曲轴轴承响:' num2str(number_4)]);
%% 创建单BP网络
t = cputime;
net_bp = newff(minmax(P_train),[s1,1],{'tansig','purelin'},'trainlm');
% 设置训练参数
net_bp.trainParam.epochs = 1000;
net_bp.trainParam.show = 10;
net_bp.trainParam.goal = 1e-10;
net_bp.trainParam.lr = 0.01;
net_bp.trainParam.showwindow = 0;
%% 训练单BP网络
net_bp = train(net_bp,P_train,T_train);
%% 仿真测试单BP网络
T_bp_sim = sim(net_bp,P_test);
e = cputime - t;
T_bp_sim(T_bp_sim >= 3.5) = 4;
T_bp_sim(T_bp_sim >= 2.5&T_bp_sim < 3.5) = 3;
T_bp_sim(T_bp_sim >= 1.5&T_bp_sim < 2.5) = 2;
T_bp_sim(T_bp_sim < 1.5) = 1;
result_bp = [T_bp_sim' T_test'];
%% 结果显示(单BP网络)
number_1_sim = length(find(T_bp_sim == 1 & T_test == 1));
number_2_sim = length(find(T_bp_sim == 2 & T_test == 2));
number_3_sim = length(find(T_bp_sim == 3 & T_test == 3));
number_4_sim = length(find(T_bp_sim == 4 & T_test == 4));
% number_5_sim = length(find(T_bp_sim == 5 & T_test == 5));
disp('(1)BP网络的测试结果为:');
disp(['活塞敲缸响:' num2str(number_1_sim)...
' 误诊:' num2str(number_1 - number_1_sim)...
' 确诊率p1 = ' num2str(number_1_sim/number_1*100) '%']);
disp(['活塞销子响:' num2str(number_2_sim)...
' 误诊:' num2str(number_2 - number_2_sim)...
' 确诊率p2 = ' num2str(number_2_sim/number_2*100) '%']);
disp(['连杆轴承响:' num2str(number_3_sim)...
' 误诊:' num2str(number_3 - number_3_sim)...
' 确诊率p3 = ' num2str(number_3_sim/number_3*100) '%']);
disp(['曲轴轴承响:' num2str(number_4_sim)...
' 误诊:' num2str(number_4 - number_4_sim)...
' 确诊率p4 = ' num2str(number_4_sim/number_4*100) '%']);
disp(['建模时间为:' num2str(e) 's'] );
%% 遗传算法优化
popu = 20;
bounds = ones(S,1)*[0,1];
% 产生初始种群
initPop = randi(popu,S,[0 1]);
% 计算初始种群适应度
initFit = zeros(popu,1);
for i = 1:size(initPop,1)
initFit(i) = de_code(initPop(i,:));
end
initPop = [initPop initFit];
gen = 100;
% 优化计算
[X,EndPop,BPop,Trace] = ga(bounds,'fitness',[],initPop,[1e-6 1 0],'maxGenTerm',...
gen,'normGeomSelect',0.09,'simpleXover',2,'boundaryMutation',[2 gen 3]);
[m,n] = find(X == 1);
disp(['优化筛选后的输入自变量编号为:' num2str(n)]);
% 绘制适应度函数进化曲线
figure
plot(Trace(:,1),Trace(:,3),'r:')
hold on
plot(Trace(:,1),Trace(:,2),'b')
xlabel('进化代数')
ylabel('适应度函数')
title('适应度函数进化曲线')
legend('平均适应度函数','最佳适应度函数')
xlim([1 gen])
%% 新训练集/测试集数据提取
p_train = zeros(size(n,2),size(T_train,2));
p_test = zeros(size(n,2),size(T_test,2));
for i = 1:length(n)
p_train(i,:) = P_train(n(i),:);
p_test(i,:) = P_test(n(i),:);
end
t_train = T_train;
%% 创建优化BP网络
t = cputime;
net_ga = newff(minmax(p_train),[round(sqrt(numel(n)+1)+1),1],{'tansig','purelin'},'trainlm');
% 训练参数设置
net_ga.trainParam.epochs = 1000;
net_ga.trainParam.show = 10;
net_ga.trainParam.goal = 1e-10;
net_ga.trainParam.lr = 0.01;
net_ga.trainParam.showwindow = 0;
%% 训练优化BP网络
net_ga = train(net_ga,p_train,t_train);
%% 仿真测试优化BP网络
T_ga_sim = sim(net_ga,p_test);
e = cputime - t;
T_ga_sim(T_ga_sim >= 3.5) = 4;
T_ga_sim(T_ga_sim >= 2.5&T_ga_sim < 3.5) = 3;
T_ga_sim(T_ga_sim >= 1.5&T_ga_sim < 2.5) = 2;
T_ga_sim(T_ga_sim < 1.5) = 1;
result_ga = [T_ga_sim' T_test'];
%% 结果显示(优化BP网络)
number_11_sim = length(find(T_ga_sim == 1 & T_test == 1));
number_22_sim = length(find(T_ga_sim == 2 & T_test == 2));
number_33_sim = length(find(T_ga_sim == 3 & T_test == 3));
number_44_sim = length(find(T_ga_sim == 4 & T_test == 4));
disp('(2)优化BP网络的测试结果为:');
disp(['活塞敲缸响:' num2str(number_11_sim)...
' 误诊:' num2str(number_1 - number_11_sim)...
' 确诊率p1 = ' num2str(number_11_sim/number_1*100) '%']);
disp(['活塞销子响:' num2str(number_22_sim)...
' 误诊:' num2str(number_2 - number_22_sim)...
' 确诊率p2 = ' num2str(number_22_sim/number_2*100) '%']);
disp(['连杆轴承响:' num2str(number_33_sim)...
' 误诊:' num2str(number_3 - number_33_sim)...
' 确诊率p3 = ' num2str(number_33_sim/number_3*100) '%']);
disp(['曲轴轴承响:' num2str(number_44_sim)...
' 误诊:' num2str(number_4 - number_44_sim)...
' 确诊率p4 = ' num2str(number_44_sim/number_4*100) '%']);
disp(['建模时间为:' num2str(e) 's'] );
评论0