对抗搜索Adversary Search与Minmax算法(含python代码)

news2024/12/24 8:47:20

Adversary Search,也称为对抗搜索,是人工智能中的一种算法策略,主要用于解决那些需要两个或多个对手在完全或部分信息的环境下对抗的问题。这种类型的搜索算法广泛应用于各种策略游戏,如国际象棋、围棋、和井字游戏,其中玩家轮流做出决策,目标是击败对手。

一、核心概念

  1. 博弈树(Game Tree): 博弈树是对抗搜索中的一种重要数据结构,它表示游戏的所有可能状态(节点)及其转移(边)。树的每一层通常代表游戏的一个回合,节点分布表示当前玩家的所有可能行动。

  2. Minimax 算法: Minimax 是一种经典的对抗搜索算法,用于找到最佳的移动策略。该算法的基本原理是最小化对手在你选择最好策略后的最大可能获益。它通过递归地评估博弈树中的所有可能状态来工作,然后选择一个使对手获得的评分最小的移动。

  3. Alpha-Beta 剪枝: Alpha-Beta 剪枝是在 Minimax 算法的基础上的一个优化技术,它通过剪枝掉那些不可能影响最终决策的树枝,来减少需要评估的节点数。这样可以大大加快搜索速度,使得算法可以在更深的博弈树上运行。

  4. 评估函数: 在实际应用中,由于游戏状态的复杂性和博弈树的深度,通常不可能完全遍历整个树。这时候,评估函数的作用就显得尤为重要。它用来估算游戏中某一特定状态的价值,以便算法能在有限的搜索深度下做出合理的决策。

通过一个具体的井字游戏(Tic-Tac-Toe)的例子来解释 Minimax 算法的计算流程。井字游戏是一个简单的两人博弈游戏,玩家轮流在一个3x3的网格上放置自己的标记(通常是X和O)。赢家是第一个在横、竖或斜线上形成一条直线的玩家。

二、博弈树示例

想象在一个井字游戏中,已经有几步棋走过了,当前棋盘状态如下(X代表玩家1,O代表玩家2)

接下来是X玩家的回合。我们将构建一个简化的博弈树来展示Minimax算法的工作流程。假设我们只考虑下一步(实际应用中可能需要考虑多步)。

构建博弈树
  1. X玩家可以选择空的位置放置X。
  2. 对于每个X的可能走法,O玩家再根据剩余的空位进行回应。

假设X玩家有两个选项:放在左下角或右下角。然后O玩家对这两种情况进行响应。

Minimax 算法计算流程
  1. 生成节点:从当前状态生成所有可能的游戏状态。
  2. 递归分析:对每一个可能的游戏状态,递归地重复这一过程,直到到达游戏结束的节点(所有格子被填满或一方获胜)。
  3. 评估终端节点:对于游戏结束的节点,评估其价值(如:赢+1,输-1,平0)。
  4. 回溯选择最优策略
    • 如果是X玩家的回合,选择可以导致评分最大化的走法。
    • 如果是O玩家的回合,选择可以导致评分最小化的走法。

假设下一个X玩家放在左下角,然后O玩家会选择放在右下角阻止X赢得游戏。如果X玩家选择右下角,O玩家可能会选择左下角,结果可能会导致X玩家获胜或平局。根据Minimax原理,X玩家会选择使自己最有可能赢得比赛的位置,即右下角。

三、MinMax算法示例

在这个具体的博弈树图中,我们可以看到Minimax算法的具体运作。这个树代表了一个简化的决策过程,其中包含一个最大化(Max)玩家和一个最小化(Min)玩家。这种类型的图通常用于解释如何在对抗型游戏中应用Minimax算法。

树的结构
  • 最顶层节点(Max):这是最大化玩家的选择节点。在这个例子中,Max玩家试图选择一个路径,该路径会导致最终获得最大的得分。
  • 中间层节点(Min):这一层代表最小化玩家的行动。最小化玩家的目标是尽可能减少最大化玩家的得分。
  • 底层叶节点:这些是游戏的可能结束状态,分别标有分数3, 5, 2, 9。
