遗传算法(一) 遗传算法的基本原理

2023-11-03

遗传算法(一)遗传算法的基本原理

1.概述

遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。
相关概念:(高中所学)
基因型(genotype):性状染色体的内部表现;
表现型(phenotype):染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现;
进化(evolution):种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的。
适应度(fitness):度量某个物种对于生存环境的适应程度。
选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。
复制(reproduction):细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因。
交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;
变异(mutation):复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。
编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。
解码(decoding):基因型到表现型的映射。
个体(individual):指染色体带有特征的实体;
种群(population):个体的集合,该集合内个体数称为种群 的大小。

2.遗传算法的步骤

开始循环直至找到满意的解。

1.评估每条染色体所对应个体的适应度。

2.遵照适应度越高,选择概率越大的原则,从种群中选择两个个体作为父方和母方。

3.抽取父母双方的染色体,进行交叉,产生子代。

4.对子代的染色体进行变异。

5.重复2,3,4步骤,直到新种群的产生。

结束循环。
在这里插入图片描述在这里插入图片描述

3.遗传算法的具体过程

为了让讲解更为简便,我们先来理解一下著名的组合优化问题「背包问题」。

比如,你准备要去野游 1 个月,但是你只能背一个限重 30 公斤的背包。现在你有不同的必需物品,它们每一个都有自己的「生存点数」(具体在下表中已给出)。因此,你的目标是在有限的背包重量下,最大化你的「生存点数」。
在这里插入图片描述
3.1 初始化(编码)
这里我们用遗传算法来解决这个背包问题。第一步是定义我们的总体。总体中包含了个体,每个个体都有一套自己的染色体。

我们知道,染色体可表达为二进制数串,在这个问题中,1 代表接下来位置的基因存在,0 意味着丢失。(译者注:作者这里借用染色体、基因来解决前面的背包问题,所以特定位置上的基因代表了上方背包问题表格中的物品,比如第一个位置上是 Sleeping Bag,那么此时反映在染色体的『基因』位置就是该染色体的第一个『基因』。)

在这里插入图片描述
现在,我们将图中的 4 条染色体看作我们的总体初始值
3.2 编码补充
二进制编码
二进制编码由二进制符号0和1所组成的二值符号集。
格雷码
格雷码编码是其连续的两个整数所对应的编码之间只有一个码位是不同的,其余码位完全相同。
二进制码转为格雷码:异或运算:同则为0,异则为1。
浮点编码法
二进制编码虽然简单直观,但明显地。但是存在着连续函数离散化时的映射误差。个体长度较短时,可能达不到精度要求,而个体编码长度较长时,虽然能提高精度,但增加了解码的难度,使遗传算法的搜索空间急剧扩大。
所谓浮点法,是指个体的每个基因值用某一范围内的一个浮点数来表示。编码长度等于决策变量的个数。 在浮点数编码方法中,必须保证基因值在给定的区间限制范围内,遗传算法中所使用的交叉、变异等遗传算子也必须保证其运算结果所产生的新个体的基因值也在这个区间限制范围内。
符号编码法
符号编码法是指个体染色体编码串中的基因值取自一个无数值含义、而只有代码含义的符号集如{A,B,C…}。

3.3 适应度函数
接下来,让我们来计算一下前两条染色体的适应度分数。对于 A1 染色体 [100110] 而言,有:
在这里插入图片描述
类似地,对于 A2 染色体 [001110] 来说,有:
在这里插入图片描述
对于这个问题,我们认为,当染色体包含更多生存分数时,也就意味着它的适应性更强。因此,由图可知,染色体 1 适应性强于染色体 2。

3.4 选择
现在,我们可以开始从总体中选择适合的染色体,来让它们互相『交配』,产生自己的下一代了。这个是进行选择操作的大致想法,但是这样将会导致染色体在几代之后相互差异减小,失去了多样性。因此,我们一般会进行「轮盘赌选择法」(Roulette Wheel Selection method)。

想象有一个轮盘,现在我们将它分割成 m 个部分,这里的 m 代表我们总体中染色体的个数。每条染色体在轮盘上占有的区域面积将根据适应度分数成比例表达出来。在这里插入图片描述
基于上图中的值,我们建立如下「轮盘」。
在这里插入图片描述
现在,这个轮盘开始旋转,我们将被图中固定的指针(fixed point)指到的那片区域选为第一个亲本。然后,对于第二个亲本,我们进行同样的操作。有时候我们也会在途中标注两个固定指针,如下图:
在这里插入图片描述
通过这种方法,我们可以在一轮中就获得两个亲本。我们将这种方法成为「随机普遍选择法」(Stochastic Universal Selection method)。

