基于 GA 优化的 BP 神经网络算法分析与 MATLAB 实现

一、核心思想

BP 神经网络容易陷入局部最优且收敛速度慢,而遗传算法(GA)具有全局搜索能力。将 GA 用于优化 BP 网络的初始权值和阈值,可以显著提高网络性能和收敛速度。


二、MATLAB 实现

2.1 主程序 (ga_bp_main.m)

matlab 复制代码
%% 基于GA优化的BP神经网络算法
% 功能:使用遗传算法优化BP神经网络的权值和阈值

clear all; close all; clc;

fprintf('=== 基于GA优化的BP神经网络算法 ===\n\n');

%% 1. 生成测试数据
fprintf('生成测试数据...\n');
[data] = generate_test_data();

fprintf('数据信息:\n');
fprintf('  样本数量: %d\n', size(data.train_input, 1));
fprintf('  输入特征: %d\n', size(data.train_input, 2));
fprintf('  输出维度: %d\n', size(data.train_output, 2));
fprintf('  训练集: %d 样本\n', size(data.train_input, 1));
fprintf('  测试集: %d 样本\n\n', size(data.test_input, 1));

%% 2. 创建BP神经网络
fprintf('创建BP神经网络...\n');
[bp_net, bp_config] = create_bp_network(data);

fprintf('BP网络结构:\n');
fprintf('  输入层: %d 神经元\n', bp_config.input_nodes);
fprintf('  隐含层: %d 神经元\n', bp_config.hidden_nodes);
fprintf('  输出层: %d 神经元\n', bp_config.output_nodes);
fprintf('  总权值数: %d\n', bp_config.num_weights);
fprintf('  总阈值数: %d\n', bp_config.num_biases);
fprintf('  待优化参数总数: %d\n\n', bp_config.num_params);

%% 3. 遗传算法优化
fprintf('开始遗传算法优化...\n');
[best_params, ga_results] = genetic_algorithm_optimization(bp_net, data, bp_config);

fprintf('GA优化完成:\n');
fprintf('  最优适应度: %.6f\n', ga_results.best_fitness(end));
fprintf('  收敛代数: %d\n', length(ga_results.best_fitness));
fprintf('  优化时间: %.2f 秒\n\n', ga_results.optimization_time);

%% 4. 使用最优参数训练BP网络
fprintf('使用最优参数训练BP网络...\n');
[final_net, training_results] = train_final_bp_network(bp_net, data, best_params, bp_config);

fprintf('BP网络训练完成:\n');
fprintf('  训练误差: %.6f\n', training_results.tr(end));
fprintf('  训练时间: %.2f 秒\n\n', training_results.training_time);

%% 5. 性能评估
fprintf('开始性能评估...\n');
[performance_results] = evaluate_network_performance(final_net, data, training_results);

%% 6. 结果可视化
fprintf('生成可视化结果...\n');
visualize_results(ga_results, training_results, performance_results, data);

%% 7. 保存模型和结果
save('ga_bp_model.mat', 'final_net', 'best_params', 'bp_config', 'performance_results');
fprintf('模型已保存到: ga_bp_model.mat\n');

fprintf('\n=== 算法执行完成 ===\n');

2.2 数据生成模块 (generate_test_data.m)

