遗传算法(附简单案例及matlab详细代码)

news2024/11/27 4:22:47

在这里插入图片描述

作者:非妃是公主
专栏:《智能优化算法》
博客地址:https://blog.csdn.net/myf_666
个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩
在这里插入图片描述

文章目录

专栏推荐

专栏名称专栏地址
软件工程专栏——软件工程
计算机图形学 专栏——计算机图形学
操作系统专栏——操作系统
软件测试专栏——软件测试
机器学习专栏——机器学习
数据库专栏——数据库
算法专栏——算法

遗传算法也是一种效果很棒的智能优化算法,它主要借鉴了自然界中生物进化的思想,采用优胜劣汰的策略,利用选择、交叉、变异三个过程,对解进行不断的迭代,最终趋向于最优解。


一、生物进化

谈到遗传算法,不得不谈生物进化,因为遗传算法就是模仿生物繁殖后代的思想演变而来的,可以说是一种仿生学的算法。

自然选择学说认为,适者生存,生物想要存活下去,就必须进行生存斗争。生存斗争包括种内、种间以及生物和环境之间的斗争三个方面。

在斗争过程中,具有有利变异的个体容易存活下来,并且有更多的机会将有利变异传递给后代;具有不利变异的个体就容易被淘汰,产生后代的机会也就少得多。因此,凡是在生存斗争中获胜的个体都是对环境适应性比较强的个体。达尔文把这种在生存斗争中适者生存,不适者淘汰的过程叫做自然选择。1


二、遗传算法原理

而遗传算法就是借鉴了上述生物进化中的优化策略,对一个目标问题进行优化的。

具体地说,它将问题的解抽象成一个编码,许多个编码构成了一个种群,每个编码都对应得到目标问题的一个解,其中根据可行解的目标函数值的不同,定义这个个体的强弱。越强的个体越容易生存下来(选择),进行后代的繁衍(交叉、变异),越弱的个体就优先被淘汰。

生物进化中的术语遗传算法中的术语
群体可行解集
个体可行解
染色体可行解的编码
基因可行解编码中的一位(1个bit)
适应度评价函数值(越高,代表解越好)
选择选择操作(比如根据概率进行轮盘赌选择可行解)
交叉交叉操作(编码的单点交叉、多点交叉)
变异变异操作(编码的按位取反)

三、遗传算法的优点

  1. 以决策变量的编码作为运算对象。这种编码的方式对于计算机来求解十分方便,具有独特的优越性。
  2. 遗传算法以目标函数值作为搜索信息,避免了求导。在很多问题中,求导是无法做到的或者很困难做到的。
  3. 选择、交叉、变异操作包括了很多群体信息。这些信息避免搜索了许多的点,相当于具有一种隐含的并行性。
  4. 遗传算法基于概率。随着过程的进化,参数对搜索结果的影响很小很小。
  5. 具有自组织、自适应、自学习等特性。

四、算法具体流程

1. 整体流程

  1. 初始化;
  2. 个体评价;
  3. 选择运算;
  4. 交叉运算;
  5. 变异运算;
  6. 终止条件判断。

流程图如下:

no
yes
初始化种群
适应度评价
是否结束
选择运算
交叉运算
变异运算
结束

2. 细节处理

Ⅰ. 群体规模 N P NP NP

群体规模影响遗传优化的最终结果以及遗传算法的执行效率。一般 NP取10~200。

  • N P NP NP 太小时,遗传优化效果(相比于最优解准确度)一般不会太好。
  • 较大的群体规模可以减小陷入局部最优解的概率,但意味着较大的计算复杂度。

Ⅱ. 交叉概率 P c P_c Pc

交叉概率 P c P_c Pc控制着交叉操作的频率,较大的频率可以曾倩遗传算法开辟新的搜索区域的能力。

  • 如果太大,容易生成不好的后代,收敛性差;
  • 如果太小,搜索能力差。

