遗传算法求解二元函数最小值matlab代码
时间: 2023-10-18 22:15:27 浏览: 290
以下是一个简单的遗传算法求解二元函数最小值的 Matlab 代码示例:
```matlab
% 遗传算法求解二元函数最小值
% 目标函数:f(x,y) = 100*(y-x^2)^2 + (1-x)^2
% 取值范围:-5 <= x,y <= 5
clear
clc
% 初始化参数
popSize = 100; % 种群大小
chromLen = 32; % 染色体长度
pc = 0.7; % 交叉概率
pm = 0.01; % 变异概率
maxGen = 200; % 最大迭代次数
% 生成初始种群
pop = randi([0,1],popSize,chromLen);
% 循环迭代
for i = 1:maxGen
% 适应度计算
x = -5 + bi2de(pop(:,1:16))/2^16*10;
y = -5 + bi2de(pop(:,17:32))/2^16*10;
fitness = 100*(y-x.^2).^2 + (1-x).^2;
% 最优解
[bestFit,idx] = min(fitness);
bestX = x(idx);
bestY = y(idx);
% 选择
cumFitness = cumsum(fitness)/sum(fitness);
newPop = zeros(popSize,chromLen);
for j = 1:popSize
idx = find(cumFitness >= rand,1);
newPop(j,:) = pop(idx,:);
end
% 交叉
for j = 1:2:popSize
if rand < pc
cpos = randi(chromLen-1);
newPop(j,[cpos+1:chromLen]) = pop(j+1,[cpos+1:chromLen]);
newPop(j+1,[cpos+1:chromLen]) = pop(j,[cpos+1:chromLen]);
end
end
% 变异
for j = 1:popSize
for k = 1:chromLen
if rand < pm
newPop(j,k) = 1-newPop(j,k);
end
end
end
pop = newPop;
% 显示结果
disp(['迭代次数:',num2str(i),',最优解:',num2str(bestFit),',x:',num2str(bestX),',y:',num2str(bestY)]);
end
```
其中,`bi2de` 函数用于将二进制数转化为十进制数,`randi` 函数用于生成随机整数,`cumsum` 函数用于计算累加和,`rand` 函数用于生成随机数。在循环迭代的过程中,首先计算种群中每个个体的适应度,然后根据适应度进行选择、交叉和变异操作,最后更新种群。在每次迭代结束后,输出当前迭代次数、最优解及其对应的 x 和 y 值。
阅读全文