MATLAB实现基本的遗传算法(写成函数形式,可调用),优化目标函数,并举例展示

2023-11-07

       遗传算法,其本质上是一种进化算法,相比其他的算法应用范围比较广泛,特别是对于一些非线性、多模型、多目标的函数优化问题,用其他的优化方法较难求解,而遗传算法可以方便的得到较好的结果。不过正如我在PSO粒子群算法的文章中说道,每种算法的应用场景往往和所应用的问题相关,对于特定的问题,某一种优化算法可能展现出其他算法所达不到的效果。

       想必遗传算法的原理大家都大概了解,这里就不过多赘述,总之也是一种在迭代中不断进化,探索,想最优情况靠近的一种迭代算法。遗传算法包括三个基本操作:选择、交叉和变异。不同改进的遗传算法,往往都是在这三个基本操作上进行改进。

       本文给出的是基本的遗传算法程序,同样也是引自龚纯的这本《精通MATLAB最优计算》,用于求取优化函数的最大值,当然求最小值的情况只需更改目标函数的正负即可。要注意的是,本算法是遗传算法的最基本的格式,只能用于解决一维无约束的优化问题。由于略去了很多操作的原理比如编码操作、轮盘赌选择策略、交叉方法,变异方法等,我在代码上加了详细的备注,由于代码本身并不复杂,需要的读者自己阅读一下即可理解。下面给出基本遗传算法函数的调用格式:

function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)

        fitness是待优化函数,调用时可以自己编写后使用句柄调用,随后会举例展示调用的方法。除此之外的参数的意义分别是:

a:自变量下界;

b:自变量上界;

NP:种群大小;

Pc:杂交概率;

Pm:变异概率;

eps:自变量离散精度;

xm:目标函数取最大值时的自变量值;

fv:目标函数的最大值。

基本遗传算法的程序为:

function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)

%待优化的目标函数:fitness
%自变量下界:a
%自变量上界:b
%种群个体数:NP
%最大进化代数:NG
%杂交概率:Pc
%变异概率:Pm
%自变量离散精度:eps
%目标函数取最小值时的自变量值:xm
%目标函数的最小值:fv

L = ceil(log2((b-a)/eps+1));               %根据离散精度,确定二进制编码需要的码长
x = zeros(NP,L);                           %NP行L列的全零矩阵
for i=1:NP
    x(i,:) = Initial(L);                   %种群初始化
    fx(i) = fitness(Dec(a,b,x(i,:),L));    %个体适应值
end
for k=1:NG
    sumfx = sum(fx);                       %所有个体适应值之和
    Px = fx/sumfx;                         %所有个体的选择概率
    PPx = 0;
    PPx(1) = Px(1);
    for i=2:NP                             %从第二个开始
        PPx(i) = PPx(i-1) + Px(i);         %轮盘赌策略的概率累加
    end
    for i=1:NP
        sita = rand();                     %sita是0,1之间的随机数
        for n=1:NP
            if sita <= PPx(n)
                SelFather = n;             %根据轮盘赌策略确定的父亲
                break;
            end
        end
        Selmother = floor(rand()*(NP-1))+1;%随机选择母亲
        posCut = floor(rand()*(L-2))+1;   %随机群定交叉点
        r1 = rand();                       %r1为0,1之间随机数
        if r1<=Pc                          %如果r1小于杂交概率,交叉
            nx(i,1:posCut) = x(SelFather,1:posCut);           %将切点前编码替换为父亲的
            nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);   %将切点后编码替换为母亲的
            r2 = rand();                   %r2为0,1之间随机数
            if r2<=Pm                      %如果r2小于变异概率,变异
            posMut = round(rand()*(L-1)+1);%随机确定变异位
            nx(i,posMut) = ~nx(i,posMut);  %变异位编码取非
            end
        else
            nx(i,:) = x(SelFather,:);      %若r1不小于杂交概率,则将该个体替换为父亲的编码
    end
