zoukankan      html  css  js  c++  java
  • 求解二元函数的最大值-遗传算法

    为了更好的理解遗传算法的运算过程,下面用手工的计算间的模拟遗传算法的各个主要的执行步骤:

    例、求下述二元函数的最大值:

    max f(x1,x2) = x1^2+x2^2;

    (1)个体编码:遗传算法的运算对象是表示个体的符号串,所以必须把变量x1,x2编码位一种符号串。本题中,用无符号二进制整数来表示。

      因x1,x2为0-7之间的正数,所以分别用3位无符号二进制整数来表示,将他们连接在一起所组成的6位无符号二进制数就形成了个体的基因型,表示一个可行解。

    例如:基因型X = 101110所对应的变现性就是x = 【5,6】;个体的表现型和基因型之间可通过编码和解码相互转换。

    (2)初始群体的产生:遗传算法是对群体进行的进化操作,需要给其准备一些表示起始搜索点的初始群体数据。本例中,群体规模的大小为4,就是群体有4个个体组成,每个个体可通过随机方法产生。

    (3)适应度计算:

      遗传算法中以个体适应度的大小来评定各个个体的优劣程度,从而决定其遗传机会的大小。

    本例中,目标函数总取非负值,并且是以求函数最大值为优化目标,顾客直接利用目标函数作为个体的适应度。

    (4)选择运算。

      选择运算(复制运算)把当前群体中适应度较高的个体按照某种规则或模型遗传到下一代群体中。一般要求适应度较高的个体将有更多的机会遗传到下一代。

    本例中,我们擦用于适应度成正比的概率来确定各个个体复制到下一代群体中的数量。

    先计算出群体中所有个体的适应度的总和;

    其次计算出每个个体的相对适应度的大小,他级为每个个体被遗传到下一代群体中的概率

    每个概率值组成一个区域,全部概率值之和为1;

    最后在产生一个0-1之间的随机数,依据该随机数出现在上述那一个概率区域内来确定各个个体被选中的次数。

    (5)交叉运算:

      交叉运算是遗传算法中产生新个体的主要操作过程,他以某一概率相互交换某俩个个体之间的部分染色体。本列采用单点交叉的方法,其具体操作过程是:

    先对群体进行随机配对;

    其次随机设置交叉点位置;

    最后相互交换配对染色体之间的部分基因

    (6)变异运算

      变异运算是对个体的某一个或某一些基因座上的基因值按某一较小的概率进行改变,他也是产生新个体的一种操作方法。

    本例中,我们采用基本为便宜的方法来进行便宜运算,其具体操作过程是:

    首先确定出个个个体的基因变异位置

    然后依照某一概率将变异点的原有基因值取反。

    对群体p(t)进行一轮选择,交叉,变异,运算之后可得到新一代的群体p(t+1)

     从上表可以看出,群体经过一代进化之后,其适应度的最大值,平均值都得到了明显的改进。事实上,这里已经找到了最佳个体111111。

    注意:需要说明的是,表中有些烂的数据是随机产生的。这里为了更好地说明问题,我们特意选择了一些较好的数值以便能够得到较好的结果,而在实际运算过程中有可能需要一定的循环次数才能达到这个最优结果。

  • 相关阅读:
    jQuery--隐藏事件
    正则表达式(全)
    1、简单的页面登录、下拉菜单、数据库查询
    1/多态的应用...
    PHP中的魔术方法:__construct, __destruct , __call,__get, __set, __isset, __unset , __toString, __set,__clone and __autoload
    1、php----自动加载类 __autoload()函数
    1、面向对象上课笔记。。。
    1、遍历数组知识
    1、php基本语法--函数
    1、刚学php感觉真有意思!
  • 原文地址:https://www.cnblogs.com/yjds/p/8728306.html
Copyright © 2011-2022 走看看