热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

什么是极大极小博弈树?

极大极小博弈树(MinimaxGameTree)用于编写电脑之间的游戏程序,这类程序由两个游戏者轮流,每次执行一个步骤。当然,所有可能的步骤构成了一个树的结构。例如下面的图就是一个MGT,它表示了Tic-Tac-Toe游戏的前两步所有可能的步骤。

极大极小博弈树(Minimax Game Tree,简写为MGT)用于编写电脑之间的游戏程序,这类程序由两个游戏者轮流,每次执行一个步骤。当然,所有可能的步骤构成了一个树的结构。例如下面的图就是一个MGT,它表示了Tic-Tac-Toe游戏的前两步所有可能的步骤。Tic-Tac-Toe是一种简单的九宫格游戏,玩法是使用3*3的9个方格子,每人下一次看谁先连成一行3个,以下称ttt游戏。

我们注意到这棵树不同于其他的树结构,比如二叉树,2 3树以及堆树,根据游戏规则,一个MGT节点上可能有很多个子节点。

图中的树有三级,不过在编码中,极大极小树的级通常被称作层(级:level,层:ply)。在每一层中,“转换”开关指向另一个游戏者。

对一棵完整的极大极小树来说,计算机能够向前遍历每一步,直到找到最佳步骤为止。当然,正如你在例图中看到的那样,仅仅几个步骤也会令这棵树变得异常庞大,对于一台普通的计算机来说,预测五个步骤就足以令其迅速崩溃。因此,对于像国际象棋和围棋这样的大型博弈游戏来说,计算机程序不可能遍历所有结果,而是仅仅通过最上层的几个步骤来判断胜负。此外,程序员们也提出了很多算法和技巧来减少节点数目,比如阿尔法 贝塔剪枝算法(Alpha-Beta pruning),Negascout搜索算法以及MTD(全称是:Memory enhanced Test Driver,即记忆增强测试驱动)方法。

MGT当然不能预测所有计算机游戏的可能步骤。比如扑克游戏,计算机在判断对手动向的时候将会非常吃力,因为因为计算机不能看到对方手中的牌。因此,仅仅对于两个游戏者都能看到全部博弈形式的游戏来说,MGT才是最好的选择。这些游戏包括国际跳棋、五子棋、国际象棋和围棋,这些游戏被称作完全信息博弈(games of perfect information)。

极大极小博弈树是因描绘这种结构的一种简单算法而得名。我们来对ttt游戏的结果分配一下分值。如果叉(X)获胜,则分值为1。如果圈(O)获胜,则分值为-1。现在,叉将试图获得最大化的分值,而圈将试图最小化分值。于是,第一位研究此问题的研究者决定把游戏者叉命名为max,并且把游戏者圈命名为min。因此,这个完整的数据结构就被命名为极大(Max)极小(Min)博弈树。

极大极小逻辑也被用于其它博弈,比如国际象棋中。然而,在这些更复杂的博弈中,程序仅仅能搜索极大极小树中的一部分;由于树太过庞大,程序往往不能搜索到博弈最终的结局。计算机一般是搜索某几个节点之后就停止了。然后程序在某个节点上评估博弈的胜负,这些评估结果被换算成博弈形势的分值。如果计算机是max一方,程序会试图使博弈形势的分值最大化,同时为获胜结局(将死)赋最大值(比如说这个值是一百万)。如果计算机是min一方,显然程序将试图最小化分值,并为获胜结局赋最小分值(例如负一百万)。游戏双方将在两个最大值之间博弈,数值越接近哪一方则哪一方获利。

极大极小算法背后的策略假定参与博弈的游戏者都尽自己最大的努力获得好结果。因此,无论对方选择有利或有害的步骤,计算机都将会根据对手的着法选择最于己有利的步骤。

这个简单浅显的概念就是极大极小树的最大奥妙。比如,对max的程序来说,无论min怎么做,最佳的步骤或步骤序列一定会得到最高分值的结果。而min显然将选择那些让它获得最低分值的结果。

从某种意义上说,叶子节点(the?bottom?nodes,最下层节点)是唯一需要评估位置分值的节点,因为它们代表最终的结局。比如在max的博弈变化中,叶子节点始终处在同一位置。程序将假定min将从可能的步骤中选择最低分值的步骤行动,那么任何max节点的最大最小值都会等同于min节点的最低分值子节点。

最后,像人类的棋类游戏一样,程序的能力高低取决于计算机对所处形势的评估能力,以及程序搜索的深度。一位国际象棋大师对形势的估计误差要大大小于余位业余选手,而且象棋大师对于棋局的预测也远比一般人更远。计算机同样也可以对棋局做出很长远的预测,并且它着棋不会失误,因为它会看到对手由于失误而做出的回应。

