遗传算法matlab程序
时间: 2023-09-11 14:06:25 浏览: 40
这是一个遗传算法的 MATLAB 程序示例,用于解决优化问题:
```matlab
% 遗传算法的 MATLAB 程序示例
% 优化问题:最小化函数 f(x) = x^2,其中 -10 <= x <= 10
clear all
% 初始化参数
pop_size = 30; % 种群大小
chrom_length = 16; % 染色体长度
pc = 0.8; % 交叉概率
pm = 0.01; % 变异概率
max_gen = 200; % 最大迭代次数
min_obj = 1e-6; % 最小目标函数值
min_x = -10; % 变量 x 的最小值
max_x = 10; % 变量 x 的最大值
% 初始化种群
pop = round(rand(pop_size, chrom_length));
best_obj = Inf; % 最优个体的目标函数值
best_x = 0; % 最优个体的变量 x 值
best_gen = 0; % 最优个体出现的迭代次数
for gen = 1:max_gen
% 计算个体的目标函数值
obj = sum(pop .* pop, 2);
% 找到最优个体
[min_obj_gen, min_obj_index] = min(obj);
if min_obj_gen < best_obj
best_obj = min_obj_gen;
best_x = (bin2dec(num2str(pop(min_obj_index,:))) / 2^chrom_length * (max_x - min_x)) + min_x;
best_gen = gen;
fprintf('第 %d 次迭代,最优解:f(%f) = %f\n', gen, best_x, best_obj);
end
% 选择
fitness = max(obj) - obj;
fitness = fitness / sum(fitness);
cum_fitness = cumsum(fitness);
new_pop = zeros(size(pop));
for i = 1:2:pop_size
% 轮盘赌选择
parent1 = find(cum_fitness >= rand, 1, 'first');
parent2 = find(cum_fitness >= rand, 1, 'first');
% 交叉
if rand < pc
point = randi([1 chrom_length-1]);
new_pop(i,:) = [pop(parent1, 1:point), pop(parent2, point+1:end)];
new_pop(i+1,:) = [pop(parent2, 1:point), pop(parent1, point+1:end)];
else
new_pop(i,:) = pop(parent1,:);
new_pop(i+1,:) = pop(parent2,:);
end
% 变异
if rand < pm
new_pop(i,:) = ~new_pop(i,:);
end
if rand < pm
new_pop(i+1,:) = ~new_pop(i+1,:);
end
end
pop = new_pop;
% 判断是否达到最小目标函数值
if best_obj < min_obj
break
end
end
fprintf('最优解:f(%f) = %f,出现在第 %d 次迭代\n', best_x, best_obj, best_gen);
```
这个程序实现了一个简单的遗传算法,用于最小化函数 f(x) = x^2,其中 -10 <= x <= 10。在每次迭代中,程序选择最优个体、进行选择、交叉和变异操作,并更新种群。如果达到最小目标函数值,则停止迭代。程序输出最优解及其出现的迭代次数。