我应该使用什么算法进行"遗传AI改善"

Sve*_*sli 7 algorithm artificial-intelligence genetic-algorithm

首先:这不是关于如何让节目连续播放的问题.去过也做过.

介绍性解释

我做了一个五行的游戏作为一个框架,试验基因改进AI(哎呀,这听起来非常自命不凡).与大多数回合制游戏一样,最佳动作是通过为每个可能的动作分配分数,然后以最高分数进行动作来决定.将分数分配给移动(正方形)的功能如下:

  1. 如果正方形已有令牌,则得分为0,因为在正方形中放置新令牌是非法的.

  2. 每个方格可以是多达20个不同获胜行的一部分(5个水平,5个垂直,10个对角线).平方的得分是这些行中每一行的得分之和.

  3. 连续得分取决于行中已有的友方和敌方令牌的数量.例子:

    • 有四个友方令牌的行应该有无限分数,因为如果你在那里放置一个令牌,你就赢了游戏.
    • 具有四个敌人令牌的行的得分应该非常高,因为如果你没有在那里放置一个令牌,则对手将在下一回合获胜.
    • 具有友方和敌方令牌的行将得0,因为此行永远不会成为获胜行的一部分.

鉴于此算法,我已经声明了一个名为TBrain的类型:

type
  TBrain = array[cFriendly..cEnemy , 0..4] of integer; 
Run Code Online (Sandbox Code Playgroud)

数组中的值表示具有N个友好令牌和0个敌人令牌的行的分数,或0个友好令牌和N个敌人令牌.如果连续有5个令牌,那么因为该行已满,所以没有得分.

实际上很容易确定数组中应该包含哪些值.Brain [0,4](四个友方代币)应该是"无限",让我们称之为1.000.000.vBrain [1,4]应该非常高,但不要太高,以至于大脑更愿意阻止几个敌人胜利而不是自我胜利

以下(不可能的)董事会:

  0123456789
 +----------
0|1...1...12
1|.1..1..1.2
2|..1.1.1..2
3|...111...2
4|1111.1111.
5|...111....
6|..1.1.1...
7|.1..1..1..
8|1...1...1.
Run Code Online (Sandbox Code Playgroud)

玩家2应该将他的令牌放入(9,4),赢得游戏,而不是(4,4),即使他会阻止玩家1的8个潜在获胜行.Ergo,vBrain [1,4]应该是(vBrain) [0,4]/8)-1.像这样工作,我们可以找到"大脑"的最佳值,但同样,这不是我感兴趣的.我想要一个算法来找到最佳值.

我已经实现了这个框架,因此它完全是确定性的.分数中没有添加随机值,如果几个方格具有相同的分数,则会选择左上角.

实际问题

这是介绍,现在到有趣的部分(对我来说,至少)

我有两个"大脑",vBrain1和vBrain2.我应该如何迭代地使这些变得更好?我想象这样的事情:

  1. 使用随机值初始化vBrain1和vBrain2.
  2. 模拟他们之间的游戏.
  3. 将赢家的值分配给输家,然后稍微改变其中一个.

这似乎不起作用.大脑并没有变得更聪明.为什么?

分数方法是否应该为结果添加一些小的随机值,以便同一个两个大脑之间的两场比赛会有所不同?每次迭代的值应该改变多少?应该如何初始化"大脑"?有恒定的价值?随机值?

此外,这与AI或遗传算法有什么关系吗?

PS:这个问题与五连胜无关.这只是我选择的东西,因为我可以宣布一个非常简单的"大脑"进行实验.

小智 7

如果你想像遗传算法那样处理这个问题,你将需要一整群"大脑".然后相互评估,每种组合或使用锦标赛风格.然后选择人口的前X%并将其用作下一代的父母,其中后代通过突变(您有)或遗传交叉(例如,在两个"大脑"之间交换行或列)来创建.

此外,如果你没有看到任何进化的进展,你可能需要的不仅仅是赢/输,而是想出一些点系统,这样你就可以更有效地对整个人群进行排名,这使选择变得更容易.


Nic*_*kis 4

一般来说,是的,你可以制造大脑通过使用遗传算法技术

随机性或突变在遗传编程中起着重要作用。

我喜欢这个教程,遗传算法:酷名字和该死的简单
(示例使用Python,但理解起来并不困难)