MATLAB实现遗传算法求解n维变量函数的最小值问题

2023-11-20

一、问题简述

本文以遗传算法求解30维变量函数F(x_i)的最小值问题举例

F(x)=\sum_{i=1}^n(\sum_{j=1}^ix_j)^2

式中,n=30,且-100\le x_j\le100

二、遗传算法概述

遗传算法(genetic algorithm, GA)是一种仿效生物界中“物竞天择,适者生存”演化法则的进化算法。将问题参数编码为染色体,利用迭代的方法进行选择、交叉和变异等运算来更新染色体,最终生成符合优化目标的染色体。

三、谢菲尔德遗传算法工具箱的安装

本文代码运行之前须先安装谢菲尔德遗传算法工具箱,安装包下载地址:

链接:https://pan.baidu.com/s/1i-1Jh7MWMnCrcwPu-7Fw8g 
提取码:1234

安装方法

1. 解压安装包,得到gatbx文件夹

 2. 将gatbx-toolbox文件夹复制到matlab安装目录下的toolbox文件夹

 3. 打开Matlab,依次点击主页->设置路径->添加文件夹

 4. 点击添加文件夹,找到复制到toolbox文件夹的gatbx-toolbox文件夹,点击选择文件夹

 5. 点击保存,然后就可以看到设置路径下出现的gatbx文件夹

 6. 安装检测,在命令行窗口输入:v = ver("gatbx")

 四、代码实现

clc
clear
close all

%-------------------------------------------------------------------------%
% 多元函数遗传算法优化
% fun为目标函数
% lb为自变量取值下限
% ub为自变量取值上限
% flag为0时计算最小值
% flag为1时计算最大值
%-------------------------------------------------------------------------%

%% 目标函数参数
lb = zeros(1,30)-100;                               % 自变量取值下限
ub = zeros(1,30)+100;                               % 自变量取值上限
N = length(lb);                                     % 变量维数
flag = 0;

%% 遗传算法参数
NIND = 40;                                          % 种群大小
MAXGEN = 5000;                                      % 最大遗传代数
PRECI = 20;                                         % 个体长度
GGAP = 0.95;                                        % 代沟
px = 0.7;                                           % 交叉概率
pm = 0.01;                                          % 变异概率
trace = zeros(N+1,MAXGEN);                          % 寻优结果的初始值

% 区域描述器
FieldD = [zeros(1,N)+PRECI;
          lb;
          ub;
          zeros(1,N)+1;
          zeros(1,N);
          zeros(1,N)+1;
          zeros(1,N)+1];

Chrom = crtbp(NIND,PRECI*N);                        % 创建任意离散随机种群

%% 优化
gen = 0;                                            % 代计数器
Val = bs2rv(Chrom,FieldD);
S = size(Val);
ObjV = zeros(1,S(1))';
for i = 1:S(1)
    ObjV(i) = fun(Val(i,:));
end

while gen < MAXGEN
    % 分配适应度值
    if flag == 0
        FitnV = ranking(ObjV);
    else
        FitnV = ranking(-ObjV);
    end
    SelCh = select('sus',Chrom,FitnV,GGAP);         % 选择
    SelCh = recombin('xovsp',SelCh,px);             % 重组
    SelCh = mut(SelCh,pm);                          % 变异
    Val = bs2rv(SelCh,FieldD);                      % 子代个体的十进制转换
    S = size(Val);
    ObjVSel = zeros(1,S(1))';
    for i = 1:S(1)
        ObjVSel(i) = fun(Val(i,:));
    end
    [Chrom,ObjV] = reins(Chrom,SelCh,1,1,ObjV,ObjVSel);% 插入子代到父代
    Val = bs2rv(Chrom,FieldD);
    gen = gen + 1;                                  % 代计数器增加
    
    % 获取每代的最优解及其序号,Y为最优解,I为个体的序号
    if flag == 0
        [Y,I] = min(ObjV);
    else
        [Y,I] = max(ObjV);
    end
    trace(1:end-1,gen) = Val(I,:);                  % 记录每代的最优值
    trace(end,gen) = Y;                             % 记录每代的最优值
end

