基于遗传算法求函数最大值

这篇具有很好参考价值的文章主要介绍了基于遗传算法求函数最大值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先说一下作业题目:

基于遗传算法求函数最大值

 文章来源地址https://www.toymoban.com/news/detail-473746.html

基于遗传算法求函数最大值

设定求解精确到2位小数,种群规模: 50,最大进化代数: 150,交叉概率: Pc=0.25,变异概率: Pm=0.01 。

本次算法编程思想来源于http://t.csdn.cn/7wsRq。主要是理解遗传算法的设计过程。遗传算法的进化过程类似一个物种的进化过程,寻找函数最大值的过程就是寻找种群中的最优个体的过程。本题使用二进制位串编码方式,位串模拟自然界中的染色体,位串中的每一位模拟自然界中的基因,如长度为9的位串111001010代表一条染色体,其1或0代表该染色体上的基因位。选择、交叉、变异操作就是建立在基因和染色上的。

接下来进入正题:

(1)首先是进行数据准备:

 根据题目要求设置初始种群大小为NP=50,即含有50个个体或50条染色体。最大迭代次数G=150选取位串长度为L=9(位串长度和精度有关),即每条染色体的基因个数。变异概率Pm=0.01,则对于该种群总共有NP×Pm=50×0.01=0.5条染色体可能发生变异,对于每条染色体总共有L×Pm=9×0.01=0.09个基因可能发生变异,即该种群没有染色体发生变异,这可能会降低种群进化的多样性,导致无法获取全局最优解,后面会说到这个问题。

(2)选择:采用随机的方法获取初始种群,再采用轮盘赌的方法选择优良个体,过程如下:

首先,将每个染色体的二进制转换为十进制数m,再将m映射到自变量区间[-1,2]上,然后将目标函数作为适应度函数,求出该染色体的适应度值,重复操作求出上一代种群每个个体的适应度值;

接着,先对适应度值进行归一化处理(防止适应度值之间相差过大导致物种多样性的降低),再对群体的适应度值求和,然后分别求出每个染色体的适应度值比例,即被选择的概率。为了编程方便,将选择概率逐个累加起来,比如染色体1的选择概率为P1=0.12,染色体2的选择概率P2=0.13,依次P3=0.14,则P1=P1=0.12,P2=P1+P2=0.25,P3=P1+P2=0.25+0.14=0.39,依次进行。

然后,随机生成NP行1列的(0,1)范围内的随机数组ms模拟旋转概率,并按升序的方式排列。

再然后,保留被选择下来的新一代染色体nf,保留方式为:当ms随机数数组中第newi个随机小数小于适应度第fiti个累计值时,保留该染色体,否则,淘汰该染色体,进入下一个染色体的选择。

最后,重复选择操作,得出新一代染色体。

其映射方式如下:

x=Xx+m*(Xs-Xx)/(2^L-1)

其中,Xx=-1,表示自变量范围的下限;Xs=2,表示自变量范围的上限;m,表示二进制位串的十进制转换数值;L=9,表示二进制位串长度。

转换十进制和映射代码如下:

基于遗传算法求函数最大值

基于遗传算法求函数最大值

(3)交叉

第一步是将选择产生的匹配池中的成员随机两两匹配;第二步是进行交叉繁殖,具体过程如下:首先,随机生成一个(0,1)之间的小数p;然后,将其与交叉概率Pc比较,若p<Pc,则随机生成一条新的染色体q,当q中的基因位为1时,交换匹配对染色体对应的基因位,为0时则不交换。例如染色体A=010111010,B=101011011,q=010010001,则交换之后的A=000111011,B=111011010;最后,得出交叉后的新一代染色体。

(4)变异

由于本题没有变异串位,故省去此操作。但观察结果会发现,没有变异的进化降低了种群多样性,导致过早收敛。而在提升了变异概率之后(例如设变异概率为0.1),种群能得到全局收敛的结果。这里简述一下变异过程如下:首先,得到需要变异的染色体数NP*Pm=0.1*50=5;然后,随机选择一条需要变异的染色体,并计算需要变异的染色总共进行变异的基因位L*Pm=10*0.1=1;然后,再随机选取需要变异的基因序号,并对该基因位取反;最后,重复操作直到所有需变异的染色体中待变异的基因位完后变异得到新一代种群为止。

结果如下:首先,我们将目标函数的图像绘制出来并得到目标函数的最大值为3.8500。

基于遗传算法求函数最大值

然后,按照题目要求,设置变异率为0.01,得出的最大值点为(1.65,3.64),可见与实际最大值3.85有误差,这是由于变异率过低,丧失了变异功能,使多样性下降,导致收敛到局部极值的效果,该迭代次数只进行到第9次,其图示结果如下:

基于遗传算法求函数最大值

基于遗传算法求函数最大值

最后,改变变异概率并令Pm=0.1后,得到的函数最大值点为(1.85,3.85),实际目标函数最大值为3.8500,这里我们发现,当设置位串长度为L=9时,得到的最大值点为(1.8532,3.8437),相比较位串长度为L=10时,误差更大。这是由于位串长度在一定范围内越大,插值点越密,所得到的结果精度越高,当位串长度达到一定值后再增加,提高精度的效果微乎其微,但是会增加计算的复杂性,降低计算效率,因此,在满足精度要求下尽可能取小的L最合适,本题在多次调整参数L下,得到当L=10时是最合适的二进制位串长度。

 基于遗传算法求函数最大值

