首页 文章

如何使我的遗传算法更有效?

提问于
浏览
1

我创造了一个游戏(基本上是一个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

3 回答

  • 0

    您可以通过随机选择机器人的一半基因和另一个机器人的基因的相反一半来执行两个机器人之间的交叉,保存基因的值 .

    例如,使用 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个基因来测试它,这些基因可控制小突变和巨大突变的突变率 . 但我不知道它是否可以在小人群中获得有效的结果 .

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

  • 0

    有了实数的向量,你可以试试Differential Evolution .

    作为GA,它是进化算法族的一部分 . DE有效地探索了解决方案空间的高 Value 区域(但它具有陷入局部最小值的常见问题) .

    与您的方法相反,DE在解决方案之间交换信息,因此它可以表现得更好 .

    最后但并非最不重要的是,从您的方法改为DE相对简单:您只需要编码特定的突变/交叉运算符 .

  • 0

    Agar.io可与其他人工智能比赛(如Mario AI)相媲美 . 问题是,允许许多不同的问题解决技术,并且初学者很容易实现神经进化,遗传编程和机器学习 . 不幸的是,不可能将这些机器人扩展到比某个级别更智能 . 那是因为遗传编程本身是错误的方法 . 更好的解决方案是Scripting AI,它不仅可以扩展到每个智能级别,而且还使用更少的CPU功率,如所谓的"evolutional AI" .

    让我们深入了解一下源代码 . 根据开头的import语句,使用了“Encog Framework” . 这是一个突出的机器学习库,支持GPU计算,类似于pybrain . 即使有最佳的参数调整,Encog也无法从头开始生成一个准备好赢得人类玩家的代理商 . 但是,证明这种优化算法不适合实际问题是很好的方法 .

相关问题