经典遗传算法及MATLAB实例

2023-10-27

1. 遗传算法简单介绍

1.1 理论基础

整个算法的基础就是达尔文的生物进化论,“物竞天择,适者生存” 这句话已经是常识了。

用雪兔做一个引子吧:

东北那旮瘩,有群原始雪兔,刚从未知物种进化而来,五颜六色(表现型)漂亮极了,称之为 I(0)。
(注意:种群初始化)

入夏了,雪兔们出来觅食,浅色兔在草地中无所遁形,被雪狐收割了一波(大批浅色+小批深色)。
入冬了,雪兔们出来觅食,深色兔在雪地中光彩夺目,被雪狐收割了一波(大批深色+小批浅色)。
(注意:自然选择过程)

春天到了,又到了兔兔们生孩的季节,雪兔们染色体内的基因进行 重组/不重组 ,产生一批受精卵。
(注意:交叉遗传过程)

受精卵内的生命活动非常强烈,造成了基因的 突变/不突变,产生了各种各样奇怪的小雪兔。
(注意:基因变异过程)

老雪兔们完成了自己繁衍的使命,全部不知所踪。留下新生代,继续在各种威胁下苟活,这一代叫 I(1)。

再次入冬入夏,雪兔们又出来觅食。。。。。。再次入冬,觅食。。。。。。入冬,觅食。。。。。。

就这样,50年后,基因突变和重组造就了种神奇的兔子:夏天褐色,冬天白色,可以轻易躲避雪狐的追捕

再次入冬入夏,雪兔们又出来觅食。。。。。。再次入冬,觅食。。。。。。入冬,觅食。。。。。。

这样,50年后,雪地里基本上见不到五颜六色的雪兔了,这时候雪兔们达到了兔生巅峰!

这就是遗传算法的理论基础,自然选择、交叉、变异、迭代,最终获得最优解。

注意:算法是根据表现型来进行选择,最终选出最优的表现型及其对应的基因。

1.2 算法要点

1.1 编码

编码是为了把我们的输入参数变成染色体(每个个体只有一条染色体),以便于进行交叉和遗传运算。

例如我们把雪兔的颜色进行划分, 0-255 (表现型)代表 黑->白 的不同程度,0就是纯黑的,255就是纯白的。

我们这里只谈一下简单的二进制编码,二进制编码中的每一个二进制位是一个基因,整个数字为染色体。

那么0-255共有256阶(表现型),我们可以用8位2进制数来表示(基因型)。

兔色为0的编码为 00000000,兔色为2的编码为 00000010,兔色为255的编码为 11111111。

1.2 适应度函数

适应度函数就是个体对环境的适应度,适应度越强的越能产生后代,保留自己的基因及表现型。

这里,我们假设灰色兔子的适应能力最强,即兔色为128的兔子不会被吃掉,设定函数为:

在这里插入图片描述

是一个最大值为128的分段函数,图像如下:
在这里插入图片描述
适应度函数的极值点一般是未知的,这里我们为了演示方便,就先展示出来。

1.3 基本流程

流程就和雪兔故事一样简单,如下所示:

在这里插入图片描述

注意:迭代的终止条件可以不是最大迭代次数,比如规定为种群适应度值的方差小于某个值(即种群表现型趋于一致)。

2. 代码实例(MATLAB)

2.1 代码汇总

遗传算法代码(通用代码):

function [bestChromosome,fitnessBest]=GA(numOfChromosome,numOfGene,iterationNum)
%% 函数功能:执行基于自适应遗传算法的卸载决策
%   输入:
%       numOfChromosome:染色体数量,即迭代的种群大小
%       numOfGene:基因的数量,即所用二进制编码的位数
%       iterationNum:迭代的总次数,达到迭代次数即终止迭代
%   输出:
%       bestChromosome:最优的染色体(即最优的输入)
%       fitnessBest:最优的适应度值(即最优的结果)