有很多算法可以帮助极大极小算法提高搜索效率。其中一种被称作阿尔法贝塔剪枝算法。在使用这种算法进行的搜索中,计算机所要搜索的节点数大约只是不使用这种技术所需搜索节点数的平方根那么多。也就是说,如果程序原来需要搜索四百个节点,使用新的算法后它只需要搜索二十个。

其它的一些工具包括置换表(Transposition?table),记载搜索结果的纪录被放在一张可以快速存取的很小的表中。通常来说,不同的步骤序列可能达到相同的位置(结果)。这两个位置(结果)就可以互换。该表可以帮助计算机认识目前棋局的形势,因为它已经付出了内存存取时间的代价对其进行了审查。

同时,这些技术也允许计算机搜索更多的节点,并模拟策略思考。尽管其它的技术也开始崭露头角(比如神经网络),但极大极小树仍然是该类程序的最佳心脏。

极大极小博弈树(Minimax Game Tree)用于编写电脑之间的游戏程序,这类程序由两个游戏者轮流,每次执行一个步骤。当然,所有可能的步骤构成了一个树的结构。例如下面的图就是一个MGT,它表示了Tic-Tac-Toe游戏的前两步所有可能的步骤。

在每一层中的节点通常代表不同游戏者的选择,这两个游戏者通常被称作马克思(MAX)和米恩(Min)。

例如如果第二层是Max turn,则第三层就是Min turn,第二层的每个节点就是Max的choice,它们之间是或的关系,第三层的每个节点就是Min的choice,它们之间是与的关系。根据这个树,Max要做出的选择就让下次Min做出的任意选择都最小,即Minimax这个词的含义,极小化对手的最大收益。所以它不同于Maximin最大化自己的收益。

因为往往一局要下到最后才能分出胜负,而Game Tree上nodes的增长是以指数方式的,比如深蓝(Deep Blue)可以搜索12步,假设各方每步都有10种选择,那么一次的搜索量也有1万亿次,所以对于普通的电脑能够搜索到4步也有1万次了,所以就需要一个评分系统,对局面进行打分,考虑到是双人对战,则评分从负无穷到正无穷。所以马克思就是要找到一个最大的分数,而米恩就是要找到一个最小的分数。

下面用一个例子来说明,Tic-Tac-Toe游戏。

其中'o'代表PC,'x'代表玩家。其中有三个主要的函数:

int minSearch( char _board[9] )
int maxSearch( char _board[9] )
int gameState(char _board[9])

分别扮演max和min的角色,寻找最大和最小值,以及一个评分函数。

下面重点说说这个游戏的核心部分,gameState评分函数:

连三          100分
双连二       50分
平局          0分
不分胜负     1

其中如果评分时不分胜负则还会继续搜索,直到找到其他三种状态。

最后附上源码:

int gameState(char _board[9])
{
	int state;
	static int table[][3] = 
	{
		{0, 1, 2},
 		{3, 4, 5},
  		{6, 7, 8},
 		{0, 3, 6},
  		{1, 4, 7},
  		{2, 5, 8},
  		{0, 4, 8},
  		{2, 4, 6},
  	};
	char chess = _board[0];
 	for (char i = 1; i <9; ++i)
  	{
 		chess &= _board[i];
 	}
  	bool isFull = 0 != chess;
 	bool isFind = false;
	for (int i = 0; i  'o', finds[1] -> 'x'
				int finds[2] = {0, };
				for (int i = 0; i  1 && finds[1] <1)
                 //2 'o' has been founded twice in row, column or diagonal direction
                 state = -(INFINITY / 2) * finds[0];
             else if (finds[1] > 1 && finds[0] <1)
                 //2 'x' has been founded twice in row, column or diagonal direction
                 state = INFINITY / 2 * finds[1];
             else
                 //need to search more.
                 state = INPROGRESS;
         }
    }
     return state;
 }

本文地址:http://www.nowamagic.net/librarys/veda/detail/948,欢迎访问原出处。


推荐阅读
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 2017年人工智能领域的十大里程碑事件回顾
    随着2018年的临近,我们一同回顾过去一年中人工智能领域的重要进展。这一年,无论是政策层面的支持,还是技术上的突破,都显示了人工智能发展的迅猛势头。以下是精选的2017年人工智能领域最具影响力的事件。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 深入浅出:Google工程师的算法学习指南
    通过Google工程师的专业视角,带你系统掌握算法的核心概念与实践技巧。 ... [详细]
  • 本文档旨在帮助开发者回顾游戏开发中的人工智能技术,涵盖移动算法、群聚行为、路径规划、脚本AI、有限状态机、模糊逻辑、规则式AI、概率论与贝叶斯技术、神经网络及遗传算法等内容。 ... [详细]
  • 本文探讨了亚马逊Go如何通过技术创新推动零售业的发展,以及面临的市场和隐私挑战。同时,介绍了亚马逊最新的‘刷手支付’技术及其潜在影响。 ... [详细]
author-avatar
KJ慧兒H妹子Ed
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有