end
x = nx;
for i=1:NP
    fx(i) = fitness(Dec(a,b,x(i,:),L));     %子代适应值
end
end
fv = -inf;
for i=1:NP
    fitx = fitness(Dec(a,b,x(i,:),L));
    if fitx > fv                            %取个体中的最好值作为最终结果
        fv = fitx;                          %fv为最优解的函数值
        xv = Dec(a,b,x(i,:),L);             %xv为最优解的编码
    end
end
function result = Initial(length)           %初始化函数
for i=1:length
    r = rand();
    result(i) = round(r);
end
    function y = Dec(a,b,x,L)               %二进制编码转换为十进制编码
        base = 2.^((L-1):-1:0);
        y = dot(base,x);
        y = a+y*(b-a)/(2^L-1);

       再次提醒,本程序是最基本的遗传算法程序,只能解决一维无约束的优化问题,若对于多目标问题,其实上文的PSO算法可以完成,或者在本文的遗传算法上做一些更改,之后我也会更新多目标情况下的遗传算法程序。下面举例展示本程序的调用方法,首先将待优化的目标函数在MATLAB中写成函数的形式:

function F = fitness(x)

 F = x^3-60*x^2+900*x+100;

       现在用刚刚的遗传算法代码求该函数的最大值,设置自变量的范围是0-30,可以直接在命令行调用,其调用格式为:

[xv,fv] = myGA(@fitness,0,30,50,100,0.9,0.04,0.01)

运行结果为:

xv =

   10.3223


fv =

   4.0969e+03

       遗传算法求得的结果的精度一方面与离散精度有关,另一方面与个体数目有关,离散精度决定了遗传算法能得到的最大精度,个体数目越大, 求得的结果精度越有可能达到离散精度。同样的迭代次数越大,也越有可能找到更优的解,不过也有可能陷入到局部最优中,所以需要适当的调整杂交概率与变异概率的大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB实现基本的遗传算法(写成函数形式,可调用),优化目标函数,并举例展示 的相关文章

  • 绘制布朗运动 matlab

    首先 我只想说我不太习惯使用matlab 但我需要一个作业 我应该创建一个 布朗运动 我的代码目前如下所示 clf hold on prompt Ge ett input size input prompt numParticles inp
  • 拟合具有扭曲时基的正弦波

    我想知道在 Matlab 中拟合具有扭曲时基的正弦波的最佳方法 时间失真由 n 阶多项式 n 10 给出 其形式为t distort P t 例如 考虑失真t distort 8 12t 6t 2 t 3 这只是幂级数展开 t 2 3 这将
  • MATLAB 中的逻辑数组与数值数组

    我正在比较两个二进制数组 我有一个数组 其中值可以是一或零 如果值相同则为 1 如果不同则为零 请注意 我正在做检查之外的其他事情 因此我们不需要进入矢量化或代码的性质 在 MATLAB 中使用数值数组和逻辑数组哪个更有效 Logical
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • Python 中 Matlab 'fscanf' 的等价物是什么?

    Matlab函数fscanf 似乎很强大 python 或numpy 中是否有相同的等效项 具体来说 我想从文件中读取矩阵 但我不想迭代每一行来读取矩阵 类似的东西 来自 matlab 用于读取 2D 1000x1000 矩阵 matrix
  • 可以避免迭代元胞数组时的“s{1} 烦恼”吗?

    The s 1 标题的 烦恼 指的是下面的 for 块中的第一行 for s some cell array s s 1 unpeel the enclosing cell do stuff with s end This s s 1 业务
  • 从 3 个向量创建等值线图

    我正在尝试根据这些数据创建等高线图 pH D Tur 5 10 3 79 18918919 5 50 6 92 97297297 5 00 0 50 09009009 5 00 6 90 36036036 5 10 9 91 0810810
  • 如何在 MATLAB 中为 4 个子图创建一个通用图例?

    如何在 MATLAB 中为 4 个子图创建一个通用图例 如下所示 又快又脏 hSub subplot 3 1 1 plot 1 1 1 1 1 1 1 1 hLegend legend hello i am legend subplot 3
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整
  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 在 Matlab 中保存当前运行的脚本

    有没有办法保存Matlab中当前运行的脚本 我有一个脚本 它会自动备份一组脚本 但如果我更改了当前脚本 则保存的版本将过期 也许可以调用一些java Thanks 在 Yair Altman 网站上的某个地方 请参阅我的其他答案中的链接 他
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • Matlab:掩码/创建一个知道其原点且具有一定半径的圆形 roi

    只是一个简单的问题 我有一张图像 并且提取了某个点 特征 我知道每个帧中该点的坐标 说 x1 和 y1 我需要一个圆形 ROI 形式 该点在图像上具有我选择的半径 我尝试了 impoly 和 roipoly 当我知道图像中的要点时 不知道如
  • 在 MATLAB 中使用 FFT 的频率响应

    这是场景 使用频谱分析仪 我有输入值和输出值 样本数是32000采样率为2000样本 秒 输入是正弦波50 hz 输入为电流 输出为压力 单位 psi 我如何使用 MATLAB 根据这些数据计算频率响应 使用 MATLAB 中的 FFT 函
  • 在 MATLAB 中检索 spfun、cellfun、arrayfun 等中的元素索引

    有什么办法可以找回index调用函数的元素的cellfun arrayfun or spfun行为 即检索函数范围内元素的索引 为了简单起见 假设我有以下玩具示例 S spdiags 1 4 0 4 4 f spfun x 2 x S 它构

