用matlab写一个遗传算法程序
时间: 2023-12-27 08:20:05 浏览: 65
以下是一个简单的遗传算法程序示例:
% 遗传算法示例程序
% 求解函数 f(x) = x*sin(10*pi*x)+2.0
% 目标:求解 f(x) 的最大值
clc; clear; close all;
% 定义遗传算法的参数
pop_size = 50; % 种群大小
chrom_len = 20; % 染色体长度
pc = 0.8; % 交叉概率
pm = 0.01; % 变异概率
max_gen = 100; % 最大迭代次数
% 初始化种群
pop = round(rand(pop_size, chrom_len)); % 随机生成种群
% 迭代优化
for i = 1:max_gen
% 计算适应度值
x = decode(pop, chrom_len); % 解码
fitness = x.*sin(10*pi*x)+2.0; % 计算适应度值
% 选择操作
fitness_norm = fitness/sum(fitness); % 归一化
cum_prob = cumsum(fitness_norm); % 计算累积概率
new_pop = zeros(pop_size, chrom_len); % 新种群
for j = 1:pop_size
r = rand(); % 随机数
idx = find(r<=cum_prob, 1, 'first'); % 轮盘赌选择
new_pop(j,:) = pop(idx,:);
end
% 交叉操作
for j = 1:2:pop_size
if rand()<=pc
k = randi(chrom_len-1);
new_pop(j:j+1,k+1:end) = pop(j:j+1,k+1:end); % 交叉
end
end
% 变异操作
for j = 1:pop_size
for k = 1:chrom_len
if rand()<=pm
new_pop(j,k) = 1-new_pop(j,k); % 反转
end
end
end
% 更新种群
pop = new_pop;
% 记录最优个体
[max_fitness, idx] = max(fitness);
best_ind = pop(idx,:);
best_x = x(idx);
% 显示结果
fprintf('第 %d 次迭代,最优个体适应度值为 %f,对应的 x 值为 %f\n', i, max_fitness, best_x);
end
% 绘制函数图像
x = linspace(0, 1, 1000);
y = x.*sin(10*pi*x)+2.0;
plot(x, y, 'r-', 'LineWidth', 1.5);
xlabel('x'); ylabel('f(x)');
title('函数图像');
% 解码染色体
function x = decode(pop, chrom_len)
x_min = 0; x_max = 1; % 变量范围
base = 2.^(chrom_len-1:-1:0); % 基因位权值
pop_dec = sum(pop.*repmat(base, size(pop,1), 1), 2); % 二进制转十进制
x = x_min + (x_max-x_min)*pop_dec/(2^chrom_len-1); % 解码
end
阅读全文