%% 随机生成初始种群,种群大小为numOfChromosome,染色体中基因数为numOfGene
% lastPopulation:上一代的种群(染色体)
% newPopulation:新一代的种群(染色体)
% randi([0,1])会产生0或1的整数
lastPopulation=randi([0,1],numOfChromosome,numOfGene);
newPopulation=zeros(numOfChromosome,numOfGene);

%% 进行遗传迭代,直至达到最大迭代次数iterationNum
for iteration=1:iterationNum
    %% 计算所有个体(染色体)的适应度,一共有numOfChromosome个适应度值
    fitnessAll=zeros(1,numOfChromosome);
    for i=1:numOfChromosome
        individual=lastPopulation(i,:);
        fitnessAll(i)=fitnessFunc(individual);
    end
    
    %% 如果达到最大迭代次数,跳出(不能再进行选择遗传和变异了)
    if iteration==iterationNum
        break;
    end
    
    %% 使用轮盘赌法选择numOfChromosome条染色体,种群中个体总数不变
    fitnessSum=sum(fitnessAll);
    fitnessProportion=fitnessAll/fitnessSum;
    % 使用随机数进行numOfChromosome次选择,保持种群中个体数量不变
    for i=1:numOfChromosome
        probability=rand(1);
        proportionSum=0;
        chromosomeIndex=1;
        for j=1:numOfChromosome
            proportionSum=proportionSum+fitnessProportion(j);
            if proportionSum>=probability
                chromosomeIndex=j;
                break;
            end
        end
        newPopulation(i,:)=lastPopulation(chromosomeIndex,:);
    end

    %% 将染色体进行配对,执行单点交叉
    lastPopulation=newPopulation;
    % 生成从1到numOfChromosome的无序排列,每两个相邻数字进行配对
    coupleAllIndex=randperm(numOfChromosome);
    for i=1:floor(numOfChromosome/2)
        coupleOneIndex=coupleAllIndex(2*i-1:2*i);
        % 定义两条染色体交叉的概率,自己选择
        probability=0.6;
        % 如果生成的随机数在交叉概率内,执行交叉操作
        if rand(i)<probability
            % 随机生成交叉的基因点,将两条基因进行交叉
            crossPosition=randi([1,numOfGene],1);
            newPopulation(coupleOneIndex(1),crossPosition:end)=lastPopulation(coupleOneIndex(2),crossPosition:end);
            newPopulation(coupleOneIndex(2),crossPosition:end)=lastPopulation(coupleOneIndex(1),crossPosition:end);
        end
    end

    %% 对每条染色体执行基本位变异操作
    lastPopulation=newPopulation;
    for i=1:numOfChromosome
        % 定义染色体变异的概率,自己选择
        probability=0.2;
        % 如果生成的随机数在变异概率内,执行变异操作
        if rand(1)<probability
            % 选择变异的位置
            mutatePosition=randi([1,numOfGene],1);
            % 将对应基因位置的二进制数反转
            if(lastPopulation(i,mutatePosition)==0)
                newPopulation(i,mutatePosition)=1;
            else
                newPopulation(i,mutatePosition)=0;
            end
        end
    end 
    
    %% 完成了一次迭代,更新种群
    lastPopulation=newPopulation;
end

%% 遗传迭代结束后,获得最优适应度值和对应的基因
fitnessBest=max(fitnessAll);
bestChromosome=newPopulation(find(fitnessAll==fitnessBest,1),:);

雪兔例子的适应度计算代码:

function fitness=fitnessFunc(chromosome)
%% 函数功能:计算染色体的表现型及其适应度
% 输入:
%       chromosome:染色体的基因序列
% 输出:
%       fitness:染色体(个体)的适应度值

%% 计算雪兔染色体对应表现型
len=length(chromosome);
numList=2.^(len-1:-1:0);
x=sum(chromosome.*numList);

%% 计算表现型对应的适应度
if x<128
    fitness=x;
