应该使用什么算法来进行“遗传 AI 改进”

首先说明:这不是一个关于如何编写一个程序来玩五子棋的问题。我早就做过了。

介绍性说明

我做了一个五子棋游戏框架,用于实验性地改进 AI (哎呀,听起来太自命不凡了)。与大多数回合制游戏一样,最佳走法是通过为每个可能的走法分配一个分数来决定的,然后选择分数最高的走法。为走法(一个格子)分配分数的函数大致如下:

  1. 如果格子已经有棋子了,则分数为 0,因为在该格子中放置新棋子是不合法的。

  2. 每个格子最多可能成为 20 条不同获胜行的一部分(5 条水平,5 条垂直,10 条对角线)。格子的分数是这些行的分数之和。

  3. 一行的分数取决于该行中已有的友方和敌方棋子的数量。例如:

    • 一条有四个友方棋子的行应该有无限的分数,因为如果你在那里放置一个棋子,你就会赢得比赛。
    • 一条有四个敌方棋子的行应该有非常高的分数,因为如果你在那里放置一个棋子,对手将在他的下一回合获胜。
    • 一条既有友方棋子又有敌方棋子的行将得分为 0,因为这一行永远不可能成为获胜行的一部分。

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

type
  TBrain = array[cFriendly..cEnemy , 0..4] of integer; 

数组中的值表示一行中包含 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.

玩家 2 应该将他的棋子放在 (9,4) 处,赢得比赛,而不是放在 (4,4) 处,即使他会阻止玩家 1 的 8 条潜在获胜行。因此,vBrain[1,4] 应该是 (vBrain[0,4]/8)-1。像这样工作,我们可以找到 “大脑” 的最佳值,但再说一遍,这不是我感兴趣的。我想要一种算法来找到最佳值。

我实现了这个框架,使其完全是确定性的。没有将随机值添加到分数中,如果多个格子具有相同的分数,则将选择最上面的左边的格子。

实际问题

介绍就到此为止,现在进入有趣的部分(至少对我而言)

我有两个 “大脑”,vBrain1 和 vBrain2。我应该如何迭代地使它们变得更好?我设想如下:

  1. 使用随机值初始化 vBrain1 和 vBrain2。
  2. 模拟它们之间的一场游戏。
  3. 将获胜者的值分配给失败者,然后随机稍微更改其中一个值。

这似乎行不通。大脑并没有变得更聪明。为什么?

分数方法是否应该向结果添加一些小的随机值,以便两个大脑之间的两次游戏有所不同?每次迭代的值应该更改多少?应该如何初始化 “大脑”?使用常数值?使用随机值?

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

PS:这个问题与五子棋无关。这只是我选择的一个东西,因为我可以声明一个非常简单的 “大脑” 来进行实验。


回答:

一般来说,是的,您可以使用遗传算法技术使大脑更聪明。

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

我喜欢这个教程,Genetic Algorithms: Cool Name & Damn Simple
(它使用 Python 作为示例,但理解起来并不困难)

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注