我使用Alpha-Beta剪枝创建了一个五子棋AI,它的移动水平不算愚蠢。首先,让我大致描述一下Alpha-Beta算法的评分函数。
当它接收到一个棋盘作为输入时,它首先会找出所有重复的棋子,并根据其作为威胁的有用性(由长度决定)给出4个可能值中的一个分数。然后,它会返回所有重复分数的总和。
但是,问题是我明确决定了这些分数(总共4个),它们似乎不是最佳选择。因此,我决定实现一个遗传算法来生成这些分数。每个基因将是4个分数之一。例如,硬编码分数的染色体将是:[5, 40000,10000000,50000]
然而,因为我使用遗传算法来创建评分函数的分数,我不确定应该如何实现遗传适应度函数。因此,我考虑了以下方法:
不使用适应度函数,而是将选择过程合并:如果我有两个染色体A和B,需要选择一个,我将使用A和B染色体在每个AI中模拟一场游戏,并选择获胜的染色体。
1.这是否可以替代适应度函数?
2.由于Alpha-Beta算法的特性,我需要为获胜条件赋予最大分数,在大多数情况下设置为无穷大。然而,因为我不能使用无穷大,我只是使用了一个非常大的数字。我也需要将这个分数添加到染色体中吗?还是因为它不重要且不会改变评分函数的值,就保持为常数?
3.在最初创建染色体时,随机生成,遵循标准分布被认为是最优的。然而,在我的情况下,基因有很大的偏差。这样生成染色体仍然可以吗?
回答:
这是否可以替代适应度函数?
是的,可以。这是一种相当常见的定义棋盘游戏适应度函数的方式。可能单轮比赛是不够的(但你需要进行实验)。
一个稍微不同的变体是这样的:
double fitness(Agent_k) fit = 0 repeat M times randomly extract an individual Agent_i (i <> k) switch (result of Agent_k vs Agent_i) case Agent_k wins: fit = fit + 1 case Agent_i wins: fit = fit - 2 case draw: fit doesn't change return fit
即一个代理与从种群中随机选择的M
个对手(有放回但避免自我对抗)进行比赛。
增加M
可以减少噪声,但需要更长的模拟时间(在一些与国际象棋相关的实验中使用M=5
)。
2.由于Alpha-Beta算法的特性…
不太确定你的问题。对于静态评估函数来说,使用一个非常大的值来表示获胜条件是标准做法。
确切的值并不重要,可能不应该进行优化。
3.在最初创建染色体时,随机生成,遵循标准分布被认为是最优的。然而,在我的情况下,基因有很大的偏差。这样生成染色体仍然可以吗?
这在某种程度上与你将要使用的特定遗传算法“风格”有关。
标准遗传算法可能更适合使用非完全随机的初始值。
其他变体(例如差分进化)可能对这一方面不太敏感。
也请看一下这个问题/答案:如何开始学习零和游戏的机器学习?