Minimax 算法计算过程
  1. 评估叶节点:这些是给定的,分别是3, 5, 2, 9。
  2. 向上计算至Min层
    • 左侧Min节点(L)会选择它的子节点中的最小值,即3和5中的最小值3。
    • 右侧Min节点(R)会选择它的子节点中的最小值,即2和9中的最小值2。
  3. 向上计算至Max层
    • Max节点现在在其子节点(L和R,即3和2)中选择最大值。因此,它会选择3。

在这个游戏中,如果Max玩家遵循Minimax算法,他将选择左侧的路径,因为这条路径保证了在Min玩家最佳行动的情况下可以获得的最高得分是3。

 四、Alpha-Beta 剪枝

Alpha-Beta 剪枝是一种优化技术,用于提高 Minimax 算法在对抗性游戏中的效率。其基本思想是在搜索过程中提前终止那些不会影响最终决策的路径(或称“分支”),从而减少搜索空间和计算量。Alpha-Beta 剪枝通过两个参数(alpha 和 beta)来实现这一目标,它们分别代表已经发现的最佳可行路径上的最小(alpha)和最大(beta)评分边界。

Alpha-Beta 剪枝的工作原理:
  1. Alpha(α)

    • Alpha 是到目前为止在Min层(最小化玩家层)可以确保的最好选择的下限。即,在当前路径上,Max玩家已知的对自己最有利的分数。
  2. Beta(β)

    • Beta 是到目前为止在Max层(最大化玩家层)可以确保的最差选择的上限。即,在当前路径上,Min玩家已知的对Max玩家最不利的分数。
  3. 剪枝过程

    • 在搜索树中向下搜索时,如果在某一节点的评估值导致 alpha 大于等于 beta,则可以停止进一步搜索该节点的其他子节点。这种情况称为剪枝。
    • 对于Max层的节点,如果发现一个选项使得评估值大于等于当前的 beta 值,可以停止搜索该节点的其他子节点(因为Min玩家不会让游戏达到这个节点)。
    • 对于Min层的节点,如果发现一个选项使得评估值小于等于当前的 alpha 值,也可以停止搜索该节点的其他子节点(因为Max玩家不会让游戏达到这个节点)。
Alpha-Beta 剪枝的优点:
  • 效率提升:通过剪枝减少了需要评估的节点数,从而大幅减少计算量和提高搜索速度。
  • 深度增加:剪枝使得在相同的计算时间内可以搜索到更深层的节点,这对于策略游戏尤其重要,因为更深的搜索可以带来更远见的策略。
  • 广泛应用:Alpha-Beta 剪枝被广泛应用于各种需要对抗搜索的游戏中,如国际象棋、围棋等。
举例说明:

假设在一个简单的博弈树中,Max层的节点已经发现了一个可以获得的最小分数是5(alpha = 5),接下来在一个Min层节点找到一个选项的评估值是3(小于5),那么就没有必要继续搜索这个Min层节点的其他子节点,因为Max玩家不会选择到达这个Min层节点的路径。

通过Alpha-Beta 剪枝,Minimax 算法能够更高效地应用于复杂的对抗型游戏中,帮助AI在可接受的时间内做出更优的决策。

下面是一个简单的 Python 实现,展示了在井字游戏中如何使用 Alpha-Beta 剪枝来优化 Minimax 算法。这个例子中,我们将实现一个函数来决定最佳的移动,假设游戏棋盘用一个 3x3 的矩阵表示,空位用 ' ' 表示,玩家用 'X' 和 'O' 表示。

五、Alpha-Beta 剪枝版的MinMax的 Python 代码实现:

def is_terminal(state):
    """检查游戏是否结束"""
    # 检查胜利条件
    win_conditions = [
        [state[0][0], state[0][1], state[0][2]],
        [state[1][0], state[1][1], state[1][2]],
        [state[2][0], state[2][1], state[2][2]],
        [state[0][0], state[1][0], state[2][0]],
        [state[0][1], state[1][1], state[2][1]],
        [state[0][2], state[1][2], state[2][2]],
        [state[0][0], state[1][1], state[2][2]],
        [state[2][0], state[1][1], state[0][2]]
    ]
    for condition in win_conditions:
        if condition[0] == condition[1] == condition[2] != ' ':
            return True, condition[0]
    if all(state[i][j] != ' ' for i in range(3) for j in range(3)):
        return True, None  # 平局
    return False, None

