matlAB 遗传算法流程代码示例两个变量
时间: 2023-08-02 18:08:27 浏览: 94
遗传算法用于求解函数极值的matlab入门级代码
以下是适用于两个变量的MATLAB遗传算法代码示例,仍然以求解Rosenbrock函数为例:
```matlab
%% 遗传算法示例
% 目标函数为 Rosenbrock 函数,两个变量
% 参数设置
pop_size = 50; % 种群大小
gene_num = 2; % 基因个数
max_gen = 100; % 迭代次数
pc = 0.7; % 交叉概率
pm = 0.1; % 变异概率
% 初始化种群
pop = rand(pop_size, gene_num) * 10 - 5;
% 迭代
for i = 1:max_gen
% 计算适应度
fitness = rosenbrock(pop);
% 选择操作
[pop_new, ~] = selection(pop, fitness);
% 交叉操作
pop_new = crossover(pop_new, pc);
% 变异操作
pop_new = mutation(pop_new, pm);
% 合并种群
pop = [pop; pop_new];
% 选择前 pop_size 个个体作为新种群
[~, idx] = sort(rosenbrock(pop));
pop = pop(idx(1:pop_size), :);
end
% 返回最优解
[~, idx] = min(rosenbrock(pop));
x = pop(idx, :);
% Rosenbrock 函数
function y = rosenbrock(x)
y = 100 * (x(:, 2) - x(:, 1).^2).^2 + (1 - x(:, 1)).^2;
end
% 选择操作
function [pop_new, idx] = selection(pop, fitness)
[~, idx] = sort(fitness);
idx = idx(end:-1:1);
pop_new = pop(idx(1:end/2), :);
end
% 交叉操作
function pop_new = crossover(pop, pc)
pop_new = [];
for i = 1:2:size(pop, 1)-1
if rand < pc
k = randi(size(pop, 2)-1);
pop_new = [pop_new; [pop(i, 1:k) pop(i+1, k+1:end)]];
pop_new = [pop_new; [pop(i+1, 1:k) pop(i, k+1:end)]];
else
pop_new = [pop_new; pop(i, :); pop(i+1, :)];
end
end
end
% 变异操作
function pop_new = mutation(pop, pm)
pop_new = pop + pm * randn(size(pop));
end
```
相比上一个示例,主要的区别在于目标函数的定义和适应度计算方式。在这个例子中,Rosenbrock函数只有两个变量,因此定义和计算方式有所不同。具体实现过程与上一个示例类似。
阅读全文