else
    if x>128
        fitness=256-x;
    else
        fitness=128;
    end
end


2.1 初始化种群

%% 随机生成初始种群,种群大小为numOfChromosome,染色体中基因数为numOfGene
% lastPopulation:上一代的种群(染色体)
% newPopulation:新一代的种群(染色体)
% randi([0,1])会产生0或1的整数
lastPopulation=randi([0,1],numOfChromosome,numOfGene);
newPopulation=zeros(numOfChromosome,numOfGene);

这里使用随机数生成函数生成了numOfChromosome条染色体,每条染色体有numOfGene个基因。

将生成的种群放入lastPopulation中,每一行是一条染色体。

newPopulation相当于一个辅助数组,存储生成种群的中间结果。

2.2 计算适应度

    %% 计算所有个体(染色体)的适应度,一共有numOfChromosome个适应度值
    fitnessAll=zeros(1,numOfChromosome);
    for i=1:numOfChromosome
        individual=lastPopulation(i,:);
        fitnessAll(i)=fitnessFunc(individual);
    end

计算种群中所有个体的适应度,即把每一条染色体(个体)都放入适应度函数中,得到适应度结果。

2.3 迭代终止判断

    %% 如果达到最大迭代次数,跳出(不能再进行选择遗传和变异了)
    if iteration==iterationNum
        break;
    end

计算完适应度,如果达到终止条件,就不再进行选择、遗传和变异了。

否则你跳出循环时,种群适应度与计算的的适应度不匹配。

另一种方案:执行选择、遗传、变异,跳出循环后再次计算适应度即可。

2.4 自然选择(轮盘赌法)

    %% 使用轮盘赌法选择numOfChromosome条染色体,种群中个体总数不变
    fitnessSum=sum(fitnessAll);
    fitnessProportion=fitnessAll/fitnessSum;
    % 使用随机数进行numOfChromosome次选择,保持种群中个体数量不变
    for i=1:numOfChromosome
        probability=rand(1);
        proportionSum=0;
        chromosomeIndex=1;
        for j=1:numOfChromosome
            proportionSum=proportionSum+fitnessProportion(j);
            if proportionSum>=probability
                chromosomeIndex=j;
                break;
            end
        end
        newPopulation(i,:)=lastPopulation(chromosomeIndex,:);
    end

计算每个个体适应度占总适应度的比例,总适应度是一个饼图,每个个体占据一定的扇形区域。

在这里插入图片描述

然后生成numOfChromosome个0-1的随机数,随机数落在哪个区域,哪个个体便被生存,可重复选择。

显然,适应度高的个体容易被选择,将自己的基因和表现型遗传下去。

2.5 配对交叉(单点)

    %% 将染色体进行配对,执行单点交叉
    lastPopulation=newPopulation;
    % 生成从1到numOfChromosome的无序排列,每两个相邻数字进行配对
    coupleAllIndex=randperm(numOfChromosome);
    for i=1:floor(numOfChromosome/2)
        coupleOneIndex=coupleAllIndex(2*i-1:2*i);
        % 定义两条染色体交叉的概率,自己选择
        probability=0.6;
        % 如果生成的随机数在交叉概率内,执行交叉操作
        if rand(i)<probability
            % 随机生成交叉的基因点,将两条基因进行交叉
            crossPosition=randi([1,numOfGene],1);
            newPopulation(coupleOneIndex(1),crossPosition:end)=lastPopulation(coupleOneIndex(2),crossPosition:end);
            newPopulation(coupleOneIndex(2),crossPosition:end)=lastPopulation(coupleOneIndex(1),crossPosition:end);
        end
    end

进行遗传的前提是配对,每两条染色体组合成一对,将两者的部分染色体进行交换。

单点交叉,顾名思义,选择染色体上的一个基因点,从这个基因点开始的两条染色体片段互换:

在这里插入图片描述

