我有时会编写程序来玩棋盘游戏。基本策略是标准的alpha-beta修剪或类似的搜索,有时通过终结游戏或开局的常用方法来增强。我主要使用国际象棋变体,所以当我选择评估功能时,我会使用基本的国际象棋评估功能。
然而,现在我正在编写一个程序来玩一个全新的棋盘游戏。我如何选择一个好的甚至是体面的评估函数?
主要的挑战是相同的棋子总是在棋盘上,所以通常的材料功能不会根据位置而改变,并且游戏的播放次数不到一千次左右,因此人类不一定充分发挥它,以提供洞察力。 (PS。我考虑过MoGo方法,但随机游戏不太可能终止。)
游戏细节:游戏在10×10的棋盘上进行,每侧固定6个棋盘。这些作品具有一定的运动规则,并以某种方式相互作用,但没有任何一块被捕获。游戏的目标是在棋盘上的某些特殊方块中放置足够的棋子。计算机程序的目标是提供一个与当前人类玩家竞争或更好的玩家。
答案 0 :(得分:12)
我将从一些基础开始,然后转向更难的东西。
基本代理和测试框架
无论你采取什么方法,你都需要从一些非常简单和愚蠢的事情开始。哑代理的最佳方法是随机的(生成所有可能的移动,随机选择一个)。这将作为比较所有其他代理商的起点。你需要一个强大的框架来进行比较。需要各种代理的东西允许在它们之间玩一些游戏并返回性能矩阵。根据结果,您可以计算每个代理的适用度。例如,你的函数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
是最好的,agent1
与agent2
没有什么不同。
因此,一旦设置了这两个重要的事项,您就可以尝试使用评估函数了。
让我们从选择功能开始
首先,您需要创建not a terrible
评估函数。通过这个我的意思是这个功能应该正确识别3个重要方面(赢/抽/亏)。这听起来很明显,但我看到了很多机器人,创作者无法正确设置这三个方面。
然后你用你的人类聪明才智找到游戏状态的一些特征。首先要做的是与游戏专家交谈并询问他如何获得该职位。
如果您没有专家,或者您甚至在5分钟前创建了游戏规则,请不要低估人类搜索模式的能力。即使在玩了几场比赛之后,一个聪明的人也可以给你一些他应该怎么玩的想法(这并不意味着他可以实现这些想法)。将这些想法用作功能。
此时您并不需要知道这些功能如何影响游戏。特征示例:棋子的价值,棋子的移动性,重要位置的控制,安全性,可能的移动总数,接近终点。
在对这些功能进行编码并单独使用它们以查看哪种功能最佳时(不要急于丢弃那些本身不合理的功能,它们可能与其他功能相结合),您已做好准备试验组合。
通过组合和加权简单功能来构建更好的评估。有几种标准方法。
根据各种功能组合创建超级功能。它可以是线性eval = f_1 * a_1 + ... f_n * a_n
(f_i
要素,a_i
系数),但它可以是任何东西。然后为此评估函数实例化具有绝对随机权重的许多代理,并使用遗传算法相互重复播放它们。使用测试框架比较结果,丢弃几个明显的输家并改变几个赢家。继续相同的过程。 (这是一个粗略的概述,详细了解GA)
使用来自神经网络的反向传播理念,从游戏结束时反向传播错误,以更新网络的权重。你可以通过backgammon阅读更多关于它的完成情况(我没有写过任何类似的内容,对于简短而感到抱歉)。
您可以在没有评估功能的情况下工作!对于只听过minimax / alpha-beta的人来说,这可能听起来很疯狂,但有些方法根本不需要评估。其中一个名为Monte Carlo Tree Search,名字中的蒙特卡罗表示它使用大量随机(它不应该是随机的,它可以使用你以前的优秀代理人)游戏来生成一棵树。这本身就是一个很大的话题,所以我会给你我真正的高级解释。您从root开始,创建您尝试扩展的边界。一旦你展开了什么,你就可以随机地去看看。从叶子中获取结果,您反向传播结果。多次这样做,并收集有关当前边界的每个孩子的统计数据。选择最好的一个。那里有一个重要的理论,它涉及如何在探索和开发之间取得平衡,以及阅读UCT(上置信界限算法)的好处
答案 1 :(得分:11)
为您的评估功能找到一些候选人,例如移动性(可能移动的数量)减去对手的移动性,然后尝试找到每个指标的最佳权重。遗传算法似乎可以很好地优化评估函数中的权重。
创建一个具有随机权重的人口,以有限的深度和轮流对抗他们,用获胜者的随机组合替换输家,改组和重复,在每一代后打印出人口平均值。让它一直运行,直到您对结果感到满意为止,或直到您看到需要调整某些指标的范围并重试,如果看起来某个指标的最佳值可能超出了您的初始范围。
延迟编辑:当时我不知道的一种更为公认,研究,理解的方法是“差异进化”。后代是由3个父母而不是2个父母创建的,这样可以避免过早收敛到平均值的问题。
答案 2 :(得分:3)
我会看一下有监督的机器学习算法,例如强化学习。查看Reinforcement learning in board games。我想这会给你一些好的方向来研究。
另外,查看Strategy Acquisition for the Game Othello Based on Reinforcement Learning(PDF链接),根据游戏规则,可以学习一个好的“支付功能”。这与TD-Gammon ...
密切相关在训练期间,神经网络 本身用于选择移动 双方......相当令人惊讶 发现是一个很大的数额 学习实际上发生了,甚至 在零初始知识 利用原板的实验 编码
答案 3 :(得分:2)
如果还没有人理解游戏,那么你就无法获得像样的评价功能。不要告诉我,对于国际象棋或它的变体来说,标准的alpha-beta和材料数量是好的甚至是不错的(也许输家的国际象棋是一个例外)。
您可以尝试使用反馈或类似机器学习算法的神经网络,但它们通常很难接受,直到他们接受大量培训,在这种情况下可能无法获得。即便如此,如果他们不吮吸,你也无法从中获取知识。
我认为没有办法尽可能不了解游戏,并且对于初学者来说,将未知数留在评估函数上(或者只是在图片之外,直到未知数变得更为人所知)。
当然,如果您分享有关游戏的更多信息,您可以从社区获得更好的想法。
答案 4 :(得分:2)
据我了解,您希望在最小 - 最大树的叶子上使用一个好的静态评估函数。如果是这样,最好记住这个静态评估函数的目的是提供关于该板对计算机播放器有多好的评级。
是的f(board1)> F(board2)
那么一定是真的,对于计算机来说,board1比在board2中更好(它更有可能最终获胜)。当然,对于所有电路板而言,静态功能都不是完全正确的。
所以,你说“游戏的目标是在棋盘上的某些特殊方块中有足够的碎片”,所以f(棋盘)的第一个刺就是计算计算机的数量在那些特殊的广场上。然后,您可以更加细致。
在不知道游戏细节的情况下,不可能给出更好的猜测。如果你给了我们游戏规则,我相信stackoverflow用户可以为这些功能带来大量的原创想法。
答案 5 :(得分:2)
虽然您可以使用各种机器学习方法来提出评估功能(TD-Learning,在gnubackgammon等项目中使用,就是这样一个例子),结果肯定取决于游戏本身。对于步步高,它的效果非常好,因为游戏的随机特性(滚动骰子)迫使学习者探索它可能不想做的领域。如果没有这样一个关键的组成部分,你可能最终会得到一个对自己有好处的评价函数,但不会对其他人有所帮助。
由于实质性差异可能不适用,移动性的概念是否重要 - 即您有多少可能的移动?控制板的某个区域通常比没有好吗?与玩游戏的人交谈,找出一些线索。
虽然最好尽可能提供评估功能,但您还需要调整搜索算法,以便尽可能深入搜索。有时,这实际上更令人担忧,因为具有医学评估功能的深度搜索者可以超越具有良好评估功能的浅层搜索。这一切都取决于域名。 (例如,gnubackgammon使用1层搜索进行专家游戏)
您可以使用其他技术来提高搜索质量,最重要的是,要使用转置表来缓存搜索结果,以便进行正确的修剪。
我强烈建议您查看these slides。
答案 6 :(得分:1)
您还需要谨慎选择。如果您的算法与实际值没有已知关系,则标准AI函数将无法正常工作。为了有效,您的评估函数或启发式必须与实际值一致或低于实际值,否则它将以奇怪的方式指导您的决策(即使我认为标准点很好,也可以争论国际象棋。 )。
我通常做的是找出能力和需要的东西。对于一些游戏,比如推箱子,我已经使用了将一个盒子(隔离)从当前位置到任何目标位置所需的最小盒子移动次数。对于所需移动的数量,这不是一个准确的答案,但我认为它是一个非常好的启发式,因为它永远不会高估,它可以预先计算整个板。在对板的分数求和时,它只是每个当前盒位置的值的总和。
在我编写的一个人工生命模拟中,我发展了打包和打包防御,我使用的评分系统只是指导进化而不是进行任何修剪。我给每个生物一点出生。对于他们生命中消耗的每一点能量,我给了他们一点额外的点。然后,我使用他们这一代点的总和来确定每个人重现的可能性。就我而言,我只是使用了他们所获得的那一代总分的比例。如果我想要进化出那些善于躲避的生物,我会因为从中获得分数而得分。
你也应该小心你的功能不是太难达到目标。如果您正在尝试进化某些内容,则需要确保解决方案空间具有适当的斜率。你想引导一个方向的进化,而不仅仅是当它碰巧随机命中时宣布胜利。
如果不了解您的游戏,我很难告诉您如何构建一个功能。是否有明确的价值观表明赢或输?您是否有办法估算缩小差距的最低成本?
如果您提供更多信息,我很乐意尝试提供更多见解。关于这个主题也有很多优秀的书籍。
雅各
答案 7 :(得分:1)
请记住,即使存在体面的评估功能也不是必须的。对于这个陈述,我假设评估函数必须具有低复杂度(P)。