用matlab编写遗传算法
时间: 2023-07-20 17:32:55 浏览: 77
好的,以下是一个使用 MATLAB 编写的简单遗传算法示例:
```matlab
% 遗传算法示例
% 目标函数:f(x) = x^2 + 4*sin(5*x)
% 求解区间:[-10, 10]
% 初始化种群
popSize = 50; % 种群大小
chromLen = 20; % 染色体长度
pop = round(rand(popSize, chromLen)); % 随机生成种群
% 遗传算法参数
maxIter = 100; % 最大迭代次数
pc = 0.8; % 交叉概率
pm = 0.01; % 变异概率
% 迭代遗传算法
for iter = 1:maxIter
% 计算适应度
x = -10 + 20 * bi2de(pop) / (2^chromLen - 1); % 解码染色体得到实数值
fitness = x.^2 + 4*sin(5*x);
% 选择操作
[~, idx] = sort(fitness, 'descend'); % 对适应度进行排序
newPop = pop(idx(1:popSize/2), :); % 选择适应度较高的个体
% 交叉操作
for j = 1:2:popSize/2
if rand < pc
cpoint = randi([1 chromLen-1]); % 随机选择交叉点
newPop(j:j+1,:) = [newPop(j,1:cpoint) newPop(j+1,cpoint+1:end);
newPop(j+1,1:cpoint) newPop(j,cpoint+1:end)];
end
end
% 变异操作
for j = 1:popSize/2
if rand < pm
mpoint = randi([1 chromLen]);
newPop(j,:) = [newPop(j,1:mpoint-1) ~newPop(j,mpoint) newPop(j,mpoint+1:end)];
end
end
% 更新种群
pop = newPop;
end
% 输出结果
x = -10:0.01:10;
y = x.^2 + 4*sin(5*x);
plot(x, y, 'LineWidth', 2);
hold on;
x = -10 + 20 * bi2de(pop) / (2^chromLen - 1);
y = x.^2 + 4*sin(5*x);
plot(x, y, 'r.', 'MarkerSize', 15);
xlabel('x');
ylabel('y');
legend('目标函数', '遗传算法结果');
```
该示例中,目标函数为 $f(x) = x^2 + 4\sin(5x)$,求解区间为 $[-10, 10]$。首先初始化一个大小为 50 的随机种群,然后进行最多 100 次迭代,每次迭代包括选择、交叉和变异操作。最终输出遗传算法得到的最优解和目标函数的图像。