如何为游戏创建一个好的评估函数?

我写程序有时玩棋盘游戏变种。 基本的策略是标准的alpha-beta修剪或类似的搜索,有时通过通常的endgames或开口方法来增加。 我大多数时候都会使用国际象棋变体,所以当我选择我的评估功能时,我使用了基本的国际象棋评估功能。

不过,现在我正在编写一个程序来玩一款全新的棋盘游戏。 我如何选择一个好的甚至是体面的评估函数?

主要的挑战是相同的棋子总是在棋盘上,所以通常的物质功能不会基于位置而改变,并且游戏已经玩了不到一千次左右,所以人类不一定玩得够还没有提供见解。 (PS。我考虑过MoGo方法,但随机游戏不可能终止。)

游戏细节:游戏在10×10的棋盘上进行,每边固定6个棋子。 这些作品有一定的运动规则,并以某种方式相互作用,但没有任何作品被捕获。 游戏的目标是在棋盘上的某些特殊方块中放置足够的棋子。 计算机程序的目标是提供一个与当前人类玩家相比具有竞争力或更好的玩家。


为您的评估功能找到几个候选人,例如移动性(可能移动次数)减去对手的移动性,然后尝试为每个指标找到最佳权重。 遗传算法似乎很适合在评估函数中优化权重。

创建一个具有随机权重的人群,以有限的深度与他们对抗,然后转向,用获胜者的随机组合替换失败者,随机重复,在每一代之后打印出平均人口。 让它运行直到您对结果满意为止,或者直到您看到需要调整某些指标的范围并再次尝试,看起来某个指标的最佳值可能超出您的初始范围。

延迟编辑:当时我不知道的一种更为接受,研究和理解的方法叫做“差异进化”。 后代由3个父母而不是2个创建,以避免过早趋于平均水平的问题。


我将从一些基础入手,并在稍后转向更难的东西。

基本代理和测试框架

无论采取什么方法,你都需要从简单而愚蠢的事情开始。 对于哑代理来说,最好的方法是随机的(产生所有可能的动作,随机选择一个)。 这将作为比较所有其他业务代表的起点。 你需要一个强大的框架进行比较。 采用各种代理的东西允许在它们之间玩一些游戏并返回性能矩阵。 根据结果​​,您可以计算每个代理的适应度。 例如,您的职业tournament(agent1, agent2, agent3, 500)将在每对代理之间播放500个游戏(播放第一个/第二个代理),并返回给您如下所示的内容:

  x         -0.01       -1.484   |  -1.485
0.01          x         -1.29    |  -1.483
1.484       1.29          x      |  2.774

在这里,例如我使用2分获胜,1分抽签得分功能,并在最后总结一切以找到适合度。 该表立即告诉我, agent3是最好的, agent1agent2并没有太大的区别。

所以一旦这两件重要的事情建立起来,你就准备好实验你的评估功能。


让我们从选择功能开始

  • 首先,您需要创建not a terrible评估函数。 通过这个我的意思是这个函数应该正确识别3个重要方面(赢/平局/损失)。 这听起来很明显,但我看到了大量的机器人,创作者无法正确设置这三个方面。

  • 然后你用你的人类智慧找出游戏状态的某些特征。 首先要做的就是和一位游戏专家交谈,问他如何获得这个职位。

  • 如果你没有专家,或者你甚至在5分钟前创建了你的游戏规则,不要低估人类搜索模式的能力。 即使在玩过几场比赛之后,一个聪明的人也可以给你想法他应该如何玩(这并不意味着他可以实现这些想法)。 将这些想法用作功能。

  • 此时你并不需要知道这些功能如何影响游戏。 特征示例:棋子的价值,棋子的移动性,重要位置的控制,安全性,可能棋步的总数,贴近终点。

  • 在对这些功能进行编码并单独使用它们以查看最佳效果(不要急于放弃自身不合理的功能,它们可能有助于与其他功能结合使用)之后,即可准备好尝试组合。

  • 通过组合和加权简单的功能来构建更好的评估。 有几种标准方法。

  • 根据您的功能的各种组合创建一个超级功能。 它可以是线性的eval = f_1 * a_1 + ... f_n * a_nf_i特征, a_i系数),但它可以是任何东西。 然后实例化许多具有绝对随机权重的代理,用于评估函数,并使用遗传算法互相再次播放它们。 使用测试框架比较结果,丢弃几个明显的输家并改变一些获胜者。 继续相同的过程。 (这是一个粗略的概述,详细了解GA)

  • 使用来自神经网络的反向传播想法来反向传播游戏结束时的错误,以更新网络的权重。 你可以阅读更多关于如何使用西洋双陆棋(我没有写过任何类似的东西,所以对于简短的事情感到抱歉)。

  • 你可以不用评估功能! 对于只听说过minimax / alpha-beta的人来说,这听起来可能很疯狂,但有些方法根本不需要评估。 其中之一被称为蒙特卡罗树搜索,作为名称中的蒙特卡罗,它暗示它使用大量随机(它不应该是随机的,它可以使用您以前的优秀代理商)游戏来生成树。 这本身就是一个巨大的话题,所以我会给你我真正的高层次的解释。 你从一个根开始,创建你的边界,你尝试扩展。 一旦你展开一些东西,你只需随机去叶子。 从叶子得到结果,你反向传播结果。 多次这样做,并收集有关当前边境的每个孩子的统计数据。 选择最好的一个。 那里有一个重要的理论,涉及到你如何在探索和利用之间取得平衡,以及阅读UCT(Upper Confidence Bound算法)


    我会看看有监督的机器学习算法,如强化学习。 查看棋盘游戏中的增强学习。 我认为这会给你一些好的方向去研究。

    此外,请查看基于强化学习的游戏“黑白棋”的战略获取(PDF链接),在给定游戏规则的情况下,可以学习一个很好的“支付功能”。 这与TD-Gammon密切相关......

    在训练过程中,神经网络本身用于为双方选择动作......相当令人惊讶的发现是,实际上发生了大量的学习,即使在利用原始板编码的零初始知识实验中也是如此。

    链接地址: http://www.djcxy.com/p/56407.html

    上一篇: How to create a good evaluation function for a game?

    下一篇: How to calculate Heuristic values for minimax