3.5 交叉
在上一个步骤中,我们已经选择出了可以产生后代的亲本染色体。那么用生物学的话说,所谓「交叉」,其实就是指的繁殖。现在我们来对染色体 1 和 4(在上一个步骤中选出来的)进行「交叉」,见下图:
在这里插入图片描述
这是交叉最基本的形式,我们称其为「单点交叉」。这里我们随机选择一个交叉点,然后,将交叉点前后的染色体部分进行染色体间的交叉对调,于是就产生了新的后代。

如果你设置两个交叉点,那么这种方法被成为「多点交叉」,见下图:
在这里插入图片描述
3.6变异
如果现在我们从生物学的角度来看这个问题,那么请问:由上述过程产生的后代是否有和其父母一样的性状呢?答案是否。在后代的生长过程中,它们体内的基因会发生一些变化,使得它们与父母不同。这个过程我们称为「变异」,它可以被定义为染色体上发生的随机变化,正是因为变异,种群中才会存在多样性。

下图为变异的一个简单示例:
在这里插入图片描述
变异完成之后,我们就得到了新为个体,进化也就完成了,整个过程如下图:
在这里插入图片描述
在进行完一轮「遗传变异」之后,我们用适应度函数对这些新的后代进行验证,如果函数判定它们适应度足够,那么就会用它们从总体中替代掉那些适应度不够的染色体。这里有个问题,我们最终应该以什么标准来判断后代达到了最佳适应度水平呢?

一般来说,有如下几个终止条件: 1. 在进行 X 次迭代之后,总体没有什么太大改变。 2. 我们事先为算法定义好了进化的次数。 3. 当我们的适应度函数已经达到了预先定义的值。

例子:
在这里插入图片描述
matlab:

%Generic Algorithm for function f(x1,x2) optimum
clear all;
close all;

%Parameters
Size=80;     %群体大小
G=100;       %终止进化代数
CodeL=10;  
 
umax=2.048;
umin=-2.048;

E=round(rand(Size,2*CodeL));    %Initial Code

%Main Program
for k=1:1:G
    
    time(k)=k;
    
    for s=1:1:Size
        m=E(s,:);
        y1=0;y2=0;
        
        %Uncoding 解码
        m1=m(1:1:CodeL);
        for i=1:1:CodeL
           y1=y1+m1(i)*2^(i-1);
        end
        x1=(umax-umin)*y1/1023+umin;
        m2=m(CodeL+1:1:2*CodeL);
        for i=1:1:CodeL
           y2=y2+m2(i)*2^(i-1);
        end
        x2=(umax-umin)*y2/1023+umin;
        
        F(s)=100*(x1^2-x2)^2+(1-x1)^2;    % F(x1,x2)
    end
    
    Ji=1./F;     %选个体适应度的倒数作为目标函数

    %****** Step 1 : Evaluate BestJ ******
    BestJ(k)=min(Ji);
    
    fi=F;                          %Fitness Function
    [Oderfi,Indexfi]=sort(fi);     %Arranging fi small to bigger
    Bestfi=Oderfi(Size);           %Let Bestfi=max(fi)
    BestS=E(Indexfi(Size),:);      %Let BestS=E(m), m is the Indexfi belong to max(fi)
    bfi(k)=Bestfi;
    
    %****** Step 2 : Select and Reproduct Operation******
       fi_sum=sum(fi);
       fi_Size=(Oderfi/fi_sum)*Size;
       
       fi_S=floor(fi_Size);        %Selecting Bigger fi value
       
       kk=1;
       for i=1:1:Size
          for j=1:1:fi_S(i)        %Select and Reproduce 
           TempE(kk,:)=E(Indexfi(i),:);  
             kk=kk+1;              %kk is used to reproduce
          end
       end
       
    %************ Step 3 : Crossover Operation ************
    pc=0.60;
    n=ceil(20*rand);
    for i=1:2:(Size-1)
        temp=rand;
        if pc>temp                  %Crossover Condition
        for j=n:1:20
            TempE(i,j)=E(i+1,j);
            TempE(i+1,j)=E(i,j);
        end
        end
    end
    TempE(Size,:)=BestS;
    E=TempE;
       
    %************ Step 4: Mutation Operation **************
    %pm=0.001;
    %pm=0.001-[1:1:Size]*(0.001)/Size; %Bigger fi, smaller Pm
    %pm=0.0;    %No mutation
    pm=0.1;     %Big mutation
    
       for i=1:1:Size
          for j=1:1:2*CodeL
             temp=rand;
             if pm>temp                %Mutation Condition
                if TempE(i,j)==0
                   TempE(i,j)=1;
                else
                   TempE(i,j)=0;
                end
            end
          end
       end
       
    %Guarantee TempPop(30,:) is the code belong to the best individual(max(fi))
    TempE(Size,:)=BestS;
    E=TempE;