Ⅲ. 变异概率 P m P_m Pm

保持群体多样性。一般去0.001~0.1

  • 太大,容易陷入随机搜索,导致重要基因丢失。
  • 太小,没有效果。

3. 遗传运算终止代数 G G G

一般视具体问题而定,取值可在 100~1000 之间。

  • 太大,浪费算力,种群衰退。
  • 太小,优化过程没有收敛。

五、仿真实例:求解函数最大值

1. 题目

用标准遗传算法求函数 f ( x ) = x + 10 s i n ( 5 x + 7 c o s ( 4 x ) f( x ) =x+10sin(5x +7cos(4x) f(x)=x+10sin(5x+7cos(4x)的最大值,其中的取值范围为 [ 0 , 10 ] [0,10] [010]


2. 分析

通过matlab作图可知,该函数存在多个局部极值,如下图所示:
在这里插入图片描述

  1. 初始化种群NP=50,染色体编码长度L=20,最大进化代数G=50,交叉概率为 P c = 0.8 P_c=0.8 Pc=0.8,变异概率为 P m = 0.1 P_m=0.1 Pm=0.1
  2. 产生初始种群,将二进制编码转换成十进制,计算个体适应度值,并进行归一化;采用基于轮盘赌的选择操作、基于概率的交叉和变异操作产生新的种群,并把历代的最优个体保留在新种群中,进行下一步的遗传操作。
  3. 判断是否满足终止条件。满足,结束;不满足,继续迭代。

3. matlab求解

matlab求解代码如下,其中主要思路及较为复杂的点,已在注释中说明。

%%%%%%%%%%%%%%%%%%%%标准遗传算法求函数极值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all;              %清除所有变量
close all;              %清图
clc;                    %清屏
NP=50;                  %种群数量
L=20;                   %二进制数串长度
Pc=0.8;                 %交叉率
Pm=0.1;                 %变异率
G=100;                  %最大遗传代数
Xs=10;                  %上限
Xx=0;                   %下限
f=randi([0,1],NP,L);        %随机获得初始种群
finalMax=0;
finalXBest=0;
%%%%%%%%%%%%%%%%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G % 跌代的总代数
    %%%%%%%%%%%%将二进制解码为定义域范围内十进制%%%%%%%%%%%%%%
    for i=1:NP    % 遍历所有个体
        U=f(i,:); % 将第 i 个个体读取出来
        m=0;      % 存储的二进制对应的十进制数字
        for j=1:L % 按位把二进制转化为十进制
            m=U(j)*2^(j-1)+m;
        end
        x(i)=Xx+m*(Xs-Xx)/(2^L-1); % 把十进制数字m转换到对应的定义域内
        Fit(i)= func1(x(i));       % 计算适应度函数
    end
    maxFit=max(Fit);           %最大值

    minFit=min(Fit);           %最小值
    rr=find(Fit==maxFit);      %找出最优个体的下标索引
    fBest=f(rr(1,1),:);        %当代最优个体的二进制编码
    xBest=x(rr(1,1));          %当代最优个体对应的十进制值
    if maxFit>finalMax
        finalMax=maxFit;
        finalXBest=xBest;
    end
    Fit=(Fit-minFit)/(maxFit-minFit);  %归一化适应度值
    %%%%%%%%%%%%%%%%%%基于轮盘赌的选择操作%%%%%%%%%%%%%%%%%%%
    sum_Fit=sum(Fit);          %对所有个体的适应度进行一个求和
    fitvalue=Fit./sum_Fit;     %让所有个体加起来适应度值为1,便于进行概率计算
    fitvalue=cumsum(fitvalue); %consum是累加当前索引及以前的索引对应的值,比如[1 2 3],consume后返回[1 3 6]
    ms=sort(rand(NP,1));       %生成一个NP * 1的向量,并从小到大排序,轮盘赌的关键操作。(均匀分布)
    fiti=1;
    newi=1;
    while newi<=NP                   % 这个while循环是轮盘赌的精髓,如果适应度(存活概率)越大的个体,随机数越容易连续着比他小
        if (ms(newi))<fitvalue(fiti) % 优胜个体,多复制几个
            nf(newi,:)=f(fiti,:);    % 复制
            newi=newi+1;             % 新个体计数+1
        else                         % 劣汰个体,少复制或者干脆直接跳过去
            fiti=fiti+1;
        end
    end   
    %%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%
    for i=1:2:NP               % 此处步长为2,主要是相邻两个个体进行交叉
        p=rand;                % 生成一个随机数
        if p<Pc                % 以Pc的概率进行交叉
            q=randi([0,1],1,L);% 随机生成一个交叉序列,0位不变异,1位变异
            for j=1:L
                if q(j)==1     % 交叉的基因,不交叉的基因直接跳过
                    temp=nf(i+1,j);
                    nf(i+1,j)=nf(i,j);
                    nf(i,j)=temp;
                end
            end
        end
    end
    %%%%%%%%%%%%%%%%%%%基于概率的变异操作%%%%%%%%%%%%%%%%%%%%%%%
    i=1;
    while i<=round(NP*Pm)
        h=randi([1,NP],1,1);      %随机选取一个需要变异的个体(染色体)
        for j=1:round(L*Pm)       %Pm是变异概率,L * Pm四舍五入得到变异的基因数量
            g=randi([1,L],1,1);   %随机需要变异的基因数
            nf(h,g)=~nf(h,g);
        end
        i=i+1;
    end
    f=nf;                           %更新种群
                                    %由于轮盘赌选择的时候,在前面的个体更容易被选中,
    f(1,:)=fBest;                   %如果最优个体在后面,则不一定被选中,这步操作是要保留最优个体(二进制)在新种群中
    trace(k)=maxFit;                %历代最优适应度
end
xBest                               %最后一代最优个体
finalXBest                          %最优个体
figure
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')

其中目标函数(适应度函数)的定义如下:

%%%%%%%%%%%%%%%%%%%%%%%%%适应度函数%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function result=func1(x)
fit= x+10*sin(5*x)+7*cos(4*x);
result=fit;

4. 求解结果及分析

可以看到,遗传算法的收敛速度较快,如下:

在这里插入图片描述

同时,遗传算法收敛性很棒的特点,经过多次测试,最后一代的最优个体就是所有代中的最优个体,即:在该问题中种群没有发生退化,导致目标函数出现震荡的现象。

在这里插入图片描述


六、遗传算法的一些改进方向

在现有文献中,对遗传算法的改进主要集中在以下方面:编码机制(如何编码(转化问题))、选择策略(怎么去选择?)、交叉算子(怎么交叉?)、变异算子(怎么变异)、特殊算子和参数设计。

每一个遗传算法的应用都要涉及到上述问题,上面的案例代码中包含了这些方面一种解决办法,当然,后续的改进还有许多。

此外,还存在着和差分进化算法、免疫算法、蚁群算法等结合起来的混合遗传算法,可以综合遗传算法和其它算法的优点,提高效率和求解质量。2

the end……

遗传算法到这里就要结束啦~~到此既是缘分,欢迎您的点赞评论收藏关注我,不迷路,我们下期再见!!

😘😘😘 我是Cherries,一位计算机科班在校大学生,写博客用来记录自己平时的所思所想!
💞💞💞 内容繁杂,又才疏学浅,难免存在错误,欢迎各位大佬的批评指正!
👋👋👋 我们相互交流,共同进步!

:本文由非妃是公主发布于https://blog.csdn.net/myf_666,转载请务必标明原文链接:https://blog.csdn.net/myf_666/article/details/129166215


  1. 百度百科——自然选择 ↩︎

  2. 包子阳,智能优化算法及其matlab实例.电子工业出版社. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/608092.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为OD机试真题 Java 实现【按身高和体重排队】【2022Q4 100分】,附详细解题思路

一、题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b; 对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生…

全闪SDS三节点EC(4+2:1)性能挑战测试

前段时间咱们存储圈在讨论一下全闪SDS性能挑战&#xff1a; 三节点集群&#xff0c;用EC&#xff08;42:1&#xff09;&#xff0c;性能目标是&#xff1a;4KB随机读写7:3&#xff0c;达到100万IOPS&#xff0c;平均时延0.5ms&#xff0c;P99时延1ms。硬件配置&#xff1a;网络…

菜鸟的刷题之路之二叉树

&#x1f495;“成功不是终点&#xff0c;失败不是终结&#xff0c;勇气才是启程的第一步。”&#x1f495; &#x1f43c;作者&#xff1a;不能再留遗憾了&#x1f43c; &#x1f386;专栏&#xff1a;菜鸟的刷题之路&#x1f386; &#x1f697;本文章主要内容&#xff1a;将…

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程&#xff08;带证书&#xff09; 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录&#xff0c;并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它&#xff0c;运行下面的命令&#xff1a; sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节&#xff08;Byte&#xff09;等于8个二进制位&#xff08;bit&#xff09;。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位&#xff0c;可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…

深入理解Jar文件:创建、使用和多版本控制

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f35b; 一、创建JAR文件 &#x1f35c; 二、安装和使用清单文件 &#x1f35d; 三、创建可执行的JAR文件 &#x1f360; 四、多版…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

近年GDC服务器分享合集(三): 《Sky光·遇》实现百万在线:一种云原生的扩容方法

如今&#xff0c;游戏行业对于云原生技术的使用越来越广泛。特别是那些拥有海量玩家在线的游戏&#xff0c;使用云原生技术可以轻松做到高可用、弹性扩容和降低成本。在GDC 2022上&#xff0c;来自《Sky光遇》项目的工程师分享了相关的经验——《《Sky光遇》实现百万在线&#…

黑马Redis视频教程高级篇(一:分布式缓存)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …

基于springboot汽车站车辆运管系统java+vue

本汽车站车辆运管系统管理员可以管理个人中心&#xff0c;业务管理&#xff0c;站务管理&#xff0c;人力资源管理&#xff0c;办公司管理&#xff0c;财务管理。因而具有一定的实用性。本站是一个B/S模式系统&#xff0c;采用springboot框架&#xff0c;MYSQL数据库设计开发&a…

模型的细分和简化

​ 细分 本质为引入更多三角形 loop细分 对于新的顶点如何计算&#xff1a;下图中白点位置计算 对于旧的顶点位置计算 Catmull-Clark细分 对于非四边形的图形细分方法&#xff1a;不断将非四边形进行细分即可 下图中橙色&#xff1a;非四边形面的重心坐标&#xff1b;紫色&…

程序员必须了解的消息队列之王-Kafka

1. Kafka概述 1.1 定义 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台。 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 1.2.2 为什…

路径规划算法:基于共生生物优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于共生生物优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于共生生物优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

深度相机和彩色相机对齐(d2c)

一般商用的rgbd相机的sdk自带d2c的api&#xff0c;但是LZ还是想利用空闲时间理解下其原理。 第一步&#xff1a;标定彩色相机和深度相机。 分别采集若干张彩色摄像头和红外摄像头&#xff08;对于带有红外摄像头进行深度测量的深度摄像头&#xff0c;红外摄像头和深度摄像头其实…

mysql ssh隧道连接内网mysql

通过SSH隧道连接MySQL数据库 一.背景 问题所在&#xff1a;MySQL被运用于越来越多的业务中&#xff0c;在关键业务中对数据安全性的要求也更高&#xff0c;数据安全如果只靠MySQL应用层面显然是不够的&#xff0c;虽然说MySQL实现的登录机制基本不存在泄露密码的风险&#xf…