遗传算法(GA)原理及 MATLAB 实现
1. 遗传算法简介
遗传算法(Genetic Algorithm, GA)是一种基于自然选择和遗传机制的优化算法,由 John Holland 在 1975 年提出。GA 模拟了生物进化过程中的选择、交叉和变异操作,通过迭代优化种群中的个体来寻找最优解。遗传算法广泛应用于函数优化、组合优化、机器学习等领域。
2. 遗传算法原理
2.1 基本概念
- 个体(Individual):解空间中的一个潜在解,通常用染色体表示。
- 种群(Population):由多个个体组成的集合。
- 适应度(Fitness):评价个体优劣的函数值。
- 选择(Selection):根据适应度选择优秀个体进入下一代。
- 交叉(Crossover):通过组合两个父代个体的基因生成新个体。
- 变异(Mutation):随机改变个体的基因以增加种群多样性。
2.2 算法流程
- 初始化:随机生成初始种群。
- 适应度评估:计算每个个体的适应度值。
- 选择:根据适应度选择优秀个体。
- 交叉:对选中的个体进行交叉操作,生成新个体。
- 变异:对新个体进行变异操作。
- 更新种群:用新个体替换旧种群。
- 迭代:重复步骤 2-6,直到满足终止条件(如达到最大迭代次数或找到满意解)。
3. MATLAB 实现
以下是一个简单的遗传算法 MATLAB 实现,用于求解函数 ( f(x) = x^2 ) 的最小值。
3.1 MATLAB 代码
% 遗传算法求解函数最小值
% 目标函数:f(x) = x^2
% 参数设置
pop_size = 20; % 种群大小
chromosome_length = 10; % 染色体长度(二进制编码)
max_iter = 100; % 最大迭代次数
crossover_rate = 0.8; % 交叉概率
mutation_rate = 0.01; % 变异概率
% 初始化种群
population = randi([0, 1], pop_size, chromosome_length);
% 迭代过程
for iter = 1:max_iter
% 解码染色体并计算适应度
fitness = zeros(pop_size, 1);
for i = 1:pop_size
x = binary2decimal(population(i, :)); % 二进制转十进制
fitness(i) = x^2; % 计算适应度值
end
% 选择操作(轮盘赌选择)
selected_population = selection(population, fitness);
% 交叉操作
offspring_population = crossover(selected_population, crossover_rate);
% 变异操作
mutated_population = mutation(offspring_population, mutation_rate);
% 更新种群
population = mutated_population;
% 记录当前最优解
[best_fitness, best_index] = min(fitness);
best_x = binary2decimal(population(best_index, :));
fprintf('Iteration %d: Best x = %.4f, Best fitness = %.4f\n', iter, best_x, best_fitness);
end
% 输出最终结果
fprintf('Final Result: Best x = %.4f, Best fitness = %.4f\n', best_x, best_fitness);
% 辅助函数:二进制转十进制
function x = binary2decimal(binary)
x = sum(binary .* 2.^(length(binary)-1:-1:0));
end
% 辅助函数:选择操作(轮盘赌选择)
function selected_population = selection(population, fitness)
pop_size = size(population, 1);
fitness = 1 ./ (fitness + 1e-6); % 适应度越小,选择概率越大
prob = fitness / sum(fitness); % 计算选择概率
cum_prob = cumsum(prob); % 累积概率
selected_population = zeros(size(population));
for i = 1:pop_size
r = rand();
selected_index = find(cum_prob >= r, 1);
selected_population(i, :) = population(selected_index, :);
end
end
% 辅助函数:交叉操作
function offspring_population = crossover(population, crossover_rate)
pop_size = size(population, 1);
offspring_population = population;
for i = 1:2:pop_size
if rand() < crossover_rate
crossover_point = randi([1, size(population, 2) - 1]);
offspring_population(i, :) = [population(i, 1:crossover_point), population(i+1, crossover_point+1:end)];
offspring_population(i+1, :) = [population(i+1, 1:crossover_point), population(i, crossover_point+1:end)];
end
end
end
% 辅助函数:变异操作
function mutated_population = mutation(population, mutation_rate)
mutated_population = population;
for i = 1:size(population, 1)
for j = 1:size(population, 2)
if rand() < mutation_rate
mutated_population(i, j) = 1 - population(i, j); % 0变1,1变0
end
end
end
end
3.2 代码说明
-
参数设置:
pop_size
:种群大小。chromosome_length
:染色体长度(二进制编码)。max_iter
:最大迭代次数。crossover_rate
:交叉概率。mutation_rate
:变异概率。
-
初始化种群:
- 随机生成二进制编码的初始种群。
-
适应度评估:
- 将二进制染色体解码为十进制数,并计算适应度值。
-
选择操作:
- 使用轮盘赌选择方法选择优秀个体。
-
交叉操作:
- 对选中的个体进行单点交叉操作。
-
变异操作:
- 对个体进行随机变异操作。
-
更新种群:
- 用新生成的个体替换旧种群。
-
输出结果:
- 每次迭代输出当前最优解。
- 最终输出全局最优解及其适应度值。
4. 结果分析
运行上述 MATLAB 代码,可以看到遗传算法在每次迭代中逐渐逼近函数 ( f(x) = x^2 ) 的最小值(即 ( x = 0 ))。最终,算法会输出找到的全局最优解及其对应的适应度值。
5. 总结
遗传算法是一种强大的优化算法,适用于解决复杂的优化问题。通过调整参数(如种群大小、交叉概率、变异概率等),可以进一步提高算法的性能。在实际应用中,遗传算法可以与其他优化算法结合使用,以解决更复杂的优化问题。
希望本文对您理解遗传算法及其 MATLAB 实现有所帮助!如果您有任何问题或建议,欢迎在评论区留言讨论。