end
 
Max_Value=Bestfi
BestS
x1
x2
figure(1);
plot(time,BestJ); 
xlabel('Times');ylabel('Best J');
figure(2);
plot(time,bfi);
xlabel('times');ylabel('Best F');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

遗传算法(一) 遗传算法的基本原理 的相关文章

  • MATLAB 编译器与 MATLAB 编码器

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

    Logm 取矩阵对数 并且log2 取矩阵每个元素以 2 为底的对数 我正在尝试计算冯 诺依曼熵 它涉及以 2 为底的矩阵对数 我该怎么做呢 如果将 以 2 为底 的矩阵指数定义为B expm log 2 A 或者如果您类似地通过特征分解直
  • Matlab的导入函数的范围是什么?

    我正在尝试将一些用 Matlab 编写的代码转换为独立的 编译的 Matlab 应用程序 然而 在出现一些奇怪的错误之后 我意识到代码大量使用了从路径中添加和删除的操作 以避免多次使用多个具有相同名称 但结果 计算不同 的函数这一事实 环顾
  • Ilnumerics Ilpanel 在 winform 中编译成 dll 并加载到 matlab 时不激活

    我想将 Visual studio 2012 中用 C 编写的 winform 编译为 dll 然后将其加载到 matlab 2013a 中 然后 我想使用 matlab net 接口与 winform 进行交互 侦听其事件并通过一组预定义
  • FMINCON 的替代方案

    除了 fmincon 之外还有其他更快 更高效的求解器吗 我正在使用 fmincon 来解决特定问题 但对于中等大小的向量变量来说 我的内存不足 我也没有任何超级计算机或云计算选项可供使用 我知道任何替代解决方案仍然会耗尽内存 但我只是想看
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • 使用简单矩阵乘法时出错

    我在一次简单的乘法运算中偶然发现了一个错误 这让我感到非常惊讶 我一直以为这里发生了什么 只为矩阵乘法 http www mathworks nl help matlab matlab prog operators html x 2 y z
  • matlab 中的动画绘图

    我正在尝试创建一个三角形的动画图 最终结果应该是十个三角形 后面跟着两个更大的三角形 后面跟着一条直线 使用matlab文档 https de mathworks com help matlab ref drawnow html 我最终得到
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • 通过颜色渐变修补圆

    我正在尝试绘制一个颜色渐变 我希望它沿轴均匀 在下图由角度定义的情况下 pi 7 当我使用patch命令 绘图与所需的梯度方向匹配 但沿其方向并不均匀 沿圆的点之间形成各种三角形 这是代码 N 120 theta linspace pi p
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • Mathworks 生成 Matlab HTML 文档的方法是什么?

    我正在开发共享的 Matlab 代码 我们希望在本地网络中将生成的文档作为可搜索的 HTML 文档共享 我知道以下生成文档的方法 编写一个类似于 C 文件的转换器 这是在中完成的将 Doxygen 与 Matlab 结合使用 http ww
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • 如何从 Matlab 运行 R 脚本 [重复]

    这个问题在这里已经有答案了 我有 m 文件 我想用它来运行 R 脚本 我怎样才能做到这一点 Matlab文件 caller m some matlab code need to call a R script some matlab cod
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • 在 Matlab/Java 中将手部运动建模为 3D 曲线

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

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • MATLAB - 从目录读取文件?

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

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