%% 画进化图
figure(1)
plot(1:MAXGEN,trace(end,:))
grid on
xlabel('遗传代数')
ylabel('解的变化')
title('进化过程')
disp('最优解为')
disp(trace(end,end))
disp('最优解时的决策变量为')
disp(trace(1:end-1,end)')

%% 目标函数
function f = fun(x)
tmpx = 0;
tempx = 0;
for i = 1:30
    for j = 1:i
        tmpx = tmpx + x(j);
    end
    tmpx = tmpx^2;
    tempx = tmpx + tempx;
    tmpx = 0;
end
f = tempx;
end

五、运行结果

程序执行最优解结果x及最优值为:

迭代过程中对函数值的绘图结果为:

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

MATLAB实现遗传算法求解n维变量函数的最小值问题 的相关文章

  • MATLAB 图像锐化 - 使用(1-高斯低通滤波器)的高斯高通滤波器

    我试图通过设计高斯高通滤波器来锐化图像 我想利用高通滤波器相当于单位矩阵减去低通滤波器的事实来做到这一点 所以我执行了以下操作 image imread Question3 Data Cats jpg read image H 1 fspe
  • 带 if 语句的可向量化 FIND 函数 MATLAB

    我有一个矩阵u 我想遍历所有行和所有列并执行以下操作 如果元素非零 我返回行索引的值 如果元素为零 则查找该元素之后的下一个非零元素的行索引 我可以使用两个带有 find 函数的 for 循环轻松完成此操作 但我需要多次执行此操作 不是因为
  • 将 Android 应用程序与服务器上的 Matlab 应用程序连接

    我正在 Android 上开发一个应用程序 它将获取图像输入 并将该输入传递到安装 MATLAB 应用程序的服务器 MATLAB 应用程序将计算结果并将其返回到该 Android 应用程序 我想知道我可以使用哪个服务器 如何将 MATLAB
  • 将输出从符号数学 (sym) 转换为浮点型

    我的问题类似于这个问题 https stackoverflow com questions 11114101 how to convert mupad symbol i sqrt 1 to i in matlab 11114959 1111
  • 在 Matlab 中对列进行排序

    我有 2 列使用 textscan 导入的数据 数据看起来像这样 其中U is undetect and D is detect mydata 51 U 57 D 48 U 47 D my data 4x1 double 4x1 char
  • 如何在 R 或 MATLAB 中为散点图创建阴影误差条“框”

    我想在 R 或 MATLAB 中创建一个简单的散点图 涉及两个变量 x 和 y 它们有与之相关的错误 epsilon x 和 epsilon y 然而 我不是添加误差线 而是希望在每个 x y 对周围创建一个 阴影框 其中框的高度范围从 y
  • Microsoft Visual C++ 2008 和 R2007b 的 Mex 类型

    我想对 vs2008 和 matlab2007b 使用 mex 类型 我尝试了下面的代码 include
  • 查找数组中元素之间的平均差异的有效方法

    希望标题不会让人困惑 通过例子来展示很简单 我有一个像这样的行向量 1 5 6 我想找到每个元素之间的平均差异 此示例中的差异为 4 和 1 因此平均值为 2 5 这是一个小例子 我的行向量可能非常大 我是 MatLab 新手 那么有没有一
  • 将单元格转换为双精度

    gt gt C 1 2 CF 2 C 1 2 CF 2 gt gt whos C Name Size Bytes Class Attributes C 2x2 478 cell 我怎样才能转换C into double以便 gt gt C
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • 如何获取活动对象 MATLAB GUI 的句柄

    我正在尝试使用 MATLAB GUI 创建日历 我有两个Edit Text对象 edittext1 and edittext2 我想做这个 我把光标放在edittext1然后在日历中选择日期 它会进入文本字段edittext1 同样对于ed
  • 将组合字符串和数字输入的元胞数组写入文本文件

    考虑以下 DateTime 2007 01 01 00 00 2007 02 01 00 00 2007 03 01 00 00 Headers Datetime Data Dat 100 200 300 Data DateTime num
  • 为什么matlab的mldivide比dgels好这么多?

    Solve Ax b 真正的双 A是超定的 Mx2 其中 M gt gt 2 b是MX1 我运行了大量的数据mldivide 并且结果非常好 我用 MKL 写了一个 mex 例程LAPACKE dgels但它远没有那么好 结果有大量噪音 并
  • 在 Matlab 中显示有理数

    我有两个整数 m n 它们一起形成 m n 形式的有理数 现在我只想以这种理性的形式在 Matlab 中显示它们 我可以通过这样做来做到这一点 char sym m n 所以 如果 例如m 1 n 2 Matlab将显示1 2 然而 如果m
  • Matlab Solve():未给出所有解决方案

    我试图找到两条曲线的交点 syms x y g x 20 exp x 30 3 5 1 sol x sol y solve x 22 3097 2 y 16 2497 2 25 y g x x y Real true 它只提供一种解决方案
  • 从 Java 运行 MATLAB 函数

    我在 MATLAB 中有一个 m 文件 我想从 Java 调用该文件 并以字符串或 Java 中的任何形式获取解决方案 这听起来很简单 但由于某种原因我无法让它发挥作用 我试过这个 matlab nosplash wait nodeskto
  • MATLAB - GUI 和 OPC 服务器

    我想在 MATLAB 中设计一个图形用户界面 可以使用 MATLAB 的过程控制对象链接和嵌入 OPC 工具箱连续读取数据 我怎样才能实现这个 我已经设计了图形用户界面 但我无法将数据读入图形用户界面 就这样做 type opctoolMA
  • 为什么 mex 文件中的 OpenMP 仅产生 1 个线程?

    我是 OpenMP 新手 我有以下代码 使用配置了 MSVS2010 的 Matlab mex 可以正常编译 计算机有 8 个可用处理器 我也使用 matlabpool 检查过 include mex h include
  • MATLAB 可执行文件太慢

    我使用以下命令将 MATLAB 程序转换为基于控制台的应用程序deploytool在 MATLAB 中 MATLAB m文件执行大约需要 2 秒 但在我将其转换为可执行文件并调用 exe 执行需要45秒 太长了 我想将 MATLAB 程序与
  • Matlab颜色检测

    我试图一致地检测同一场景的图像之间的某种颜色 这个想法是根据颜色配置文件识别一组对象 因此 例如 如果给我一个带有绿色球的场景 并且我选择绿色作为我的调色板的一部分 我想要一个具有反映它检测到球的矩阵的函数 任何人都可以为这个项目推荐一些

随机推荐

  • JSON介绍及代码示例

    了解json JSON是什么 JSON是JavaScript Object Notation的缩写 它是一种数据交换格式 在JSON出现之前 大家一直用XML来传递数据 因为XML是一种纯文本格式 所以它适合在网络上交换数据 XML本身不算
  • MFC ListControl

    1 ListControl的基本创建 基本设置 m ListCtrl DeleteAllItems m ListCtrl InsertColumn 0 T NBA m ListCtrl InsertColumn 1 T Final Cham
  • office2010 卸载出现“安装程序找不到ProPlus.ww\ProPsWW.cab 请浏览正确的安装源的错”解决方法

    笔者在换电脑后想卸载office2010安装office2016 但是卸载的过程中遇到了上述问题就记录一下自己的解决方案 1 强制删除officeX对应的文件夹 然后使用toolkit工具清理即可 笔者是通过这种方法解决的 2 应该也可以使
  • C++STL之deque容器

    概述 上一篇我们讲过queue容器 它是一个单向的队列 只能从尾部插入 头部删除 而本节讲的deque容器 它是一个双向的队列 在头尾均可以调用插入与删除 并且支持迭代器和迭代器随机访问 这是它与queue的最大区别 实际上 deque容器
  • c++读取文件

    include
  • 7z命令行加密文件夹和文件名

    因为有时候需要将非常机密的东西上传到网盘 毕竟网盘也不一定安全 而每次都鼠标点添加密码很麻烦 然后就用命令行脚本弄快 电脑安装7zip 在你要压缩的文件夹打开命令行 7z a r pABC12345 mhe on test 7z a 添加f
  • 5 款最棒的 Vue 移动端 UI 组件库 - 特别针对国内使用场景推荐

    本文完整版 最棒的 Vue 移动端 UI 组件库 特别针对国内使用场景推荐 Vue 移动端 UI 组件库推荐 Vant 3 有赞移动 UI 组件库 支持 Vue 3 微信小程序 支付宝小程序 Cube UI 滴滴出行移动端 UI 库 质量可
  • 关于直流电源纹波和噪声的测量的分析和介绍

    电源纹波和噪声的定义PARD periodicand random deviation 1 电源纹波 Power Ripple 直流电压 电流中 叠加在直流稳定量上的交流分量 用电压和电流的均方根值 mVrms mArms 或峰峰值 mVp
  • 优秀LOGO的六大特质

    1 识别性 大多数的设计师认为 识别性是最容易在艺术设计和商业设计上发生冲突的地方 很多设计师都抱怨客户没有审美 喜欢平庸的LOGO设计 而一些客户认为设计师缺乏对公司和产品的理解 不懂营销 归根到底 无论设计师的设计多么创新 多么独特 始
  • 【word】错误!文档中没有指定样式的文字。 1

    问题 给文档中的图片插入题注时 报错 错误 文档中没有指定样式的文字 1 解决办法 光标定位到错误信息上 单击右键 选择 编辑域 在弹出的 域 对话框中 左侧的 域名 列表中选择 StyleRef 在右侧的 样式名 列表中选择 列表段落
  • Fabric private data入门实战

    Hyperledger Fabric private data是1 2版本引入的新特性 fabric private data是利用旁支数据库 SideDB 来保存若干个通道成员之间的私有数据 从而在通道之上又提供了一层更灵活的数据保护机制
  • VSCode中配置命令行参数

    VSCode中配置命令行参数 在跑程序调试的时候 可以直接使用脚本运行程序 这个时候调试代码只能用pdb 我觉得不太习惯 而且感觉不是很好 所以想这能不能将运行程序的脚本中的命令直接配置到vscode上 就有了这篇记录 正常vscode D
  • DHCP配置实战

    1 DHCP简介 DHCP dynamic host configuration protocol 动态的主机配置协议 基于TCP P的网络 DHCP减少了重新配置计算机IP地址的工作量 在TCP P网络中 IP地址的规划与分配是一件重要而
  • Java手写广度优先搜索和案例拓展

    Java手写广度优先搜索和案例拓展 手写必要性 手写实现广度优先搜索算法主要有以下几个必要性 理解算法原理 通过手写实现广度优先搜索算法 能够深入理解算法的原理和运行机制 这有助于我们更好地理解广度优先搜索的核心思想和优势 并能应用于解决其
  • pa皮安级电流检测电路

    1 芯片 ad8602 lmc6062 2 电路
  • Eclipse中targetlm2e-wtplweb-resources\META-1(Click for details)解决办法

    targetlm2e wtplweb resources META 1 Click for details 系统找不到指定的路径 解决办法 最近总是发现我的eclipse里面的maven项目总是报错误时不时地出现 然后我自己更新一下mave
  • Qt学习(三)—— lambda表达式

    lambda表达式 lambda 表达式是 C 11 新增的新特性 用于定义并创建匿名的函数对象 在 Qt 中配合信号一起使用 使用lambda表达式的好处在于不用定义槽函数 也不用指定信号接收者 为了使用 lambda 表达式 需要在项目
  • Flutter - okToast封装

    demo 地址 https github com iotjin jh flutter demo 使用版本 加载框 https pub flutter io cn packages oktoast readme tab oktoast 2 3
  • 【70】爬楼梯问题求解

    题目描述 思路分析 当阶数为 1 时 解法为 1 当阶数为 2 时 解法为 2 当阶数为 3 时 解法为 3 当阶数为 4 时 解法为 5 很明显可以分析出 一下公式 代码实现 递归法 class Solution public int c
  • MATLAB实现遗传算法求解n维变量函数的最小值问题

    一 问题简述 本文以遗传算法求解30维变量函数的最小值问题举例 式中 且 二 遗传算法概述 遗传算法 genetic algorithm GA 是一种仿效生物界中 物竞天择 适者生存 演化法则的进化算法 将问题参数编码为染色体 利用迭代的方