def minimax(state, depth, is_maximizing, alpha, beta):
    """实现带 Alpha-Beta 剪枝的 Minimax 算法"""
    terminal, winner = is_terminal(state)
    if terminal:
        if winner == 'X':
            return 10 - depth
        elif winner == 'O':
            return depth - 10
        else:
            return 0

    if is_maximizing:
        max_eval = float('-inf')
        for i in range(3):
            for j in range(3):
                if state[i][j] == ' ':
                    state[i][j] = 'X'
                    eval = minimax(state, depth + 1, False, alpha, beta)
                    state[i][j] = ' '
                    max_eval = max(max_eval, eval)
                    alpha = max(alpha, eval)
                    if beta <= alpha:
                        break
        return max_eval
    else:
        min_eval = float('inf')
        for i in range(3):
            for j in range(3):
                if state[i][j] == ' ':
                    state[i][j] = 'O'
                    eval = minimax(state, depth + 1, True, alpha, beta)
                    state[i][j] = ' '
                    min_eval = min(min_eval, eval)
                    beta = min(beta, eval)
                    if beta <= alpha:
                        break
        return min_eval

def best_move(state, player='X'):
    """找出最佳移动"""
    best_val = float('-inf') if player == 'X' else float('inf')
    move = (-1, -1)
    for i in range(3):
        for j in range(3):
            if state[i][j] == ' ':
                state[i][j] = player
                value = minimax(state, 0, player == 'O', float('-inf'), float('inf'))
                state[i][j] = ' '
                if (player == 'X' and value > best_val) or (player == 'O' and value < best_val):
                    best_val = value
                    move = (i, j)
    return move

假设有一个当前的井字游戏状态,你可以调用 best_move 函数来获取最佳移动:

current_state = [
    ['X', 'O', 'X'],
    ['X', ' ', ' '],
    [' ', ' ', 'O']
]
print(best_move(current_state, 'X'))  # 假设是 X 玩家的回合

六、拓展与GANS

Adversary Search 的思想在许多领域有广泛的应用,其中一个重要的衍生是在机器学习领域的对抗生成网络(Generative Adversarial Networks, GANs)。虽然 GANs 的工作机制与传统的 Adversary Search 在游戏理论中的应用有所不同,但它们共享一个核心概念:通过对抗过程来优化性能或生成更精确的结果。

对抗生成网络(GANs)

GANs 是由 Ian Goodfellow 在 2014 年提出的,主要用于生成数据,尤其是在图像生成中表现出色。GANs 包含两个主要的网络组件,生成器(Generator)和判别器(Discriminator),它们在训练过程中相互对抗:

  1. 生成器(Generator)

    • 生成器的任务是创建尽可能接近真实数据的新数据。例如,在图像生成任务中,生成器试图生成新的图像,这些图像看起来像是来自训练集的真实图像。
  2. 判别器(Discriminator)

    • 判别器的任务是区分输入数据是来自真实数据集还是由生成器生成的。其目标是识别出生成器生成的假数据。
训练过程

在 GANs 的训练过程中,生成器和判别器处于一个动态的“博弈”状态:

  • 生成器不断尝试改进其生成的数据以欺骗判别器,使其无法区分真伪。
  • 判别器不断学习更好地识别真假数据,从而准确判断出哪些是生成器生成的。

这个过程可以看作是一个零和游戏,其中生成器的目标是最大化判别器的错误率,而判别器则试图最小化这个错误率。

在对抗搜索中,通常涉及到两个玩家(如井字游戏中的X和O),他们各自尝试通过最大化自己的利益来最小化对方的利益。这与GANs中生成器和判别器的动态非常相似,尽管在GANs中,“利益”通常是关于数据的真实性的。

此外,这种对抗性的动态使得GANs能够在没有明确标签的情况下学习复杂的数据分布,这是其一大优势。例如,在无监督学习任务中,GANs可以生成新的、高质量的样本,从而用于增强数据集或改善机器学习模型的性能。

