游戏AI中遗传算法的适应度函数替代方案

我使用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.在最初创建染色体时,随机生成,遵循标准分布被认为是最优的。然而,在我的情况下,基因有很大的偏差。这样生成染色体仍然可以吗?

这在某种程度上与你将要使用的特定遗传算法“风格”有关。

标准遗传算法可能更适合使用非完全随机的初始值。

其他变体(例如差分进化)可能对这一方面不太敏感。

也请看一下这个问题/答案:如何开始学习零和游戏的机器学习?

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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