随机推荐

  • AI绘画关键词网站推荐 :轻松获取百万个提示词!完全免费

    一 lexica art 该网站拥有数百万Stable Diffusion案例的文字描述和图片 可以为大家提供足够的创作灵感 使用上也很简单 只要在搜索框输入简单的关键词或上传图片 就能为你提供大量风格不同的照片 点击照片就能看到完整的AI
  • uniapp调用地图,进行位置查询,标记定位

    这周开会又新增一个小功能 就是需要通过身份证号 手机号在地图查询 后台返回经纬度 标记位置 想着挺麻烦 做的时候发现没啥技术 分享给大家
  • JDK,JRE和JVM三者间关系

    JDK是什么 JDK Java Development Kit Java开发工具包 是针对Java开发程序员的产品 是整个Java的核心 包含Java运行环境JRE Java工具和Java基础类库 具有3个主要组成部分 1 Java 编程语
  • java重试工具库: 实现业务逻辑与重试逻辑的解耦

    对于开发过网络应用程序的程序员来说 重试并不陌生 由于网络的拥堵和波动 此刻不能访问服务的请求 也许过一小段时间就可以正常访问了 比如下面这段给某个手机号发SMS的伪代码 发送SMS public boolean sendSMS Strin
  • chrome打开开发者工具(F12)之后看不到请求头信息

    开发者工具的network窗口能够查看浏览器的请求头以及响应头信息 但是有时打开开发者工具会遇到像下图这种情况 找不到请求信息 无法查看请求头 或响应头 解决方法 点击 Filter 按钮 也就是图中的漏斗形状的按钮 下面会多出一系列选项
  • 选择 dwm 作为窗口管理器的 4 大理由分析

    导读 我喜欢极简 如果可能 我会尽量在一个终端下运行所有需要的程序 这避免了一些浮夸的特效占用我的资源或者分散我的注意力 而且 无论怎么调整窗口大小和位置却依旧无法使它们完美地对齐 这也让我感到厌烦 出于对极简化的追求 我喜欢上了 Xfce
  • 14.SpringData-Mongo

    SpringData Mongo Spring data对MongoDB做了支持 使用spring data mongodb可以简化MongoDB的操作 封装了底层的mongodb driver 地址 https spring io pro
  • opencv图像畸变矫正:源码学习

    参考资料 相机标定 4 矫正畸变 undistort 和initUndistortRectifyMap 背景 opencv提供了直接进行畸变矫正的代码 因在项目中需要使用畸变矫正 因此研究一下opencv中畸变矫正的相关接口与代码 便于学习
  • 凸优化学习(六)——一个简单的对偶实例

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中的凸优化部分的内容进行翻译学习 2 一个简单的对偶实例 作为对偶的一个简单应用 在本节
  • 最接近的三数之和

    题目描述 给你一个长度为 n 的整数数组 nums 和 一个目标值 target 请你从 nums 中选出三个整数 使它们的和与 target 最接近 返回这三个数的和 假定每组输入只存在恰好一个解 示例 输入 nums 1 2 1 4 t
  • (计算机复试考研)操作系统重点知识梳理

    1 操作系统引论 操作系统 配置在计算机硬件上的第一层软件 是对硬件系统的首次扩充 为用户和应用程序提供一个简单接口 定义 一组能有效组织和管理计算机硬件和软件的资源 合理地对各类作业进行调度 方便用户使用的程序的集合 操作系统的目标 1
  • C++线程池的实现

    池式结构 在计算机体系结构中有许多池式结构 内存池 数据库连接池 请求池 消息队列 对象池等等 池式结构解决的主要问题为缓冲问题 起到的是缓冲区的作 线程池 通过使 线程池 我们可以有效降低多线程操作中任务申请和释放产 的性能消耗 特别是当
  • Android OpenGL ES零基础系列(三):OpenGL ES的渲染管道及VertexShader与FragmentShader

    前言 在前2篇文章中 我们都说到着色器 且在第二篇中正式说到 这着色器只能用在OpenGL ES2 x等可编程管道里面 而在OpenGL ES1 x是不能用的 但我们一直没有说这是为什么 两者有什么区别 那这篇我们就一起来学习下OpenGL
  • react新出来两个钩子函数是什么?和删掉的will系列有什么区别?

    react新旧生命周期的区别 1 新生命周期中去掉了三个will钩子 分别为componentWillMount componentWillReceiveProps componentWillUpdate 2 新生命周期中新增了两个钩子 分
  • DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null

    背景如下 DB2数据库 获取表结构异常 jcc t4 1065 12306 4 26 14 CharConvertionException ERRORCODE 4220 SQLSTATE null 搜索引擎搜索解决办法 官方解决方法 db2
  • Transformer(四)--实现验证:transformer 机器翻译实践

    转载请注明出处 https blog csdn net nocml article details 125711025 本系列传送门 Transformer 一 论文翻译 Attention Is All You Need 中文版 Tran
  • HBase与MapReduce整合:TableMapper与TableReducer部分源码分析

    目录 关于TableMapper和TableReducer TableMapReduceUtil initTableMapperJob initTableReducerJob TableInputFormat TableRecordRead
  • 基于Hybris平台的电商个性化服务实践

    个性化服务是什么 下面例举几个典型的电商网站的个性化服务案例 对于浏览过新品推荐的客户 电商网站主动为此类客户推荐一款新上市的商品 对于单笔订单总金额达到1000 并且该订单中包含化妆品的客户 此用户将被升级为金牌客户 后续电商网站定期为金
  • RAID介绍及RAID5配置实例(超详细)

    一 RAID磁盘阵列介绍 磁盘阵列的全名 Redundant Arrays of Inexpensive Disk RAID 中文简称是独立冗余磁盘阵列 RAID可以通过技术 软件或者硬件 将多个独立的物理硬盘整合成为一个较大的硬盘组 逻辑
  • MATLAB实现基本的遗传算法(写成函数形式,可调用),优化目标函数,并举例展示

    遗传算法 其本质上是一种进化算法 相比其他的算法应用范围比较广泛 特别是对于一些非线性 多模型 多目标的函数优化问题 用其他的优化方法较难求解 而遗传算法可以方便的得到较好的结果 不过正如我在PSO粒子群算法的文章中说道 每种算法的应用场景