MATLAB 遗传算法优化 RBF 神经网络代码
% 遗传算法优化 RBF 神经网络
clear all;
clc;
% 输入数据 x = [0 0; 0 1; 1 0; 1 1]; y = [0; 1; 1; 0];
% 网络结构参数 n_input = 2; % 输入层神经元数 n_hidden = 10; % 隐层神经元数 n_output = 1; % 输出层神经元数
% 遗传算法参数 n_pop = 50; % 种群大小 n_gen = 100; % 迭代次数 p_crossover = 0.8; % 交叉概率 p_mutation = 0.1; % 变异概率
% 初始化种群 pop_size = (n_input + 1) * n_hidden + (n_hidden + 1) * n_output; pop = rand(n_pop, pop_size);
% 迭代优化 for i_gen = 1:n_gen % 计算适应度 fitness = zeros(n_pop, 1); for i_pop = 1:n_pop % 提取当前个体的权值和偏置 w1 = reshape(pop(i_pop, 1:(n_input + 1) * n_hidden), n_input + 1, n_hidden); w2 = reshape(pop(i_pop, (n_input + 1) * n_hidden + 1:end), n_hidden + 1, n_output); % 计算当前个体的预测值 y_pred = rbf_nn(x, w1, w2); % 计算当前个体的适应度 fitness(i_pop) = 1 / (1 + mse(y - y_pred)); end % 选择 [fitness_sorted, idx] = sort(fitness, 'descend'); pop_sorted = pop(idx, :); pop_best = pop_sorted(1:round(n_pop / 2), :); % 交叉 pop_crossover = zeros(size(pop_best)); for i = 1:size(pop_best, 1) if rand < p_crossover % 随机选择另一个个体 j = randi(size(pop_best, 1)); % 交叉 pop_crossover(i, :) = crossover(pop_best(i, :), pop_best(j, :)); else pop_crossover(i, :) = pop_best(i, :); end end % 变异 pop_mutation = zeros(size(pop_crossover)); for i = 1:size(pop_crossover, 1) if rand < p_mutation % 变异 pop_mutation(i, :) = mutation(pop_crossover(i, :)); else pop_mutation(i, :) = pop_crossover(i, :); end end % 更新种群 pop = pop_mutation; % 显示当前迭代次数和最优适应度 fprintf('Generation %d, Best Fitness: %f\n', i_gen, fitness_sorted(1)); end
% 提取最优个体的权值和偏置 w1 = reshape(pop_best(1, 1:(n_input + 1) * n_hidden), n_input + 1, n_hidden); w2 = reshape(pop_best(1, (n_input + 1) * n_hidden + 1:end), n_hidden + 1, n_output);
% 计算最优个体的预测值 y_pred = rbf_nn(x, w1, w2);
% 显示最优个体的预测值和实际值 fprintf('Predicted Values: %f %f %f %f\n', y_pred); fprintf('Actual Values: %f %f %f %f\n', y);
% RBF神经网络函数 function y_pred = rbf_nn(x, w1, w2) % 输入层到隐层 n_input = size(x, 2); n_hidden = size(w1, 2); a = [x ones(size(x, 1), 1)] * w1; h = exp(-(repmat(sum(a.^2, 2), 1, n_hidden) + repmat(sum(w1.^2, 1), size(x, 1), 1) - 2 * a * w1') / (2 * n_hidden)); % 隐层到输出层 n_output = size(w2, 2); y_pred = [h ones(size(h, 1), 1)] * w2; end
% 交叉函数 function [child1, child2] = crossover(parent1, parent2) n_genes = numel(parent1); % 随机选择交叉点 crossover_point = randi(n_genes - 1); % 交叉 child1 = [parent1(1:crossover_point) parent2(crossover_point+1:end)]; child2 = [parent2(1:crossover_point) parent1(crossover_point+1:end)]; end
% 变异函数 function child = mutation(parent) n_genes = numel(parent); % 随机选择变异点 mutation_point = randi(n_genes); % 变异 child = parent; child(mutation_point) = rand; end
原文地址: https://www.cveoy.top/t/topic/mmYD 著作权归作者所有。请勿转载和采集!