代码之家  ›  专栏  ›  技术社区  ›  Jan B. Kjeldsen

遗传算法中的最优种群规模、变异率和交配率

  •  8
  • Jan B. Kjeldsen  · 技术社区  · 14 年前

    我为一个比赛编写了一个游戏程序,它依赖于16个浮点“常量”。改变一个常数可以而且将会对游戏风格和成功率产生巨大的影响。

    我还编写了一个简单的遗传算法来生成常数的最佳值。然而,该算法并不生成“最优”常数。

    可能的原因:

    • 算法有错误(暂时排除!)
    • 人口太少了
    • 突变率很高
    • 交配率会更好

    • 首先创建初始种群
    • 对每一代人来说,人口中的一部分人是配对进行一场比赛的
    • 如果抽签都被克隆一次,获胜者将被克隆两次
    • 如果random()小于突变率,克隆会突变一个基因
    • 变异将随机常数乘以0.75到1.25之间的随机因子
    • 在固定的时间间隔内,根据交配率,成员配对,基因混合

    我当前的设置:

    • 变异率0.10(10%)
    • 交配率0.20(每5代)

    种群大小、变异率和交配率的最佳值是多少?

    另外,如果你有类似遗传算法的见解,你会愿意分享,请这样做。

    P、 S.:如果有人感兴趣的话,有问题的游戏竞赛: http://ai-contest.com/

    2 回复  |  直到 13 年前
        1
  •  2
  •   Joel Rein    14 年前

    你的变异量让我吃惊的高。它也有一点固有的偏见-电流值越大,变异就越大。

    1. 有一个(很多!)较小的突变
    2. 给变异一个固定的范围
    3. 不同的变异大小分布-例如,你可以使用平均值为1的正态分布。

        2
  •  2
  •   Guillaume Massé    14 年前

    使用GAUL框架,它非常简单,因此您可以提取目标函数来将其插入GAUL。如果您有一台多核计算机,那么您需要在编译时使用omp(openMP)来并行化您的计算(我假设这是一个耗时的过程)。这样你就可以拥有更大的人口规模。 http://gaul.sourceforge.net/

    通常他们使用高交叉和低变异。既然你想要创造力,我建议你高变异和低交叉。 http://games.slashdot.org/story/10/11/02/0211249/Developing-emStarCraft-2em-Build-Orders-With-Genetic-Algorithms?from=rss

    在你的变异函数中要非常小心以保持你的空间搜索(在0.75,1.25之内)。使用GAUL随机函数,例如random_double(min,max)。他们的设计真的很好。建立你自己的突变功能。确保父母都死了!