2.6 变异(基本位变异)

    %% 对每条染色体执行基本位变异操作
    lastPopulation=newPopulation;
    for i=1:numOfChromosome
        % 定义染色体变异的概率,自己选择
        probability=0.2;
        % 如果生成的随机数在变异概率内,执行变异操作
        if rand(1)<probability
            % 选择变异的位置
            mutatePosition=randi([1,numOfGene],1);
            % 将对应基因位置的二进制数反转
            if(lastPopulation(i,mutatePosition)==0)
                newPopulation(i,mutatePosition)=1;
            else
                newPopulation(i,mutatePosition)=0;
            end
        end
    end 

基本位变异就是选择一条染色体上的一个基因点,将其取反。

如染色体 11111111,选择其第四个基因进行基本位变异, 新染色体变为 11101111

2.7 获得最优解

%% 遗传迭代结束后,获得最优适应度值和对应的基因
fitnessBest=max(fitnessAll);
bestChromosome=newPopulation(find(fitnessAll==fitnessBest,1),:);

迭代结束之后,我们求出最大的适应度及其对应的染色体(个体),这就是我们需要的最优个体。

2.8 雪兔遗传结果

我们运行2.1给出的GA函数,在命令行输入以下代码运行:

[bestChromosome,fitnessBest]=GA(40,8,60)

40个染色体进行60次迭代。多次这行代码,发现结果可以不同,如下:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
虽然结果不尽相同,但都接近最优解128,这是遗传算法本身的局限,不一定能获得最优解。

2.9 改善遗传算法的方法

通过2.8我们知道,遗传算法有时候只能逼近最优解,那么有什么方法能让他达到更好的逼近效果呢?

这里有几个方案:

  1. 使用自适应遗传和变异概率
  2. 增加种群中个体数量
  3. 增大迭代次数
  4. 使用双点交叉法
  5. 采用多样的变异方法
  6. 更改编码方式(某些情况)
  7. 更换适应度函数,将个体适应度的差距拉大
  8. 更换选择方法,轮盘赌法是最基本的方法,不科学

大家可以自行了解,以后可能会继续就这几个方面探讨。

3. 多多交流!

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