因此,尽管Adversary Search最初是为游戏设计的策略,但它的核心概念——通过对抗过程寻求优化——已被应用到更广泛的领域,特别是在人工智能和机器学习中。GANs是这种思想的一个典型例子,它表明对抗性机制可以用于创建强大的生成模型,这些模型能够学习并模拟复杂的数据分布。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

张宇1000题/660/880/武忠祥严选题,哪本优先级高?最接近真题?

使用资料&#xff1a; 武老师强化班视频高数辅导讲义严选题 具体操作&#xff1a; 预习讲义10页听课做严选题 情况一&#xff1a;基础阶段跟着武老师并且完成660的同学。 这些同学在强化阶段可以在使用上述资料的基础上&#xff0c;再加一本李林老师的880题。可能有同学不…

论文解读(14)-GeoCLIP

加油&#xff0c;加油&#xff01; 原文&#xff1a; GeoCLIP: Clip-Inspired Alignment between Locations and Images for Effective Worldwide Geo-localization &#xff08;2309.16020 (arxiv.org)&#xff09; 这一篇的重点在于范围放宽到全球了 摘要 首先指出了目前…

opencascade AIS_Triangulation源码学习 每个三角形顶点关联颜色

opencascade AIS_Triangulation 每个三角形顶点关联颜色 前言 交互对象&#xff0c;从 Poly_Triangulation 绘制数据&#xff0c;可选择性地带有与每个三角形顶点关联的颜色。 为了最大效率&#xff0c;颜色以32位整数表示&#xff0c;而不是传统的 Quantity_Color 值。 目前尚…

Swift中@escaping的理解与使用

当我们在一个方法中将一个闭包当做参数的时候&#xff0c;那么就有很大概率用到这个escaping关键字了&#xff0c;试想一般什么时候会将闭包当做参数传进来呢&#xff1f;很多时候比如方法里面有异步操作&#xff0c;需要方法先return&#xff0c;最后再调用闭包返回结果&#…

论数据驱动的优雅:构建轻量高效的数据中台-亿发

随着数据处理需求的不断增长&#xff0c;各类企业都在探索如何更高效地管理和利用数据。特别是在大规模数据应用的背景下&#xff0c;数据中台成为了众多企业优化数据管理的关键解决方案。从数据中台的建设需求到其实际应用&#xff0c;本文将详细解析数据中台的发展历程、建设…

.NET 一款反序列化打入冰蝎内存马的工具

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

用Python编写你的网络监控系统详解

概要 在现代网络管理中,实时监控网络流量和状态是保证网络正常运行的关键。使用Python编写网络监控工具可以帮助管理员及时发现和解决网络问题。本文将详细介绍如何使用Python编写网络监控工具,包括基本概念、常用库及其应用场景,并提供相应的示例代码。 网络监控的基本概念…

nginx反向代理严重错误[crit] (13: Permission denied) while reading upstream问题

nginx作为使用最广泛的一款反向代理软件&#xff0c;其性能也是非常优秀的&#xff0c;一般情况下&#xff0c;直接配置就可以使用&#xff0c;而且也都是稳定高效的&#xff0c;但是在实际应用中&#xff0c;对于不同的应用场景&#xff0c;总是会出现各种各样的问题&#xff…

nanopc-t4线刷Android10编译源码

文章目录 windows线刷Linux编译一撸到底核心编译命令最终Image目录源码和刷机工具放一个目录下线刷走一波,不能有任何报错windows线刷 https://www.myteamcloud.top/?p=266 Linux编译一撸到底 https://blog.csdn.net/wb4916/article/details/134911430 核心编译命令 ./b…

全网首创!基于GaitSet的一种多人步态识别方法公示

有源代码V细聊&#xff0c;可商用/私用/毕设等&#xff1a;NzqDssm16 &#x1f349;1 绪论 经过相关研究确认&#xff0c;步态识别是足以达到应用级别的生物识别技术&#xff0c;在现代社会中自始至终都存在着广泛的应用前景。之所以迟迟没有普及&#xff0c;主要是实…

