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

Artificial intelligence 如何使我的遗传算法更有效?,artificial-intelligence,genetic-algorithm,evolutionary-algorithm,Artificial Intelligence,Genetic Algorithm,Evolutionary Algorithm,我创建了一个游戏(基本上是一个Agar.io克隆),在这个游戏中,一个人类玩家被放置在由遗传算法和神经网络驱动的人工智能控制的机器人上 问题是我认为我的算法效率不高。我有10个机器人按照它们的健身功能进行排名,也就是生存时间。他们的基因由-1到1之间的实数组成 从最低适应度到最高适应度,我将n个机器人最多5个机器人,并将当前权重值与高斯数乘以(10^-n)相加。 我很难用浮点数进行交叉,所以我只做了这样的变异 显然,我的人工智能不是很聪明 如何改进我的算法 如果需要的话,这里是大部分源代码所在的

我创建了一个游戏(基本上是一个Agar.io克隆),在这个游戏中,一个人类玩家被放置在由遗传算法和神经网络驱动的人工智能控制的机器人上

问题是我认为我的算法效率不高。我有10个机器人按照它们的健身功能进行排名,也就是生存时间。他们的基因由-1到1之间的实数组成

从最低适应度到最高适应度,我将n个机器人最多5个机器人,并将当前权重值与高斯数乘以(10^-n)相加。 我很难用浮点数进行交叉,所以我只做了这样的变异

显然,我的人工智能不是很聪明

如何改进我的算法


如果需要的话,这里是大部分源代码所在的地方:

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


让我们更深入地了解源代码。根据开始时的import语句,使用了“Encog框架”。这是一个著名的机器学习库,支持GPU计算,类似于pybrain。即使有最好的参数调整,Encog也永远无法从零开始生成一个准备好战胜人类玩家的代理。但这是一个很好的方法来证明这种优化算法不适合实际问题。

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


让我们更深入地了解源代码。根据开始时的import语句,使用了“Encog框架”。这是一个著名的机器学习库,支持GPU计算,类似于pybrain。即使有最好的参数调整,Encog也永远无法从零开始生成一个准备好战胜人类玩家的代理。但这是证明这种优化算法不适合实际问题的好方法。

有实数向量,你可以试试

作为遗传算法,它是进化算法家族的一部分。DE能够有效地探索解空间的高值区域(但它通常存在陷入局部极小值的问题)

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


最后但并非最不重要的一点是,将方法更改为DE相对简单:只需编写特定的变异/交叉运算符。

使用实数向量,您可以尝试

作为遗传算法,它是进化算法家族的一部分。DE能够有效地探索解空间的高值区域(但它通常存在陷入局部极小值的问题)

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


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

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

例如,对于
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个,你可能会得到更好的结果。但也许你的游戏不允许这样,所以你可能需要为更多代的机器人运行遗传算法

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

有些算法的变异率是可变的,由同样可以变异的基因控制。因此,你可以通过引入两个基因来测试它,这两个基因控制小突变和大突变的突变率。但我不知道它是否能对小群体产生有效的效果


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

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

例如,对于
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个,你可能会得到更好的结果。但也许你的游戏不允许这样,所以你可能需要为更多代的机器人运行遗传算法

关于突变,你在做小的突变,你可以引入第二个突变