我将从一些基础开始,然后再转向更难的东西。
基本代理和测试框架
无论你采取什么方法,你都需要从一些非常简单和愚蠢的事情开始。哑代理的最佳方法是随机的(生成所有可能的动作,随机选择一个)。这将作为比较所有其他代理的起点。您需要一个强大的比较框架。需要各种代理的东西,允许在它们之间玩一些游戏并返回性能矩阵。根据结果,您可以计算每个代理的适应度。例如,您的函数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 的更多信息)
使用神经网络的反向传播思想从游戏结束时反向传播错误以更新网络的权重。你可以阅读更多关于步步高是如何完成的(我没有写过类似的东西,很抱歉简短了)。
您可以在没有评估功能的情况下工作!对于只听说过 minimax/alpha-beta 的人来说,这可能听起来很疯狂,但有些方法根本不需要评估。其中之一称为蒙特卡洛树搜索正如名字中的蒙特卡洛所暗示的那样,它使用大量随机(它不应该是随机的,它可以使用你以前的好代理)游戏来生成一棵树。这本身就是一个巨大的话题,所以我会给你我的高层次的解释。你从一个根开始,创建你的边界,你试图扩展它。一旦你扩展了一些东西,你只是随机地去叶子。从叶子中获取结果,然后反向传播结果。多次这样做,并收集有关当前边界的每个孩子的统计信息。选择最好的。那里有一个重要的理论,它与你如何在探索和利用之间取得平衡有关,还有一个值得阅读的好东西是 UCT(上限置信度算法)