经典遗传算法及MATLAB实例 的相关文章

  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • 以 2 为底的矩阵对数

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Numpy 相当于 MATLAB 的 hist [重复]

    这个问题在这里已经有答案了 由于某种原因 Numpy 的 hist 总是返回比 MATLAB 的 hist 少 1 个 bin 例如在 MATLAB 中 x 1 2 2 2 1 4 4 2 3 3 3 3 Rep Val hist x un
  • 获取向量幂的有效方法

    我编写了一个代码 在数值上使用勒让德多项式直至某个高 n 阶 例如 case 8 p 6435 x 8 12012 x 6 6930 x 4 1260 x 2 35 128 return case 9 如果向量x太长这会变得很慢 我发现说之
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • 如何在 MATLAB 编译的应用程序中运行外部 .m 代码? [复制]

    这个问题在这里已经有答案了 我有一个 MATLAB 项目 我使用 MCC 对其进行编译以获得单个可执行文件 然后我想知道外部程序员是否可以在 exe 中执行他的一些 m 文件 而无需重新编译整个项目 重点是提供一个应用程序 其他开发人员可以
  • 在 MATLAB 中绘图后恢复轴

    从文本文件绘制多种方法的输出后 未显示轴的右侧和上侧 我需要拥有它们并将它们加粗 就像当前的轴一样 绘制的数据来自存储每种方法数据的文件 每个数据文件都是一个 256x2 文件 包含 0 1 之间的值 第一列是精度 第二列是召回率 figu
  • 将向量(或弧)绘制到玫瑰图上。 MATLAB

    我有两个数据集 其中详细列出了angles 我正在绘制玫瑰图 angles 0 8481065519 0 0367932161 2 6273740453 n 另一个 从这组角度详细说明方向统计 angle error 0 848106563
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)

    我正在尝试使用概述的方法将 C 类包装在 matlab mex 包装器中here http www mathworks com matlabcentral newsreader view thread 278243 基本上 我有一个初始化
  • 在 Pari-GP 中嵌套特定递归

    每个人 我最初在 Stackexchange 上发布了类似的问题 它已移至此处 可以在链接中找到 在 Matlab 中声明函数递归序列 https stackoverflow com questions 67146061 declaring
  • 拟合具有扭曲时基的正弦波

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

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • 如何在matlab中使矩阵图平滑

    就像上图一样 怎样才能让画面更流畅呢 或者缩小y轴的范围 数据来自二维矩阵 然后我用plot data 请随意提出任何想法 平滑线条的一种方法涉及样本点之间数据的非线性插值 当你这样做时plot x y o http www mathwor
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • 将值从 C++ MEX 文件返回到 MATLAB

    我正在编写一个从 C 代码中检索数据的 MATLAB 程序 为此 我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction 虽然可以在 MATLAB 中读取读取值 但我无法检索它来使用它 如果不清楚 我有与这里完全相
  • 在 Matlab/Java 中将手部运动建模为 3D 曲线

    我只需要一些关于我遇到的问题 在哪里查看等的指导 我在我的一个项目中使用了运动跟踪手套 它返回每个手指和手掌的 X Y 和 Z 值 我想做的是首先根据这些坐标创建每个手指运动的表示 然后将它们每个附加到手掌的运动 以获得手的表示 一旦我完成
  • MATLAB - 从目录读取文件?

    我希望从目录中读取文件并对每个文件迭代执行操作 此操作不需要更改文件 我知道我应该为此使用 for 循环 到目前为止我已经尝试过 FILES ls path to folder for i 1 size FILES 1 STRU pdbre
  • 可以避免迭代元胞数组时的“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 业务
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac

