学习遗传算法一、用遗传工具箱求解单变量和多元函数极值

首先是单个变量函数的最小值

% 学习遗传算法,第一个案例:用遗传算法工具箱计算一元函数最小值
% 2021.5.30
clc
clear
figure;
hold on

%定义自变量的范围
lb = 1; ub = 2;
ezplot('sin(10*pi*X)/X',[lb,ub]);
xlabel('自变量/X')
ylabel('函数值/Y')

%%定义遗传算法参数
NIND = 40   %种群大小
MAXGEN = 20 %最大遗传代数
PRECI = 20  %个体长度
GGAP = 0.95 %代沟
px = 0.7    %交叉概率
pm = 0.01   %变异概率

%trace用来记录每一次的结果
trace = zeros(2,MAXGEN)

%创建离散种群
Chrom = crtbp(NIND,PRECI)
%
FieldD = [PRECI;lb;ub;1;0;1;1]
%%优化
gen = 0
X = bs2rv(Chrom,FieldD)
ObjV = sin(10*pi*X)./X
while gen<MAXGEN
    FitnV = ranking(ObjV)                   %分配适应度
    SelCh = select('sus',Chrom,FitnV,GGAP)  %选择
    SelCh = recombin('xovsp',SelCh,px)      %重组
    SelCh = mut(SelCh,pm)                   %变异
    X = bs2rv(SelCh,FieldD)                 %子代个体的十进制转换
    ObjVSel = sin(10*pi*X)./X
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel)
    X = bs2rv(Chrom,FieldD)
    gen = gen+1;
    [Y,I] = min(ObjV)
    trace(1,gen) = X(I)
    trace(2,gen) = Y
end

plot(trace(1,:),trace(2,:),'bo');
grid on
plot(X,ObjV,'b*');

figure
plot(1:MAXGEN,trace(2,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
bestY = trace(2,end) 
bestX = trace(1,end)    

接着是多变量函数的最大值

% 学习遗传算法,第二个案例,用遗传工具箱计算二元函数的最大值
% 2021.5.31
% 王东方
clc
clear
close all

%定义自变量的范围x y
low_x = -2;
up_x = 2;
low_y = -2;
up_y = 2;

ezmesh('x*cos(2*pi*y)+y*sin(2*pi*x)',[low_x,up_x,low_y,up_y],100);
hold on

%%定义遗传算法参数
NIND = 40   %种群大小
MAXGEN = 20 %最大遗传代数
PRECI = 50  %个体长度
GGAP = 0.95 %代沟
px = 0.7    %交叉概率
pm = 0.01   %变异概率

trace = zeros(3,MAXGEN);
%创建离散种群
Chrom = crtbp(NIND,PRECI*2)
FieldD = [PRECI PRECI;low_x low_y;up_x up_y;1 1;0 0;1 1;1 1];
%%优化
gen = 0
XY = bs2rv(Chrom,FieldD)
X = XY(:,1);
Y = XY(:,2);
ObjV = Y.*sin(2*pi*X)+X.*cos(2*pi*Y)
while gen<MAXGEN
    FitnV = ranking(-ObjV)                   %分配适应度
    SelCh = select('sus',Chrom,FitnV,GGAP)  %选择
    SelCh = recombin('xovsp',SelCh,px)      %重组
    SelCh = mut(SelCh,pm)                   %变异
    XY = bs2rv(SelCh,FieldD)                 %子代个体的十进制转换
    X = XY(:,1);
    Y = XY(:,2);
    ObjVSel = Y.*sin(2*pi*X)+X.*cos(2*pi*Y)
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel)
    XY = bs2rv(Chrom,FieldD)
    gen = gen+1;
    [Y,I] = max(ObjV)
    trace(1:2,gen) = XY(I,:)
    trace(3,gen) = Y
end

plot3(trace(1,:),trace(2,:),trace(3,:),'bo');
grid on
plot3(XY(:,1),XY(:,2),ObjV,'b*');

figure
plot(1:MAXGEN,trace(3,:));
grid on
xlabel('遗传代数')
ylabel('解的变化')
bestZ = trace(3,end) 
bestY = trace(2,end) 
bestX = trace(1,end)

可以对比学习一下,有时间我再写一下心得,这个是跟着MATLAB只能算法30个案例分析的代码敲的

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值