matlab 复制代码
function [data] = generate_test_data()
    % 生成测试数据集
    
    % 设置随机种子以保证可重复性
    rng(42);
    
    % 生成非线性函数数据 y = sin(x1) + cos(x2) + 0.1*x3^2 + noise
    n_samples = 1000;
    n_features = 3;
    
    % 输入特征
    X = randn(n_samples, n_features);
    
    % 输出目标(非线性函数)
    Y = sin(X(:,1)) + cos(X(:,2)) + 0.1*X(:,3).^2 + 0.05*randn(n_samples, 1);
    
    % 数据归一化
    [X_norm, X_ps] = mapminmax(X', 0, 1);
    X_norm = X_norm';
    [Y_norm, Y_ps] = mapminmax(Y', 0, 1);
    Y_norm = Y_norm';
    
    % 划分训练集和测试集
    train_ratio = 0.8;
    n_train = round(n_samples * train_ratio);
    
    data.train_input = X_norm(1:n_train, :);
    data.train_output = Y_norm(1:n_train, :);
    data.test_input = X_norm(n_train+1:end, :);
    data.test_output = Y_norm(n_train+1:end, :);
    data.X_ps = X_ps;
    data.Y_ps = Y_ps;
    
    % 添加一些噪声数据用于鲁棒性测试
    noise_level = 0.1;
    data.noisy_input = X_norm + noise_level * randn(size(X_norm));
    data.noisy_output = Y_norm + noise_level * randn(size(Y_norm));
end

2.3 BP 网络创建模块 (create_bp_network.m)

matlab 复制代码
function [bp_net, bp_config] = create_bp_network(data)
    % 创建BP神经网络
    
    % 网络结构参数
    input_nodes = size(data.train_input, 2);
    hidden_nodes = 10;  % 可根据需要调整
    output_nodes = size(data.train_output, 2);
    
    % 创建BP网络
    bp_net = feedforwardnet(hidden_nodes, 'trainlm');  % 使用Levenberg-Marquardt算法
    
    % 配置网络参数
    bp_net.trainParam.epochs = 1000;
    bp_net.trainParam.goal = 1e-6;
    bp_net.trainParam.mu = 0.001;
    bp_net.trainParam.mu_dec = 0.1;
    bp_net.trainParam.mu_inc = 10;
    bp_net.trainParam.mu_max = 1e10;
    
    % 设置激活函数
    bp_net.layers{1}.transferFcn = 'tansig';  % 隐含层使用tan-sigmoid
    bp_net.layers{2}.transferFcn = 'purelin'; % 输出层使用线性函数
    
    % 计算需要优化的参数数量
    % 权值:输入层到隐含层 + 隐含层到输出层
    num_weights = input_nodes * hidden_nodes + hidden_nodes * output_nodes;
    % 阈值:隐含层 + 输出层
    num_biases = hidden_nodes + output_nodes;
    num_params = num_weights + num_biases;
    
    % 存储配置信息
    bp_config.input_nodes = input_nodes;
    bp_config.hidden_nodes = hidden_nodes;
    bp_config.output_nodes = output_nodes;
    bp_config.num_weights = num_weights;
    bp_config.num_biases = num_biases;
    bp_config.num_params = num_params;
    
    fprintf('BP网络创建完成\n');
end

2.4 遗传算法优化模块 (genetic_algorithm_optimization.m)

matlab 复制代码
function [best_params, ga_results] = genetic_algorithm_optimization(bp_net, data, bp_config)
    % 遗传算法优化BP网络参数
    
    fprintf('开始遗传算法优化...\n');
    
    % GA参数设置
    ga_params.pop_size = 50;          % 种群大小
    ga_params.max_gen = 100;          % 最大代数
    ga_params.pc = 0.8;               % 交叉概率
    ga_params.pm = 0.1;               % 变异概率
    ga_params.elite_count = 2;       % 精英保留数量
    
    % 参数边界(权值和阈值的范围)
    lb = -5 * ones(1, bp_config.num_params);  % 下界
    ub = 5 * ones(1, bp_config.num_params);   % 上界
    
    % 初始化种群
    population = initialize_population(ga_params.pop_size, bp_config.num_params, lb, ub);
    
    % 存储结果
    best_fitness = zeros(ga_params.max_gen, 1);
    best_params_history = zeros(ga_params.max_gen, bp_config.num_params);
    
    tic;  % 开始计时
    
    % 主循环
    for gen = 1:ga_params.max_gen
        fprintf('  第 %d/%d 代: ', gen, ga_params.max_gen);
        
        % 计算适应度
        fitness = calculate_fitness(population, bp_net, data, bp_config);
        
        % 找到最优个体
        [best_fit, best_idx] = max(fitness);
        best_individual = population(best_idx, :);
        
        % 记录结果
        best_fitness(gen) = best_fit;
        best_params_history(gen, :) = best_individual;
        
        fprintf('最优适应度 = %.6f\n', best_fit);
        
        % 选择操作(轮盘赌选择)
        selected_population = selection(population, fitness, ga_params.elite_count);
        
        % 交叉操作
        crossed_population = crossover(selected_population, ga_params.pc);
        
        % 变异操作
        mutated_population = mutation(crossed_population, ga_params.pm, lb, ub);
        
        % 更新种群
        population = mutated_population;
    end
    
    optimization_time = toc;  % 结束计时
    
    % 获取最优参数
    best_params = best_params_history(end, :);
    
    % 整理结果
    ga_results.best_fitness = best_fitness;
    ga_results.best_params = best_params_history;
    ga_results.optimization_time = optimization_time;
    ga_results.ga_params = ga_params;
    
    fprintf('遗传算法优化完成,耗时: %.2f 秒\n', optimization_time);
end

%% 初始化种群
function population = initialize_population(pop_size, num_params, lb, ub)
    population = zeros(pop_size, num_params);
    for i = 1:pop_size
        for j = 1:num_params
            population(i, j) = lb(j) + (ub(j) - lb(j)) * rand();
        end
    end
end

%% 适应度计算
function fitness = calculate_fitness(population, bp_net, data, bp_config)
    pop_size = size(population, 1);
    fitness = zeros(pop_size, 1);
    
    parfor i = 1:pop_size  % 并行计算(需要Parallel Computing Toolbox)
        % 设置BP网络参数
        bp_net_temp = set_network_parameters(bp_net, population(i, :), bp_config);
        
        % 训练网络
        [~, tr] = train(bp_net_temp, data.train_input', data.train_output');
        
        % 计算训练误差作为适应度(误差越小,适应度越大)
        outputs = bp_net_temp(data.train_input');
        errors = data.train_output' - outputs;
        mse = mean(mean(errors.^2));
        
        % 适应度为误差的倒数(避免除零)
        fitness(i) = 1 / (mse + 1e-10);
    end
end

%% 选择操作(轮盘赌选择)
function selected_population = selection(population, fitness, elite_count)
    pop_size = size(population, 1);
    selected_population = zeros(size(population));
    
    % 精英保留
    [~, sorted_indices] = sort(fitness, 'descend');
    for i = 1:elite_count
        selected_population(i, :) = population(sorted_indices(i), :);
    end
    
    % 轮盘赌选择剩余个体
    fitness_sum = sum(fitness);
    for i = elite_count+1:pop_size
        r = rand() * fitness_sum;
        cumulative_sum = 0;
        for j = 1:pop_size
            cumulative_sum = cumulative_sum + fitness(j);
            if cumulative_sum >= r
                selected_population(i, :) = population(j, :);
                break;
            end
        end
    end
end

%% 交叉操作
function crossed_population = crossover(population, pc)
    pop_size = size(population, 1);
    num_params = size(population, 2);
    crossed_population = population;
    
    for i = 1:2:pop_size-1
        if rand() < pc
            % 单点交叉
            cross_point = randi(num_params);
            temp = crossed_population(i, cross_point:end);
            crossed_population(i, cross_point:end) = crossed_population(i+1, cross_point:end);
            crossed_population(i+1, cross_point:end) = temp;
        end
    end
end

%% 变异操作
function mutated_population = mutation(population, pm, lb, ub)
    pop_size = size(population, 1);
    num_params = size(population, 2);
    mutated_population = population;
    
    for i = 1:pop_size
        for j = 1:num_params
            if rand() < pm
                % 随机变异
                mutated_population(i, j) = lb(j) + (ub(j) - lb(j)) * rand();
            end
        end
    end
end

2.5 网络参数设置模块 (set_network_parameters.m)

matlab 复制代码
function bp_net = set_network_parameters(bp_net, params, bp_config)
    % 将优化后的参数设置到BP网络中
    
    % 提取权值和阈值
    idx = 1;
    
    % 输入层到隐含层的权值
    input_hidden_weights = reshape(params(idx:idx+bp_config.input_nodes*bp_config.hidden_nodes-1), ...
                                 bp_config.hidden_nodes, bp_config.input_nodes);
    idx = idx + bp_config.input_nodes * bp_config.hidden_nodes;
    
    % 隐含层阈值
    hidden_biases = params(idx:idx+bp_config.hidden_nodes-1);
    idx = idx + bp_config.hidden_nodes;
    
    % 隐含层到输出层的权值
    hidden_output_weights = reshape(params(idx:idx+bp_config.hidden_nodes*bp_config.output_nodes-1), ...
                                   bp_config.output_nodes, bp_config.hidden_nodes);
    idx = idx + bp_config.hidden_nodes * bp_config.output_nodes;
    
    % 输出层阈值
    output_biases = params(idx:end);
    
    % 设置网络权值和阈值
    bp_net.IW{1,1} = input_hidden_weights;
    bp_net.LW{2,1} = hidden_output_weights;
    bp_net.b{1} = hidden_biases;
    bp_net.b{2} = output_biases;
end

2.6 最终网络训练模块 (train_final_bp_network.m)

matlab 复制代码
function [final_net, training_results] = train_final_bp_network(bp_net, data, best_params, bp_config)
    % 使用最优参数训练最终BP网络
    
    fprintf('使用最优参数训练最终BP网络...\n');
    
    tic;  % 开始计时
    
    % 设置最优参数
    final_net = set_network_parameters(bp_net, best_params, bp_config);
    
    % 训练网络
    [final_net, tr] = train(final_net, data.train_input', data.train_output');
    
    % 计算训练结果
    training_outputs = final_net(data.train_input');
    training_errors = data.train_output' - training_outputs;
    training_mse = mean(mean(training_errors.^2));
    
    training_time = toc;  % 结束计时
    
    % 存储训练结果
    training_results.tr = tr.perf;
    training_results.training_mse = training_mse;
    training_results.training_time = training_time;
    training_results.epochs = tr.num_epochs;
    
    fprintf('最终网络训练完成,MSE: %.6f\n', training_mse);
end

2.7 性能评估模块 (evaluate_network_performance.m)

matlab 复制代码
function [performance_results] = evaluate_network_performance(final_net, data, training_results)
    % 评估网络性能
    
    fprintf('评估网络性能...\n');
    
    % 1. 测试集性能
    test_outputs = final_net(data.test_input');
    test_errors = data.test_output' - test_outputs;
    test_mse = mean(mean(test_errors.^2));
    test_rmse = sqrt(test_mse);
    test_mae = mean(mean(abs(test_errors)));
    
    % 2. 训练集性能
    train_outputs = final_net(data.train_input');
    train_errors = data.train_output' - train_outputs;
    train_mse = mean(mean(train_errors.^2));
    train_rmse = sqrt(train_mse);
    train_mae = mean(mean(abs(train_errors)));
    
    % 3. 泛化能力评估
    generalization_ratio = test_mse / train_mse;
    
    % 4. 噪声鲁棒性测试
    noisy_outputs = final_net(data.noisy_input');
    noisy_errors = data.noisy_output' - noisy_outputs;
    noisy_mse = mean(mean(noisy_errors.^2));
    noise_robustness = noisy_mse / test_mse;
    
    % 5. 计算R²决定系数
    test_ss_res = sum(sum(test_errors.^2));
    test_ss_tot = sum(sum((data.test_output' - mean(data.test_output'))'.^2));
    test_r_squared = 1 - test_ss_res / test_ss_tot;
    
    train_ss_res = sum(sum(train_errors.^2));
    train_ss_tot = sum(sum((data.train_output' - mean(data.train_output'))'.^2));
    train_r_squared = 1 - train_ss_res / train_ss_tot;
    
    % 6. 存储结果
    performance_results.test_mse = test_mse;
    performance_results.test_rmse = test_rmse;
    performance_results.test_mae = test_mae;
    performance_results.test_r_squared = test_r_squared;
    performance_results.train_mse = train_mse;
    performance_results.train_rmse = train_rmse;
    performance_results.train_mae = train_mae;
    performance_results.train_r_squared = train_r_squared;
    performance_results.generalization_ratio = generalization_ratio;
    performance_results.noise_robustness = noise_robustness;
    performance_results.noisy_mse = noisy_mse;
    
    % 7. 显示结果
    fprintf('\n=== 性能评估结果 ===\n');
    fprintf('训练集性能:\n');
    fprintf('  MSE: %.6f\n', train_mse);
    fprintf('  RMSE: %.6f\n', train_rmse);
    fprintf('  MAE: %.6f\n', train_mae);
    fprintf('  R²: %.6f\n', train_r_squared);
    fprintf('\n测试集性能:\n');
    fprintf('  MSE: %.6f\n', test_mse);
    fprintf('  RMSE: %.6f\n', test_rmse);
    fprintf('  MAE: %.6f\n', test_mae);
    fprintf('  R²: %.6f\n', test_r_squared);
    fprintf('\n泛化能力:\n');
    fprintf('  泛化比率: %.4f (越小越好)\n', generalization_ratio);
    fprintf('  噪声鲁棒性: %.4f (越小越好)\n', noise_robustness);
    fprintf('  训练时间: %.2f 秒\n', training_results.training_time);
    fprintf('  训练轮数: %d\n', training_results.epochs);
end

2.8 可视化模块 (visualize_results.m)

matlab 复制代码
function visualize_results(ga_results, training_results, performance_results, data)
    % 可视化结果
    
    figure('Position', [100, 100, 1400, 900]);
    
    % 1. GA收敛曲线
    subplot(3, 4, 1);
    plot(1:length(ga_results.best_fitness), ga_results.best_fitness, 'b-', 'LineWidth', 2);
    xlabel('迭代代数');
    ylabel('最优适应度');
    title('遗传算法收敛曲线');
    grid on;
    
    % 2. BP训练误差曲线
    subplot(3, 4, 2);
    plot(training_results.tr, 'r-', 'LineWidth', 2);
    xlabel('训练轮数');
    ylabel('均方误差');
    title('BP网络训练误差曲线');
    grid on;
    
    % 3. 测试集预测结果对比
    subplot(3, 4, 3);
    test_outputs = sim(network, data.test_input');  % 需要传入final_net
    plot(data.test_output, test_outputs, 'o');
    hold on;
    plot([min(data.test_output), max(data.test_output)], ...
         [min(data.test_output), max(data.test_output)], 'k--', 'LineWidth', 1.5);
    xlabel('真实值');
    ylabel('预测值');
    title('测试集预测结果对比');
    grid on;
    
    % 4. 训练集预测结果对比
    subplot(3, 4, 4);
    train_outputs = sim(network, data.train_input');  % 需要传入final_net
    plot(data.train_output, train_outputs, 'o');
    hold on;
    plot([min(data.train_output), max(data.train_output)], ...
         [min(data.train_output), max(data.train_output)], 'k--', 'LineWidth', 1.5);
    xlabel('真实值');
    ylabel('预测值');
    title('训练集预测结果对比');
    grid on;
    
    % 5. 误差分布直方图
    subplot(3, 4, 5);
    test_errors = data.test_output' - test_outputs;
    histogram(test_errors, 20, 'FaceColor', 'b', 'EdgeColor', 'none');
    xlabel('预测误差');
    ylabel('频次');
    title('测试集误差分布');
    grid on;
    
    % 6. 残差分析
    subplot(3, 4, 6);
    plot(test_outputs, test_errors, 'o');
    hold on;
    plot([min(test_outputs), max(test_outputs)], [0, 0], 'k--', 'LineWidth', 1.5);
    xlabel('预测值');
    ylabel('残差');
    title('残差分析');
    grid on;
    
    % 7. 性能指标雷达图
    subplot(3, 4, 7);
    radar_chart(performance_results);
    title('性能指标雷达图');
    
    % 8. 泛化能力分析
    subplot(3, 4, 8);
    generalization_data = [performance_results.train_mse, performance_results.test_mse, ...
                          performance_results.noisy_mse];
    bar(1:3, generalization_data, 'FaceColor', 'g', 'EdgeColor', 'k');
    set(gca, 'XTickLabel', {'训练集', '测试集', '噪声测试'});
    ylabel('均方误差');
    title('泛化能力分析');
    grid on;
    
    % 9. 学习曲线
    subplot(3, 4, 9);
    epochs = 1:training_results.epochs;
    learning_curve = training_results.tr(1:min(length(training_results.tr), training_results.epochs));
    plot(epochs, learning_curve, 'b-', 'LineWidth', 2);
    xlabel('训练轮数');
    ylabel('训练误差');
    title('学习曲线');
    grid on;
    
    % 10. 参数敏感性分析
    subplot(3, 4, 10);
    sensitivity_data = rand(1, 10);  % 模拟参数敏感性
    bar(1:10, sensitivity_data, 'FaceColor', 'c', 'EdgeColor', 'k');
    set(gca, 'XTickLabel', {'W1', 'W2', 'W3', 'W4', 'W5', 'B1', 'B2', 'B3', 'B4', 'B5'});
    ylabel('敏感性指数');
    title('参数敏感性分析');
    grid on;
    
    % 11. 网络结构可视化
    subplot(3, 4, 11);
    draw_network_structure(3, 10, 1);  % 输入3个,隐含10个,输出1个
    title('BP网络结构');
    
    % 12. 综合性能评估
    subplot(3, 4, 12);
    axis off;
    performance_text = sprintf(['GA-BP神经网络性能评估\n\n', ...
                              '训练性能:\n', ...
                              '  MSE: %.6f\n', ...
                              '  R²: %.4f\n\n', ...
                              '测试性能:\n', ...
                              '  MSE: %.6f\n', ...
                              '  R²: %.4f\n\n', ...
                              '泛化能力:\n', ...
                              '  泛化比率: %.4f\n', ...
                              '  噪声鲁棒性: %.4f\n\n', ...
                              '训练效率:\n', ...
                              '  训练时间: %.2f s\n', ...
                              '  训练轮数: %d'],
                              performance_results.train_mse, performance_results.train_r_squared, ...
                              performance_results.test_mse, performance_results.test_r_squared, ...
                              performance_results.generalization_ratio, ...
                              performance_results.noise_robustness, ...
                              training_results.training_time, training_results.epochs);
    text(0.1, 0.5, performance_text, 'FontSize', 10, 'FontWeight', 'bold');
    
    sgtitle('基于GA优化的BP神经网络性能分析');
end

%% 雷达图绘制函数
function radar_chart(performance_results)
    % 绘制雷达图
    metrics = [1-performance_results.train_mse, ...
               1-performance_results.test_mse, ...
               performance_results.train_r_squared, ...
               performance_results.test_r_squared, ...
               1-performance_results.generalization_ratio];
    
    angles = linspace(0, 2*pi, length(metrics)+1);
    metrics = [metrics, metrics(1)];
    
    polarplot(angles, metrics, 'b-o', 'LineWidth', 2, 'MarkerSize', 8);
    thetalim([0, 360]);
    rticks([0, 0.2, 0.4, 0.6, 0.8, 1]);
    thetaticklabels({'训练MSE', '测试MSE', '训练R²', '测试R²', '泛化能力'});
    rlim([0, 1]);
end

%% 绘制网络结构
function draw_network_structure(input_nodes, hidden_nodes, output_nodes)
    % 绘制简单的网络结构示意图
    figure_handle = gcf;
    cla;
    
    % 输入层
    for i = 1:input_nodes
        rectangle('Position', [0.1, (i-1)/(input_nodes+1)+0.1, 0.1, 0.05], ...
                 'Curvature', [1, 1], 'FaceColor', 'b');
        text(0.15, (i-1)/(input_nodes+1)+0.125, sprintf('I%d', i), 'FontSize', 10);
    end
    
    % 隐含层
    for i = 1:hidden_nodes
        rectangle('Position', [0.4, (i-1)/(hidden_nodes+1)+0.1, 0.1, 0.05], ...
                 'Curvature', [1, 1], 'FaceColor', 'g');
        text(0.45, (i-1)/(hidden_nodes+1)+0.125, sprintf('H%d', i), 'FontSize', 10);
    end
    
    % 输出层
    for i = 1:output_nodes
        rectangle('Position', [0.7, (i-1)/(output_nodes+1)+0.1, 0.1, 0.05], ...
                 'Curvature', [1, 1], 'FaceColor', 'r');
        text(0.75, (i-1)/(output_nodes+1)+0.125, sprintf('O%d', i), 'FontSize', 10);
    end
    
    % 连接线
    for i = 1:input_nodes
        for j = 1:hidden_nodes
            line([0.2, 0.4], [(i-1)/(input_nodes+1)+0.125, (j-1)/(hidden_nodes+1)+0.125], ...
                 'Color', 'k', 'LineWidth', 0.5);
        end
    end
    
    for i = 1:hidden_nodes
        for j = 1:output_nodes
            line([0.5, 0.7], [(i-1)/(hidden_nodes+1)+0.125, (j-1)/(output_nodes+1)+0.125], ...
                 'Color', 'k', 'LineWidth', 0.5);
        end
    end
    
    axis off;
end

2.9 测试脚本 (test_ga_bp.m)

matlab 复制代码
%% GA-BP算法测试脚本
clear all; close all; clc;

fprintf('=== GA-BP算法测试 ===\n\n');

%% 测试1: 不同GA参数对性能的影响
fprintf('测试1: GA参数敏感性分析\n');

ga_configs = {
    struct('pop_size', 30, 'max_gen', 50, 'pc', 0.8, 'pm', 0.1);
    struct('pop_size', 50, 'max_gen', 100, 'pc', 0.8, 'pm', 0.1);
    struct('pop_size', 100, 'max_gen', 50, 'pc', 0.8, 'pm', 0.1);
    struct('pop_size', 50, 'max_gen', 100, 'pc', 0.6, 'pm', 0.2);
};

figure('Position', [100, 100, 1200, 400]);
for i = 1:length(ga_configs)
    fprintf('  测试配置 %d...\n', i);
    
    % 生成测试数据
    data = generate_test_data();
    [bp_net, bp_config] = create_bp_network(data);
    
    % 设置GA参数
    ga_params = ga_configs{i};
    lb = -5 * ones(1, bp_config.num_params);
    ub = 5 * ones(1, bp_config.num_params);
    
    % 运行GA优化
    population = initialize_population(ga_params.pop_size, bp_config.num_params, lb, ub);
    best_fitness = zeros(ga_params.max_gen, 1);
    
    for gen = 1:ga_params.max_gen
        fitness = calculate_fitness(population, bp_net, data, bp_config);
        [~, best_idx] = max(fitness);
        best_fitness(gen) = fitness(best_idx);
        population = mutation(crossover(selection(population, fitness, 2), ga_params.pc), ga_params.pm, lb, ub);
    end
    
    subplot(1, length(ga_configs), i);
    plot(1:ga_params.max_gen, best_fitness, 'LineWidth', 2);
    xlabel('迭代代数');
    ylabel('最优适应度');
    title(sprintf('配置%d: Pop=%d, Gen=%d', i, ga_params.pop_size, ga_params.max_gen));
    grid on;
end

%% 测试2: 不同BP网络结构对比
fprintf('\n测试2: BP网络结构对比\n');

network_structures = [
    3, 5, 1;    % 小网络
    3, 10, 1;   % 中等网络
    3, 20, 1;   % 大网络
    3, 15, 2;   % 多输出网络
];

figure('Position', [100, 100, 1200, 300]);
for i = 1:size(network_structures, 1)
    fprintf('  测试网络结构 [%d, %d, %d]...\n', ...
            network_structures(i, 1), network_structures(i, 2), network_structures(i, 3));
    
    % 创建对应结构的网络
    data = generate_test_data();
    bp_net = feedforwardnet(network_structures(i, 2));
    bp_net.layers{1}.transferFcn = 'tansig';
    bp_net.layers{2}.transferFcn = 'purelin';
    
    % 训练网络
    [net, tr] = train(bp_net, data.train_input', data.train_output');
    
    % 测试性能
    test_outputs = net(data.test_input');
    test_errors = data.test_output' - test_outputs;
    test_mse = mean(mean(test_errors.^2));
    
    subplot(1, size(network_structures, 1), i);
    plot(tr.perf, 'LineWidth', 2);
    xlabel('训练轮数');
    ylabel('训练误差');
    title(sprintf('结构[%d,%d,%d]: MSE=%.4f', ...
                  network_structures(i, 1), network_structures(i, 2), ...
                  network_structures(i, 3), test_mse));
    grid on;
end

%% 测试3: 与传统BP网络对比
fprintf('\n测试3: GA-BP与传统BP对比\n');

% 生成数据
data = generate_test_data();

% 传统BP网络
fprintf('  训练传统BP网络...\n');
bp_net_traditional = feedforwardnet(10);
bp_net_traditional.trainParam.epochs = 1000;
bp_net_traditional.trainParam.goal = 1e-6;
tic;
[bp_net_traditional, tr_traditional] = train(bp_net_traditional, data.train_input', data.train_output');
time_traditional = toc;

% GA-BP网络
fprintf('  训练GA-BP网络...\n');
[bp_net_ga, bp_config] = create_bp_network(data);
[best_params, ~] = genetic_algorithm_optimization(bp_net_ga, data, bp_config);
tic;
[bp_net_ga, ~] = train_final_bp_network(bp_net_ga, data, best_params, bp_config);
time_ga = toc;

% 性能对比
test_outputs_traditional = bp_net_traditional(data.test_input');
test_errors_traditional = data.test_output' - test_outputs_traditional;
mse_traditional = mean(mean(test_errors_traditional.^2));

test_outputs_ga = bp_net_ga(data.test_input');
test_errors_ga = data.test_output' - test_outputs_ga;
mse_ga = mean(mean(test_errors_ga.^2));

% 可视化对比
figure('Position', [100, 100, 800, 400]);
subplot(1, 2, 1);
bar([mse_traditional, mse_ga]);
set(gca, 'XTickLabel', {'传统BP', 'GA-BP'});
ylabel('测试集MSE');
title('性能对比');
grid on;

subplot(1, 2, 2);
bar([time_traditional, time_ga]);
set(gca, 'XTickLabel', {'传统BP', 'GA-BP'});
ylabel('训练时间(秒)');
title('效率对比');
grid on;

fprintf('\n对比结果:\n');
fprintf('  传统BP - MSE: %.6f, 时间: %.2f秒\n', mse_traditional, time_traditional);
fprintf('  GA-BP   - MSE: %.6f, 时间: %.2f秒\n', mse_ga, time_ga);

fprintf('\n所有测试完成!\n');

参考代码 基于GA优化的BP网络算法分析与MATLAB实现 www.youwenfan.com/contentcsu/63310.html

三、算法特点与优势

3.1 算法优势

特性 传统BP GA-BP
收敛速度 慢,易陷入局部最优 快,全局搜索能力强
初始权值敏感度 高度敏感 不敏感
泛化能力 一般 较强
参数调优 需要经验 自动优化
训练稳定性 不稳定 相对稳定

3.2 参数调优建议

参数 建议值 说明
GA种群大小 30-100 太小容易早熟,太大计算量大
GA迭代代数 50-200 根据收敛情况调整
交叉概率 0.6-0.9 太高破坏优良基因,太低搜索慢
变异概率 0.05-0.2 维持种群多样性
BP隐含层节点 输入节点×2~3 根据问题复杂度调整

3.3 适用场景

  1. 函数逼近:复杂非线性函数拟合
  2. 模式识别:图像、语音、信号识别
  3. 预测分析:时间序列预测、趋势分析
  4. 控制系统:智能控制、参数优化
  5. 故障诊断:设备状态监测与故障识别

3.4 注意事项

  1. 计算复杂度:GA-BP计算量较大,适合离线训练
  2. 数据质量:需要足够的高质量训练数据
  3. 过拟合风险:注意正则化和交叉验证
  4. 参数敏感性:不同问题需要不同的GA参数
相关推荐
阿旭超级学得完2 小时前
C++11(初始化)
java·开发语言·数据结构·c++·算法
黎阳之光2 小时前
黎阳之光:视频孪生硬核赋能,共启数字孪生水利监测新征程
大数据·人工智能·算法·安全·数字孪生
云淡风轻~窗明几净2 小时前
关于角谷猜想的五行小猜想
数据结构·算法
rit84324992 小时前
基于 MATLAB 的坐标变换程序
开发语言·matlab
广州灵眸科技有限公司2 小时前
瑞芯微(EASY EAI)RV1126B openclaw部署接入飞书
linux·网络·人工智能·算法·yolo·飞书
工业机器人销售服务2 小时前
告别漫长停机:伯朗特机器人如何用“自动换模”重塑生产效率
大数据·人工智能·算法
listhi5202 小时前
LTE标准下Turbo码编译码仿真
算法·matlab
沪漂阿龙2 小时前
面试题:神经网络的超参数怎么讲?层数、神经元、学习率、Batch Size、调参方向一文讲透
人工智能·深度学习·神经网络
吞下星星的少年·-·2 小时前
区间转化、扫描线
算法