【问题标题】:Genetic algorithms遗传算法
【发布时间】:2011-01-11 21:31:45
【问题描述】:

我正在尝试实现一种遗传算法来计算Rastrigin functon 的最小值,但我遇到了一些问题。
我需要将染色体表示为二进制字符串,并且 Rastrigin 的函数将数字列表作为参数,如何将染色体解码为数字列表?
Rastrigin 还希望列表中的元素为 -5.12

【问题讨论】:

    标签: mathematical-optimization genetic-algorithm


    【解决方案1】:

    您正在寻求实施遗传算法。您的实现应该适用于任何通用的最小化(或最大化)问题,而不仅仅是 Rastrigin 函数。您可以决定实现二进制编码的 GA 或实数编码的 GA。两者都有自己的用途和利基应用。但对你来说,我建议实施一个真实编码的 GA。根据您关于要做什么的问题,如果生成的变量值在 [-5.12:5.12] 之外,则实数编码的 GA 和二进制编码的 GA 将以不同方式处理它们。

    在开始实施自己的版本之前,拥有参考代码总是好的。如果您正在寻找 C 实现,实验室的source section 有一个 Real Coded GA 实现,它被我们和其他人广泛用于我们的研究工作。我建议你玩一下它并尝试那里给出的一些简单的优化问题。

    Pyevolve 是一个用于遗传算法和遗传编程的 Python 库。

    现在,我们已经讨论了实现的东西,你对 GA 的理解清楚了吗?如果没有,请参考这个tutorial,它从优化的角度介绍了GA。请注意,二进制编码 GA 的交叉和变异的解释不会自动转移到实编码 GA。 Real coded GA 有其自身的复杂性,您需要时间阅读一些论文并理解它们。不要着急,但只要全力以赴,您应该可以轻松上手。

    【讨论】:

      【解决方案2】:

      为什么需要将染色体表示为二进制字符串?您可以编写使用其他类型的进化算法。您可以使用数字列表。

      至于限制值,当您生成初始人口成员时,请确保随机数在您需要的范围内。限制你的变异操作符以避免产生超出这个范围的值(你可以截断超出这个范围的值,或者你可以让它们环绕)。

      如果您确实必须使用二进制字符串,请查看Gray Code,这是一种将数值编码为二进制的方法,使它们更容易发生变化。

      【讨论】:

      • 对于处理约束(例如在某些范围内具有值),换行或截断可能会弄乱优化,它基本上会添加强烈的噪音...惩罚方案(对适应度添加惩罚) ,与违反约束成正比)将使事情变得更加优雅。如果您真的不想要任何违规行为,您可以重新采样,即重试突变,直到结果个体不违反任何约束。
      【解决方案3】:

      将实值问题的解决方案编码为位串并不是真正可行的方法。当您将数字作为位字符串时,您使用的是定点数字来表示数字。一旦你的算法接近最优,达到你的定点编码的精度,它就不会有进一步的进展。您可以使用更多位,但收敛速度会较慢。在实践中,在严重的问题上,这种方法比处理浮点值的有效算法慢几个数量级。

      使用浮点数可以让您更接近最优值,例如 1e-10,同时使用典型的 64 位数字。此外,现代进化算法在优化过程中使用自适应方案来调整变异步骤。与固定突变步骤相比,这种机制允许更快的收敛速度。看看这个,看看典型的进化优化器在 Rastrigin 函数上实现了什么:http://coco.gforge.inria.fr/doku.php?id=bbob-2010

      【讨论】:

        【解决方案4】:

        我假设您正在使用 C 进行编程。整数(C 语言的 int)可以打包为 4 字节/字符(32 位)的数组。 所以如果你的数组是

        char* chrom_as_bytes=(...)
        

        你可以通过转换为 int* 来获得第 i 个值

        int ith=3;
        value=((int*)chrom_as_bytes)[ith];
        

        如果一个值不在 -5.12

        另见Wikipedia中的文章。

        【讨论】:

        • 在 GA 中,当给定参数值的范围时,通常是一种做法(恕我直言),在初始种群本身中进行处理,即我确保我的初始种群包括遵循分配范围的变量。在交叉和变异操作期间,如果超出范围,则可以处理的方法不止一种。您建议的是“惩罚”方法。对吗?
        【解决方案5】:

        如果您有兴趣,我已经使用 Pyevolve 完成了一个实现: http://pyevolve.sourceforge.net/examples.html#example-7-the-rastringin-function 抱歉名​​字打错了。

        【讨论】:

          猜你喜欢
          • 2012-07-07
          • 2011-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 2016-06-23
          • 2021-04-27
          • 2016-07-18
          相关资源
          最近更新 更多