首页 文章

如何为游戏创建良好的评估功能?

提问于
浏览
19

我有时会编写程序来玩棋盘游戏 . 基本策略是标准的alpha-beta修剪或类似的搜索,有时通过终结游戏或开放的常用方法来增强 . 我主要使用国际象棋变体,所以当需要选择我的评估功能时,我会使用基本的国际象棋评估功能 .

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

主要的挑战是相同的棋子总是在棋盘上,因此通常的材料功能不会根据位置而改变,并且游戏的播放次数不到一千次左右,所以人类不一定玩得太多还没有给出见解 . (PS . 我考虑过MoGo方法,但随机游戏不太可能终止 . )

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

8 回答

  • 11

    为您的评估功能找到一些候选人,例如移动性(可能移动的数量)减去对手的移动性,然后尝试找到每个度量的最佳权重 . 遗传算法似乎在评估函数中优化权重方面非常有效 .

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

    Late edit: 当时我不知道的一种更被接受,研究,理解的方法是"Differential Evolution" . 后代是由3个父母而不是2个父母创建的,这样可以避免过早收敛到平均值的问题 .

  • 1

    我将从一些基础开始,然后转向更难的东西 .

    Basic agent and a testing framework

    无论你采取什么方法,你都需要从一些非常简单和愚蠢的事情开始 . 哑代理的最佳方法是随机的(生成所有可能的移动,随机选择一个) . 这将作为比较所有其他代理商的起点 . 你需要一个强大的框架来进行比较 . 需要各种代理的东西允许在它们之间玩一些游戏并返回性能矩阵 . 根据结果,您可以计算每个代理的适用度 . 例如,您的函数 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 没有什么不同 .

    因此,一旦设置了这两个重要的事项,您就可以尝试使用您的评估函数了 .


    Let's start with selecting features

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

    • 然后你用你的人类聪明才智找到游戏状态的一些特征 . 首先要做的是与游戏专家交谈并询问他如何获得该职位 .

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

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

    • 之后您编写了这些功能并单独使用它们以查看哪种功能最佳(不要急于丢弃那些本身不合理的功能,它们可能与其他功能一起使用),您已准备好尝试组合 .

    Building better evaluations by combining and weighting simple features. 有几种标准方法 .

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

    • 使用来自神经网络的反向传播思想来反馈从游戏结束传播错误以更新网络的权重 . 你可以通过backgammon阅读更多关于它是如何完成的(我没有写过任何类似的东西,很抱歉这个简短) .

    You can work without evaluation function! 对于只听过minimax / alpha-beta的人来说,这可能听起来很疯狂,但有些方法根本不需要评估 . 其中一个名为Monte Carlo Tree Search,名字中的蒙特卡罗表示它使用大量随机(它不应该是随机的,它可以使用你以前的好代理)游戏来生成一棵树 . 这本身就是一个很大的话题,所以我会给你我真正的高级解释 . 您从root开始,创建您尝试扩展的边界 . 一旦你展开了什么,你就可以随机地去看看 . 从叶子中获取结果,您反向传播结果 . 多次这样做,并收集有关当前边界的每个孩子的统计数据 . 选择最好的一个 . 那里有一个重要的理论,它涉及如何在探索和开发之间取得 balancer ,并且有一个好的东西可以阅读有UCT(上置信界限算法)

  • 1

    我会看一下有监督的机器学习算法,比如强化学习 . 看看Reinforcement learning in board games . 我想这会给你一些好的方向来研究 .

    另外,请查看Strategy Acquisition for the Game Othello Based on Reinforcement Learning(PDF链接),根据游戏规则,可以学到一个好的"payoff function" . 这与TD-Gammon密切相关......

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

  • 2

    如果还没有人理解游戏,那么你就无法获得像样的评价功能 . 不要告诉我,对于国际象棋或它的变体来说,标准的alpha-beta与材料数量是好的甚至是不错的(也许输家的国际象棋是一个例外) .

    您可以尝试使用反馈或类似的机器学习算法的神经网络,但它们通常很糟糕,直到他们有大量的训练,在这种情况下可能无法获得 . 即便如此,如果他们不吸吮,你也无法从他们那里获得知识 .

    我认为没有办法尽可能不了解游戏,对于初学者来说,将未知数留在评估函数上(或者只是在图片之外,直到未知数变得更清楚) .

    当然,如果您分享有关游戏的更多信息,您可以从社区获得更好的想法 .

  • 12

    据我了解,您需要一个良好的静态评估函数,用于最小 - 最大树的叶子 . 如果是这样,最好记住这个静态评估功能的目的是提供关于该板对计算机播放器有多好的评级 . 也是

    f(board1)> f(board2)

    那么对于计算机(它更有可能最终获胜)而言,board1对于board2来说一定是更好的 . 当然,对于所有电路板,静态功能都不是完全正确的 .

    所以,你说“游戏的目标是在棋盘上的某些特殊方块中有足够的碎片”,所以f(棋盘)的第一个刺就是计算计算机上那些碎片的数量 . 特殊广场 . 然后你可以更加精细 .

    如果不知道游戏的细节,就不可能给出更好的猜测 . 如果你给了我们游戏规则,我相信stackoverflow用户可以为这些功能提供大量的原创想法 .

  • 2

    虽然你可以使用各种机器学习方法来提出一个评估函数(TD-Learning,用于诸如gnubackgammon之类的项目就是这样一个例子),结果肯定取决于游戏本身 . 对于步步高,它的效果非常好,因为游戏的随机特性(滚动骰子)迫使学习者探索它可能不想做的领域 . 如果没有这样一个关键的组成部分,你可能最终会得到一个对自己有利的评价函数,但不会对其他人有所帮助 .

    由于材料差异可能不适用,移动性的概念是否重要 - 即您有多少可能的移动?控制板的某个区域通常比没有好吗?与玩游戏的人交谈,找出一些线索 .

    尽管您最好拥有尽可能好的评估功能,但您还需要调整搜索算法,以便尽可能深入地进行搜索 . 有时,这实际上更令人担忧,因为具有医学评估功能的深度搜索者可以超越具有良好评估功能的浅层搜索 . 这一切都取决于域名 . (例如,gnubackgammon使用1层搜索播放专家游戏)

    您可以使用其他技术来提高搜索质量,最重要的是,有一个转置表来缓存搜索结果,以便进行正确的修剪 .

    我强烈推荐查看these slides .

  • 2

    您还需要谨慎选择 . 如果您的算法与实际值没有已知关系,则标准AI函数将无法正常工作 . 为了有效,您的评估函数或启发式必须与实际值一致或低于实际值,否则它将以奇怪的方式指导您的决策(即使我认为标准点很好,也可以争论国际象棋 . ) .

    我通常做的是找出能力和需要的东西 . 对于一些游戏,比如推箱子,我已经使用了将一个盒子(隔离)从当前位置到任何目标位置所需的最小盒子移动次数 . 对于所需移动的数量,这不是一个准确的答案,但我认为这是一个非常好的启发式,因为它永远不会高估,它可以预先计算整个电路板 . 在对板的分数求和时,它只是每个当前盒位置的值的总和 .

    在我编写的一个人工生命模拟中,我发展了打包和打包防御,我使用的评分系统只是为了指导进化而不是进行任何修剪 . 我给每个生物一点出生 . 对于他们生命中消耗的每一点能量,我给了他们一个额外的点 . 然后,我使用他们这一代点的总和来确定每个人重现的可能性 . 就我而言,我只是使用了他们所获得的那一代总分的比例 . 如果我想要进化出那些善于躲避的生物,我会因为从中获得分数而得分 .

    你也应该小心你的功能不是太难达到目标 . 如果您正在尝试进化某些内容,则需要确保解决方案空间具有适当的斜率 . 你想引导一个方向的进化,而不仅仅是如果碰巧随机命中就宣布胜利 .

    如果不了解您的游戏,我很难告诉您如何构建一个功能 . 是否有明确的 Value 观表明赢或输?您是否有办法估算缩小差距的最低成本?

    如果您提供更多信息,我将很乐意尝试提供更多见解 . 关于这个主题也有很多优秀的书籍 .

    雅各

  • 3

    请记住,即使存在一个体面的评估功能也不是必须的 . 对于这个陈述,我假设评估函数必须具有低复杂度(P) .

相关问题