基于遗传算法求函数最大值

L=10的结果

 基于遗传算法求函数最大值

L=9的结果

程序代码:

基于遗传算法求函数最大值

 

 改变变异概率后,加入的变异部分代码如下(将该部分代码放入题目代码中的57-58行之间即可):基于遗传算法求函数最大值

 新手上路,思考了很久,决定通过平台的分享来提升自己思维的严密性,方便以后查阅,由于刚开始写,难免有不足之处,欢迎批评指正。

 

 

 

到了这里,关于基于遗传算法求函数最大值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用c语言,通过输入两个数,调用函数并输出最大值

    在 C 语言中,可以通过定义一个函数来输出两个数的最大值。 例如,可以定义一个名为 max 的函数,该函数接受两个参数 a 和 b ,并返回这两个数的最大值。代码如下: 在这段代码中,函数 max 接受两个整型参数 a 和 b ,并通过比较这两个数的大小来返回最大值。在 main 函数

    2024年02月04日
    浏览(61)
  • torch.argmax()函数【求最大值的索引,并让指定维度消失】

    torch.argmax(input, dim=None, keepdim=False) argmax函数:返回指定维度最大值的索引, dim指定某一维度,那么这一维度就会 消失 , 返回的所有维度会少这个dim指定的维度,根据这个返回的维度,确定对哪个维度采取argmax操作 例如输入是token_output的维度是(62,320,523):target_len:62【序列

    2024年02月13日
    浏览(35)
  • Python3 max() 函数 -求最大值、Python3 min() 函数 -求最小值

    ​ max() ​ 方法返回给定参数的最大值,参数可以为序列。 以下是​  max() ​ 方法的语法: x -- 数值表达式。 y -- 数值表达式。 z -- 数值表达式。 返回给定参数的最大值。 以下展示了使用 ​ max() ​ 方法的实例: 尝试一下 以上实例运行后输出结果为: ​ min()  ​方法返回给

    2023年04月26日
    浏览(59)
  • 想要精通算法和SQL的成长之路 - 分割数组的最大值

    想要精通算法和SQL的成长之路 - 系列导航 原题链接 首先面对这个题目,我们可以捕获几个: 非负整数。 非空连续子数组。 那么我们假设分割后的子数组,和的最大值是 M ,对应分割的子数组个数为 N 。他们之间必然存在以下关系: 分割的子数组个数 N 越多,对应的

    2024年02月07日
    浏览(43)
  • 算法每日一题: 分割数组的最大值 | 动归 | 分割数组 | 贪心+二分

    Hello,大家好,我是星恒 呜呜呜,今天给大家带来的又是一道经典的动归难题。 题目:leetcode 410 给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k_ 个非空的连续子数组。 设计一个算法使得这 k _个子数组各自和的最大值最小。 示例: 示例 1: 示例 2: 示例

    2024年01月22日
    浏览(47)
  • 算法| Java的int类型最大值为什么是21亿多?

    本文主要介绍在 Java 中,为什么 int 类型的最大值为 2147483647 。 我们都知道在 Java 中, int 的长度为32位。 理论上,用二进制表示,32位每一位都是1的话,那么这个数是多少呢? 我们来计算一下,第0位可以用20^00表示,第1位可以用21^11表示,第31位可以用231表示,那么32位二进

    2024年02月04日
    浏览(47)
  • 算法刷题Day 13 滑动窗口最大值+前K个高频元素

    乍一看有点单调栈的意思,但其实不是。 仔细想想应该是用优先队列,似乎也不对,从滑动窗口出来的元素不好从队列中删除 看了随想录之后,是用到单调队列 使用单调队列有坑的地方: case: nums =[-7,-8,7,5,7,1,6,0], k = 4 单调队列在push的时候,如果红框为 = 号,那么结果会出

    2024年02月13日
    浏览(57)
  • 华为OD机试 -矩阵最大值(Java) | 机试题+算法思路+考点+代码解析 【2023】

    给定一个仅包含0和1的N*N二维矩阵,请计算二维矩阵的最大值,计算规则如下: 1、 每行元素按下标顺序组成一个二进制数(下标越大越排在低位),二进制数的值就是该行的值。矩阵各行值之和为矩阵的值。 2、允许通过向左或向右整体循环移动每行元素来改变各元素在行中

    2024年02月13日
    浏览(56)
  • 利用OpenCV的函数minMaxLoc()获取图像中像素的最小值、最大值以及对应的坐标值

    函数minMaxLoc()的原型如下: C++原型: Python原型: 参数意义很简单,官方文档原文如下: src—input single-channel array. minVal—pointer to the returned minimum value; NULL is used if not required. maxVal—pointer to the returned maximum value; NULL is used if not required. minLoc—pointer to the returned minimum location (in

    2024年02月03日
    浏览(51)
  • 【重新定义matlab强大系列八】利用matlab求局部值(函数islocalmax求局部最大值+函数islocalmin求局部最小值)

    🔗 运行环境: Matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 ####  防伪水印—— 左手の明天 #### 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天开启新的系列——

    2024年02月08日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包