docker配置阿里镜像加速器

‌阿里云镜像加速的核心功能是通过提供官方的镜像站点&#xff0c;加速官方镜像的下载。使用容器时&#xff0c;由于网络原因&#xff0c;下载‌Docker官方镜像可能会需要很长时间&#xff0c;甚至下载失败。阿里云容器镜像服务‌ACR&#xff08;阿里云容器仓库&#xff09;为此…

智慧大楼信息化一体化管理整体建设设计方案(可编辑80页PPT)

随着信息技术的飞速发展&#xff0c;智慧大楼已成为现代城市建设的重要趋势。本项目旨在通过信息化一体化管理整体建设设计方案&#xff0c;将大楼内的各个系统进行有机整合&#xff0c;实现智能化、高效化的管理与服务。通过该方案&#xff0c;我们期望提升大楼的运营效率、安…

【网络基础】初识网络 {计算机网络背景;网络协议初识;网络传输基本流程;网络中的地址管理;网络设备简单介绍}

一、计算机网络背景 1.1 网络发展 计算机网络的发展可以追溯到20世纪60年代&#xff0c;那时候最初的计算机网络只是为了让科学家们能够共享计算机资源和数据。但是在20世纪80年代&#xff0c;互联网的出现彻底改变了计算机网络的面貌&#xff0c;使得人们可以随时随地通过互…

昇思25天学习打卡营第XX天|Vision Transformer图像分类

好了&#x1f44c;到我最熟悉的模型了&#xff0c;苦苦缠斗几个月呜呜呜 CLIP预训练数据集薄纱了&#xff0c;这个对齐的思路很好&#xff0c;但是对文本图像长度限制更高&#xff0c;作者很可惜

详细分析nohup后台运行命令

目录 1. 基本知识2. Demo 1. 基本知识 Unix/Linux 命令&#xff0c;用于在后台运行程序&#xff0c;并确保它在用户退出或注销后继续运行 nohup 的主要作用是使程序在终端会话结束后继续运行&#xff0c;这对需要长时间执行的任务特别有用 基本的用法如下&#xff1a; nohu…

计算机网络课程介绍

计算机网络课程的核心内容与应用&#xff0c;涵盖多个关键协议与技术的深入理解&#xff0c;旨在全面培养学生的网络设计、分析及实际操作能力。以下是对该课程的严谨阐述&#xff1a; 一、课程核心原理与应用 本课程详尽阐述了IP协议簇的基本原理与应用&#xff0c;具体涵盖I…

Github 2024-08-02Java开源项目日报 Top9

根据Github Trendings的统计,今日(2024-08-02统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目9Vue项目1Ruby项目1Java设计模式:提高开发效率的正规化实践 创建周期:3572 天开发语言:Java协议类型:OtherStar数量:86766 个Fork数…

ECCV 2024 | 深入探索GAN先验,哈工大、清华提出模型反演新方案

介绍 模型反演&#xff08;MI&#xff09;攻击的目的是利用输出信息从已发布的模型中重建隐私敏感的训练数据&#xff0c;这引起了人们对深度神经网络&#xff08;DNNs&#xff09;安全性的广泛关注。近年来&#xff0c;生成对抗网络&#xff08;GANs&#xff09;因其强大的图像…

4.Rabbon-微服务负载均衡

Rabbon-微服务负载均衡 1.Ribbon是什么1.1 基本概念1.2 主要功能1.3 负载均衡流程1.4 负载均衡策略 2.Ribbon如何使用2.1 基于配置文件的配置&#xff1a;2.2 基于注解的配置&#xff1a; 1.Ribbon是什么 Ribbon是Netflix发布的一个负载均衡器&#xff0c;它主要用于控制HTTP和…

PT4103B23F 白光LED升压转换器芯片IC

一般概述 PT4103是一款升压型DC/DC转换器&#xff0c;设计用于以恒流方式驱动单个锂离子电池中的多达8个串联的白光LED。由于PT4103直接调节输出电流&#xff0c;因此它非常适合驱动发光二极管(LED)&#xff0c;其光强度与流经它们的电流成正比&#xff0c;而不是与它们…