【问题标题】:How do I make my genetic algorithm more efficient?如何让我的遗传算法更高效?
【发布时间】:2016-10-03 23:33:47
【问题描述】:

我创建了一个游戏(基本上是 Agar.io 克隆),其中人类玩家与由遗传算法和神经网络驱动的 AI 控制机器人对抗。

问题是我认为我的算法效率不高。我有 10 个机器人按其适应度函数排名,即存活时间。他们的基因由-1到1之间的实数组成。

从最低到最高适应度,我取 n 个机器人,最多 5 个机器人,并取当前的权重值,然后将其加上一个高斯数乘以 (10^-n)。 我在与浮点数进行交叉时遇到了麻烦,因此我只做了这样的突变。

显然,我的 AI 不是很聪明。

如何改进我的算法?

如果需要,这里是大部分源代码所在的位置:https://github.com/jadenyjw/evo/blob/master/core/src/com/evo/game/stages/GameStage.java

【问题讨论】:

  • 这与 SO 无关。也许试试codereview.stackexchange.com
  • @httpNick 谢谢你会试试看。
  • 我投票决定将此问题作为离题结束,因为它要求对工作代码进行同行评审(未包含在帖子中)。它可能更适合Code Review,但他们会像我们在这里一样期待帖子本身中的代码。如果该异地位置由于某种原因(脱机、移动、删除等)不可用,则异地位置的代码对未来的读者的价值为零。
  • 我的代码应该没问题,我只是想知道一个更聪明的方法来实现这个算法。也许我所要求的可以被认为是 pseudocode。然后我就可以把它翻译成真正的代码了。
  • @KenWhite,我认为这个问题是有效的,并且可以轻松改进。我认为 OP 应该发布一段(伪)代码来实现您的基因交叉功能,然后我们对其进行推理。我假设这是你 Jaden 想要回答的一个狭窄部分。

标签: artificial-intelligence genetic-algorithm evolutionary-algorithm


【解决方案1】:

Agar.io 可与 Mario AI 等其他人工智能竞赛相媲美。问题是,允许使用许多不同的解决问题的技术,并且神经进化、遗传编程和机器学习对于初学者来说很容易实现。不幸的是,不可能将这些机器人扩展到比某个级别更智能的程度。那是因为基因编程本身是错误的方式。更好的解决方案是Scripting AI,它不仅可以扩展到各个级别的智能,而且使用更少的 CPU 功率,即所谓的“进化 AI”。

让我们更深入地了解源代码。根据开头的导入声明,使用了“Encog Framework”。那是一个著名的机器学习库,它支持 GPU 计算,类似于 pybrain。即使进行了最好的参数调整,Encog 也永远无法从头开始生成一个准备好与人类玩家对抗的智能体。但这是证明这类优化算法不适用于实际问题的好方法。

【讨论】:

  • 是的,你说得对,编写 AI 的脚本优于不断发展的 AI。然而,在我对一些关于神经网络的视频产生了兴趣后,我想将此视为一种学习体验。
  • Even with best parametertuning Encog will never be able to generate from scratch an agent which is ready to win against human player.这个我很怀疑!在一些游戏(可以说比agar.io 更复杂)中,即使是非常普遍(并且很有名)的"Playing Atari with Deep Reinforcement Learning" paper 也超越了人类的游戏。我不是 GP 的忠实拥护者,但某些形式的 Q 学习(甚至使用 encog-NN 作为近似函数)有可能证伪您的主张(在我看来)。
【解决方案2】:

拥有实数向量,您可以尝试Differential Evolution

作为 GA,它是进化算法家族的一部分。 DE 在有效探索解决方案空间的高价值区域时表现良好(但它通常会遇到卡在 局部最小值 中的问题)。

与您的方法相反,DE 在解决方案之间交换信息,因此它可以更好地执行。

最后但同样重要的是,从您的方法更改为 DE 相对简单:您只需编写特定的变异/交叉运算符。

【讨论】:

    【解决方案3】:

    您可以通过随机选择一个机器人的一半基因和另一个机器人的另一半基因来在两个机器人之间进行交叉,从而保留基因的值。

    例如,n 基因:

    For i from 0 to n-1
      r = random interger number
      If(r modulo 2 == 0)
        gene[i] of new bot = gene[i] of bot number 1
      Else
        gene[i] of new bot = gene[i] of bot number 2
      EndIf
    EndFor
    

    您还可以通过计算两个实数的中间值来“交叉”基因本身:

    gene[i] of new bot = ((gene[i] of bot 1) + (gene[i] of bot 2)) / 2
    

    人口可能太少了,也许使用 100 个或更多而不是 10 个机器人会获得更好的结果。但也许您的游戏不允许这样做,因此您可能需要运行多代机器人的遗传算法。

    关于突变,你正在做小的突变,你可以引入第二种突变类型,它创建一个具有全新随机实数的全新基因,不受基因先前值的影响,所以它是巨大的突变,由独立的突变率控制。

    一些算法具有可变的突变率,由同样可以突变的基因控制。因此,您可以通过引入 2 个控制小突变和大突变的突变率的基因来测试它。但我不知道它是否可以在小群体中产生有效的结果。

    关于神经网络,您可以测试其他布局,因为它可能有太多或没有足够的神经元来有效控制机器人。隐藏层数也是同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2020-09-15
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多