MATLAB遗传算法求函数最值
问题
求 y=(x(1)2+x(2)2)0.25*(sin((50*(x(1)2+x(2)^2 ))^0.1 )+1) 的最小值。
遗传算法
简单说,就是通过模拟种群遗传繁殖与自然选择找到最好的个体。
一般情况,我们只要能把数据转化成矩阵、把自然语言转化成函数即可,并需要调整以下参数:
%% 遗传算法参数
maxgen=30; %进化代数
sizepop=100; %种群规模
pcross=[0.6]; %交叉概率
pmutation=[0.1]; %变异概率
lenchrom=[1 1 1 1 1]; %变量字串长度
bound=[0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi;0 0.9*pi]; %变量范围
x=fmincon(inline('-5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-sin(5*x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))'),chrom(i,:)',[],[],[],[],[0 0 0 0 0],[2.8274 2.8274 2.8274 2.8274 2.8274]); %目标函数
合理情况:
代数太小:
种群太小:
但代数或种群太大,程序运行会很慢。
交叉概率太小:
变异概率太大(变异要存在,以防使进化方向错误):
MATLAB代码
Code.m
function ret=Code(lenchrom,bound)
%本函数将变量编码成染色体,用于随机初始化一个种群
% lenchrom input : 染色体长度
% bound input : 变量的取值范围
% ret output: 染色体的编码值
flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %线性插值
flag=test(lenchrom,bound,ret); %检验染色体的可行性
end
fun.m
function y = fun(x)
y=(x(1)^2+x(2)^2)^0.25*(sin((50*(x(1)^2+x(2)^2))^0.1)+1);
test.m
function flag=test