随机推荐

  • 提升周末休息体验感的方法

    工作以后常常容易感到疲于奔命 即使在周末也没有得到高质量的休息 打工人 学生党如何过周末 你有哪些延长周末和下班时间的好方法吗 文章目录 周末休息之我见 提升周末体验的方法 精神休息方法 肉体休息方法 总结 周末休息之我见 在我看来 提升周
  • Android Studio 记事本

    1 目录结构 Text Database是对SQLite的数据进行增删该查 MainActivity中主要实现了长按后上下文菜单的弹出 实现删除功能 跳转到其他的Activity等 Add Text实现对文本的增加 textBean对文本的
  • goland编译部署linux,使用Goland写代码,最后如何在Centos7Linux环境下去部署运行?...

    前言 Go语言入门菜鸡 一直在用Goland写代码 因为vim配置Go的开发环境简直不要太难 放弃了 一直很困惑 我如何在Windows下编写代码 然后再拿去Linux下去部署运行 原来一直以为需要把代码弄过去 然后编译 运行 不懂得交叉编
  • arcgis如何统计一定区域内的数值的平均值、最小值、最大值

    根据以下帖子整理 https www cnblogs com tiandi p 7648417 html https blog csdn net lijie45655 article details 49132437 https blog
  • 利率上浮100bp是什么意思,利率浮动值60BP什么意思

    LPR利率 123BP 是什么概念 1 LPR意思是利率 BP的意思是基点 一个基点为0 01 如果利率是4 8 那么LPR利率 123BP的概念是4 8 1 23 6 03 2 用户在办理贷款时不同的银行给出的加点数不同 这时可以选择低的
  • FCRA考试答案100分

    2022 02 26考试后整理了正确答案 判断题共21题 1 在报表设计好后 在所有浏览器下显示的样式都是一模一样的 错误 2 可以不用设置重复标题行或列而直接设置分页预览下的冻结行和列 错误 3 在帆软认证体系中 FCRA等级比FCRP等
  • OLED透明屏:如何选择合适的OLED透明屏供应商?定制、安装、生产

    引言 OLED透明屏作为一种创新的显示技术 正逐渐占领市场并在各个行业中得到广泛应用 在这篇文章中 尼伽将为您提供OLED透明屏的品牌排名 制造过程和安装要点的综合指南 结合相关调查数据和报告 详细介绍该技术的优势和前景 一 OLED透明屏
  • 网络安全开篇

    WAS Web Application Security OWASP Open Web Application Security Project OWASP Top10 这是每年的一份关于web应用的十大威胁安全报告 会在经过安全专家的测验
  • 两个数组的交集、有效的完全平方数、字符串中的第一个唯一字符

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 百日刷题计划 第 14 100 天 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 位于半山腰的
  • unity全免费下载资源网站

    www unityfly com unity项目源代码插件模型场景免费资源学习分享 unity爱心飞扬下载站 本站建立的初心是 为兄弟姐妹们 学习unity游戏应用开发 免费提供便利和支持 欢迎光临本站
  • Java几种常见的设计模式

    本文来自 旭日Follow 24 的CSDN 博客 全文地址请点击 https blog csdn net xuri24 article details 81106656 utm source copy 一 单例模式 基本概念 保证一个类仅
  • 关于在Idea调试的时如何显示16进制的处理

    关于在Idea调试的时如何显示16进制的处理 右击字节数组 然后选择 View as 再选择 Create 添加对byte 的处理 给个名称 并给个表达式 处理表达式如下 int len this length StringBuilder
  • 悦起无盘客户端怎么连服务器,Staxel怎么联机 直连以及服务器连接教程

    手机游戏自身是适用联网一起玩的 不如说是联网才有趣 假如你不清楚怎样联网得话 看一下大家为大伙儿产生的Staxel怎么联机的实例教程吧 手机游戏自身是适用联网一起玩的 不如说是联网才有趣 假如你不清楚怎样联网得话 看一下大家为大伙儿产生的S
  • CSS核心使用

    CSS核心使用 box sizing box shdow text shadow position writing mode box sizing 定义计算一个元素的总高度和总宽度 属性值 content box 默认值 width 内容宽
  • PHP面向对象

    static静态关键字 声明类特点和办法为静态 不能够经过类的实例直接拜访 类的静态特点不能经过 gt 直接拜访 能够经过 o b j obj obj name来拜访 静态办法能够经过类的实例来拜访
  • RGB与YCBCR转换及代码

    一 目的意义 在某些图像 视频中 经过一些图像处理之后 计算机对于处理后的图像仍然不能直白的检测出所需要的信息 这时候需要对某类色彩进行处理 使得所需要的信息更能直观的在处理后的图像显示出来 二 RGB YCBCR简介及公式转化 RGB R
  • 嘉立创的PCB外形规则解读

    终极标准 某D系列软件外形层及非金属化孔及槽的标准及规范 对于大部分用某D设计的工程师都是乱用KEEPOUT层及机械层 导致PCB工厂CAM工程师傻傻的分不清 造成漏开或多开非金属化孔及非金属化槽的现象时有发生 特此确定以下标准 如果标准相
  • OAM协议详解

    原文地址 https blog csdn net xinyuan510214 article details 79218004
  • CLIP论文解读

    文章目录 问题 方法 自然语言监督 数据集 有效预训练方法 模型选择 实验 Zero Shot Transfer 结论 论文 Learning Transferable Visual Models From Natural Language
  • 遗传算法(一) 遗传算法的基本原理

    遗传算法 一 遗传算法的基本原理 1 概述 遗传算法 Genetic Algorithm GA 起源于对生物系统所进行的计算机模拟研究 它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法 借鉴了达尔文的进化论和孟德尔的遗传学说 其本