我有时会编写程序来玩棋盘游戏的变体。 基本策略是标准的 Alpha-Beta 剪枝或类似的搜索,有时会通过常用的残局或开局方法来增强。 我主要玩国际象棋的变体,所以当选择我的评估函数时,我使用了一个基本的国际象棋评估函数。
然而,现在我正在编写一个程序来玩一个全新的棋盘游戏。 我该如何选择一个好的,甚至还算不错的评估函数呢?
主要的挑战是,相同的棋子始终在棋盘上,因此通常的物质函数不会根据位置而改变,并且该游戏已经被玩了不到一千次左右,因此人类不一定能够很好地玩它并提供见解。(PS。我考虑过 MoGo 方法,但是随机游戏不太可能终止。)
游戏细节:该游戏在一个 10×10 的棋盘上进行,每方有固定的六个棋子。 这些棋子具有一定的移动规则,并且以某种方式相互作用,但是没有棋子会被捕获。 游戏的目标是在棋盘上的某些特殊方格中拥有足够多的己方棋子。 计算机程序的目标是提供一个与当前人类玩家具有竞争力或比其更好的玩家。
回答:
为您的评估函数找到一些候选者,例如移动性(可能移动的次数)减去对手的移动性,然后尝试找到每个指标的最佳权重。 遗传算法似乎非常适合优化评估函数中的权重。
创建一个具有随机权重的种群,让他们在有限的深度和回合中相互战斗,用获胜者的随机组合替换失败者,洗牌并重复,并在每一代之后打印出种群平均值。 让它运行直到您对结果满意,或者直到您看到需要调整某些指标的范围并重试,如果某个指标的最佳值可能超出您的初始范围。
后期编辑:一种更被接受、研究和理解的方法(我当时不知道)是所谓的“差分进化”。 后代由 3 个父母而不是 2 个父母创建,以避免过早收敛到平均值的问题。