基于遗传算法(GA)工具箱优化求解一元函数优化 -【 附代码+详细注解】

基于遗传算法工具箱求解一元函数优化 -【 附代码+详细注解】


前言:
链接: 遗传算法工具箱下载地址.
链接: 遗传算法工具箱的导入MatLab软件教程地址.


一.优化函数

此次是基于上次发表的的资源——遗传算法工具箱以及工具箱导入matlab软件教程以后的应用部分!
此次优化的函数是一个较为简单“一元函数的优化”,主要的目的是为了让大家先大体了解一下遗传算法,为了未来的更高难度的函数做准备!

  • 此次优化函数及定义域如下图所示:
    优化函数

求此函数的最小值!


二.优化后的实际效果

  • 优化的最终结果
    优化后
  • 迭代次数
    迭代次数
    以上两图是我的运行结果,大家运行完后可能会与我的结果有细微差别,因为遗传算法就是这样的,每次运行完可能最后结果趋近于一样,但是运行的过程都不尽相同,这与遗传算法本身是有关系的,如果以后有机会我详细写一篇文档解释一下!

三.代码部分

配有超详细注解

clc
clear 
close all
%% 画出函数图
figure(1);                          % 第一个图
hold on
lb = 1;
ub = 2;                             % 函数自变量取值范围[1,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 = zeros(2,MAXGEN);    %寻优结果的初始值
FieldD = [PRECI;lb;ub;1;0;1;1];      % 区域描述器
Chrom = crtbp(NIND,PRECI);          % 创建任意离散随机种群

%% 优化
gen = 0;        % 代计数器
X = bs2rv(Chrom,FieldD);       % 初试种群二进制到十进制转换
ObjV = sin(10*pi*X)./X;        % 计算目标函数值
while gen < MAXGEN
    FitnV = ranking(ObjV);     % 分配适应度值,根据值的大小分配,函数值越小分配的越大,函数值越大分配的越小
    SelCh = select('sus',Chrom,FitnV,GGAP); % 选组 ,没全选只选了95%的
    SelCh = recombin('xovsp',SelCh,px);     % 重组,生成新的种群
    SelCh = mut(SelCh,pm);                  % 变异,不输入Pm,默认0.7
    X = bs2rv(SelCh,FieldD);                % 子代个体十进制转换
    ObjVSel = sin(10*pi*X)./X;              % 计算子代的目标函数
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);  % 重插入子代到父代,得到新种群 - 区分大小写,38个替换适应度最小的38个,剩下两个适应度最高的不替换
    X = bs2rv(Chrom,FieldD);
    gen = gen + 1;                          % 代计数器增加
    % 获取每一代的最优解及其序号,Y为最优解,I为个体的序号
    [Y,I] = min(ObjV);
    trace(1,gen) = X(I);                    % 记下每一代的最优值
    trace(2,gen) = Y;                       % 记下每一代的最优值  - trace(1,1)是矩阵的迹
end
plot(trace(1,:),trace(2,:),'bo');           % 画出每一代的最优点
grid on;                                    % 显示格格
plot(X,ObjV,'b*');                          % b* 应该是标记点
%% 画进化图
figure(2);                              % 第二个图
plot(1:MAXGEN,trace(2,:));
grid on;
xlabel('遗传代数');
ylabel('解的变化');
title('进化过程');
bestY = trace(2,end);
bestX = trace(1,end);
fprintf(['最优解:\nX=',num2str(bestX),'\nY=',num2str(bestY),'\n']); % num2Str(...)函数的含义是把数字变成字符串,方便函数最后数值的打印

2021.12.31

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vip__Miracle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值