首先:这不是关于如何让程序播放五连冠的问题。去过也做过。
介绍说明
我已经制作了一个五合一游戏作为框架来试验基因改进的人工智能(哎呀,这听起来非常自命不凡)。与大多数回合制游戏一样,最好的走法是通过为每个可能的走法分配一个分数来决定的,然后玩得分最高的走法。将分数分配给移动(正方形)的函数如下所示:
如果方格已经有令牌,则得分为 0,因为在方格中放置新令牌是非法的。
每个方格可以是多达 20 个不同的获胜行(5 个水平,5 个垂直,10 个对角线)的一部分。平方的分数是这些行中每一行的分数之和。
一行的得分取决于该行中已经存在的友方和敌方标记的数量。例子:
- 有四个友好标记的一排应该有无限的分数,因为如果你把一个标记放在那里你就赢了。
- 连续有四个敌人标记的分数应该很高,因为如果你不在那里放置一个标记,对手将在下一回合获胜。
- 包含友方和敌方标记的行将得分为 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。我应该如何迭代地使这些变得更好?我想象这样的事情:
- 用随机值初始化 vBrain1 和 vBrain2。
- 模拟他们之间的游戏。
- 将获胜者的值分配给失败者,然后随机更改其中一个。
这似乎行不通。大脑并没有变得更聪明。为什么?
score-method 是否应该在结果中添加一些小的随机值,以便相同的两个大脑之间的两个游戏会有所不同?每次迭代的值应该改变多少?“大脑”应该如何初始化?具有恒定值?使用随机值?
另外,这与人工智能或遗传算法有什么关系吗?
PS:这个问题与五连冠无关。这只是我选择的东西,因为我可以声明一个非常简单的“大脑”来进行实验。