我已经创建了一个游戏(基本上是一个Agar.io克隆),其中一个人类玩家被放置在一个由遗传算法和神经网络驱动的人工智能控制的机器人面前。
问题是我认为我的算法效率不高。我有10个机器人,根据它们的适应度函数排名,这是时间存活。他们的基因由-1到1之间的实数组成。
从最低到最高的适应度,我取n个机器人,最多5个机器人,取当前的权重值,并将其乘以高斯数乘以(10^-n)。我在执行浮点数的交叉时遇到了困难,所以我只做了这样的变异。
显然,我的人工智能并不是很智能。
我如何改进我的算法?
如果需要,这里是大多数源代码所在的位置:https://github.com/jadenyjw/evo/blob/master/core/src/com/evo/game/stages/GameStage.java
发布于 2016-10-05 02:09:11
Agar.io可以与马里奥·AI等其他人工智能竞赛相媲美。问题是,许多不同的解决问题的技术是允许的,神经进化,遗传编程和机器学习对于初学者来说非常容易实现。不幸的是,不可能将这些机器人扩展到比某个级别更智能。这是因为遗传编程本身是错误的。更好的解决方案是Scripting AI,它不仅可以扩展到每个智能级别,而且使用更少的cpu-power,即所谓的“进化AI”。
让我们更深入地了解源码。根据一开始的导入声明,使用了"Encog Framework“。这是一个著名的机器学习库,它支持GPU计算,类似于pybrain。即使有最好的参数调整,Encog也永远不能从头开始生成一个准备好战胜人类玩家的智能体。但这类优化算法并不适用于实际问题,这是一个很好的证明。
发布于 2016-10-06 00:27:33
有了实数向量,你可以尝试Differential Evolution。
作为GA,它是进化算法家族的一部分。DE很好地有效地探索了解决方案空间的高价值区域(但它有一个常见的问题,即陷入局部最小值)。
与您的方法相反,DE在解决方案之间交换信息,因此它可以执行得更好。
最后但并非最不重要的一点是,改变DE的方法相对简单:您只需编写特定的变异/交叉操作符。
发布于 2016-10-22 14:34:52
您可以在两个机器人之间进行杂交,通过随机选择一个机器人的一半基因和另一个机器人的相反一半的基因来保存基因的值。
例如,对于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个。但也许你的游戏不允许这样做,所以你可能需要对更多代的机器人运行遗传算法。
关于突变,你做的是小突变,你可以引入第二种突变类型,用一个全新的随机实数创建一个全新的基因,它不受基因先前值的影响,所以它是一个巨大的突变,由一个独立的突变率控制。
一些算法具有可变的突变率,由也可以突变的基因控制。因此,你可以通过引入两个基因来测试它,这两个基因控制着小突变和大突变的突变率。但我不知道它是否能在小群体中产生有效的结果。
关于神经网络,你可以测试其他布局,因为它可能有太多或没有足够的神经元,无法有效地控制机器人。隐藏层的数量也是同样的问题。
https://stackoverflow.com/questions/39842006
复制相似问题