7

首先:这不是关于如何让程序播放五连冠的问题。去过也做过。

介绍说明

我已经制作了一个五合一游戏作为框架来试验基因改进的人工智能(哎呀,这听起来非常自命不凡)。与大多数回合制游戏一样,最好的走法是通过为每个可能的走法分配一个分数来决定的,然后玩得分最高的走法。将分数分配给移动(正方形)的函数如下所示:

  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. 将获胜者的值分配给失败者,然后随机更改其中一个。

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

score-method 是否应该在结果中添加一些小的随机值,以便相同的两个大脑之间的两个游戏会有所不同?每次迭代的值应该改变多少?“大脑”应该如何初始化?具有恒定值?使用随机值?

另外,这与人工智能或遗传算法有什么关系吗?

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

4

3 回答 3

7

如果您想像遗传算法一样处理这个问题,您将需要整个“大脑”群体。然后将它们相互评估,无论是每种组合还是使用锦标赛风格。然后选择人口的前 X% 并将其用作下一代的父母,其中后代是通过突变(您拥有)或基因交叉(例如,在两个“大脑”之间交换行或列)产生的。

此外,如果您没有看到任何进化进步,您可能需要的不仅仅是赢/输,而是想出某种积分系统,以便您可以更有效地对整个人口进行排名,这使得选择更容易。

于 2009-09-24T12:51:10.290 回答
4

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

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

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

于 2009-09-24T12:05:22.740 回答
3

看看增强拓扑的神经进化(NEAT)。一个花哨的首字母缩略词,基本上意味着神经网络的演变——它们的结构(拓扑)和连接权重。我编写了一个名为 SharpNEAT 的 .Net 实现,您不妨看看。SharpNEAT V1 还有一个井字游戏实验。

http://sharpneat.sourceforge.net/

于 2009-10-12T21:05:10.223 回答