随机推荐

  • Qt开发 — QProcess执行带管道的shell命令

    Qt开发 QProcess执行带管道的shell命令 简述 在嵌入式开发过程中 很容易遇到一些需要开辟新的进程 而新的进程里面又需要强制关闭父进程的操作 不如程序中需要读写SD卡 但是有时程序中又需要格式化SD卡 这就遇到问题 需要在SD卡
  • Netty实现UDP

    最近写的tcp和udp 以前经常写tcp 这次突然多一个udp 这次就献上udpserver的代码 import io netty bootstrap Bootstrap import io netty channel ChannelOpt
  • 上采样方式(反卷积、插值、反池化)

    目录 1 反卷积 1 正常卷积 2 反卷积 2 反池化 3 插值法 1 最近邻插值
  • 颜色的前世今生11·RGB显色系统详解(上)

    上一章讲完了拾色器的HSB模式 今天继续分解RGB模式 同理 RGB拾色器难的并不是软件界面本身 而是要理解RGB显色系统本身的原理 特点和局限性 才能心中有数 游刃有余 1 RGB色光加法色原理 人眼的视网膜有两种感光细胞 可以感应颜色细
  • vue2+element封装rules, 支持json多层级

    一 封装介绍 封装前景 表单内容多 表单类型重复且校验项较多 下面就参考element的例子写个实例 element地址 https element eleme cn 2 15 zh CN component form 实现效果如下 今天给
  • 适用于 Linux 的 Windows 子系统(WSL)安装指南

    目录 Windows Subsystem for Linux 一 WSL安装 1 启用 适用于Linux的Windows子系统 2 启用开发人员模式 3 安装UWP下Ubuntu LTS 4 启动子系统Linux 二 设置Windows T
  • 0.1 Redis安装

    1 Redis安装要求 64位Linux系统 Linux系统具备GCC编译环境 查看多少位 getconf LONG BIT 安装gcc环境 yum y install gcc c 查看gcc版本 gt 4 8 5版本 gcc v 2 安装
  • 个人代码笔记5——希尔排序

    1 背景 基于插入排序提出的更高效的方法 希尔排序 改善了插入排序因为元素顺序或个数而影响效率的问题 2 思路 希尔排序是先将元素分组 一般分成两组 然后各自插入排序 再合并 继续对折增量 分组并插入排序 再合并 如此重复 直到增量 lt
  • Redis入门学习的三个阶段10个知识点

    Redis入门学习有三个阶段8个模块 初识Redis 认识NoSQL 认识Redis 安装Redis Redis常见命令 5种常见数据结构 通用命令 不同数据结构的操作命令 Redis的Java客户端 Jedis客户端 SpringData
  • mac 安装 homebrew

    摘要 本文主要是下载安装包安装homebrew 然后配置环境变量Path 检验是否安装成功 homebrew地址 macOS 或 Linux 缺失的软件包的管理器 Homebrew 在终端命令下载安装 bin bash c curl fsS
  • 使用python进行数据提取和数据处理

    Whenever a dataset comes the first step is to extract data and manipulate it It is the most important part as it gives t
  • 组合预测模型

    组合预测模型 BO MLP贝叶斯优化多层感知机多输入单输出回归预测 Matlab程序 目录 组合预测模型 BO MLP贝叶斯优化多层感知机多输入单输出回归预测 Matlab程序 预测结果 评价指标 基本介绍 程序设计 参考资料 预测结果 评
  • 在Spring Boot应用程序中测试邮件代码

    在构建Spring Boot应用程序时 您可能会需要添加邮件配置 实际上 在Spring Boot中配置邮件与在Spring Bootless应用程序中配置邮件没有太大区别 但是 如何测试邮件配置和提交工作正常 我们来看一下 我假设我们有一
  • 面试经典(2)---删除特定字符

    题目 输入两个字符串 从第一字符串中删除第二个字符串中所有的字符 例如 输入 They are students 和 aeiou 则删除之后的第一个字符串变成 Thy r stdnts 分析 我们考虑如何在字符串中删除一个字符 由于字符串的
  • python学费多少-python培训学费是多少?

    Python当前的发展趋势非常好 随着大数据和人工智能的发展 Python应用程序将得到更广泛的应用 并且该领域有许多Python开发项目 越来越多的人开始学习Python 那么 python培训的学费是多少 Python以其优异的特性 适
  • openpose pytorch代码分析

    github https github com tensorboy pytorch Realtime Multi Person Pose Estimation 1 coding utf 8 2 import os 3 import re 4
  • 原型设计工具——axure认识与使用

    一 Axure认识 1 1 什么是Axure 发音 Ack sure Axure RP是一个专业的快速原型设计工具 是一个专业的快速原型设计工具 让负责定义需求和规格 设计功能和界面的专家能够快速创建应用软件或Web网站的线框图 流程图 原
  • 激活函数之softmax函数

    1 softmax函数 分类问题中使用的 softmax 函数可以用下面的式表示 exp x 是表示 ex 的指数函数 e 是纳皮尔常数 2 7182 式 3 10 表示假设输出层共有 n 个神经元 计算第 k 个神经元的输出 yk 如式
  • YOLO7 口罩识别实战

    文章目录 1 制作数据集 1 1 安装数据集制作工具 1 2 运行数据集制作工具 1 3 制作数据集 2 使用数据集 2 1 下载口罩数据集 2 2 分割数据集 2 3 数据集配置 3 训练模型 3 1 下载预训练模型 3 2 修改训练代码
  • 经典遗传算法及MATLAB实例

    经典遗传算法及简单实例 MATLAB 1 遗传算法简单介绍 1 1 理论基础 1 2 算法要点 1 1 编码 1 2 适应度函数 1 3 基本流程 2 代码实例 MATLAB 2 1 代码汇总 2 1 初始化种群 2 2 计算适应度 2 3