alpha-beta剪枝算法

article/2025/9/28 23:24:21

实验报告

alpha-beta剪枝算法

姓名:张楚明 学号:18342125 日期:2021.01.15

摘要

本实验将搜索深度为4的Alpha-Beta剪枝算法应用于中国象棋中黑方走棋,实现了中国象棋的人机博弈。博弈过程中综合考虑了棋力对敌方棋子的攻击力对己方棋子的保护能力棋子的灵活性及其位置等多种因素计算当前棋子的评估值

使用说明

vscode打开文件夹运行main.py即可(其中相应版本为Python3.8.2Pygame1.9.6

1. 导言

  • (1) 要解决的问题描述,问题背景介绍;

    目前国际上很多AI都是靠在棋类方面战胜人脑来衡量自身的智能,且五子棋、围棋等相关棋类AI目前已经能够战胜人类脑力,但由于中国象棋起步晚且复杂度高,设计相应的能够战胜人类顶尖棋手的AI仍然没有很好的实现。在本实验中,我们基于alpha-beta剪枝算法,综合考虑了棋力、对敌方棋子的攻击力、对己方棋子的保护能力、棋子的灵活性及其位置等多种因素计算当前棋子的评估值

  • (2) 拟使用的方法,方法的背景介绍;

    AlphaBeta剪枝算法是一个搜索算法旨在减少在其搜索树中,被极大极小算法评估的节点数。这是一个常用人机游戏对抗的搜索算法。它的基本思想是根据上一层已经得到的当前最优结果,决定目前的搜索是否要继续下去。

    Alpha-Beta只能用递归来实现。这个思想是在搜索中传递两个值,第一个值是Alpha,即搜索到的最好值,任何比它更小的值就没用了,因为策略就是知道Alpha的值,任何小于或等于Alpha的值都不会有所提高。

    第二个值是Beta,即对于对手来说最坏的值。这是对手所能承受的最坏的结果,因为我们知道在对手看来,他总是会找到一个对策不比Beta更坏的。如果搜索过程中返回Beta或比Beta更好的值,那就够好的了,走棋的一方就没有机会使用这种策略了

2. 实验过程

  • (1) 所用的具体的算法思想流程;

    • 轮到黑方走棋时,遍历当前走棋方棋子生成所有可能的走棋作为解空间
    • 调用alpha-beta剪枝算法遍历解空间,根据评估值设置剪枝
    • 根据棋力、攻击力、保护力、棋子灵活性及其位置计算当前棋盘的评估值
  • (2) 实现算法的程序主要流程,功能说明;

    • alpha-beta剪枝算法的伪代码如下,本文实现中引入负号来交替计算每一层取最大值/最小值(详见代码actions.py line38

      def AlphaBeta():if depth == 0 or node为叶节点:计算并返回当前棋盘的估计值作为alpha或者beta用于剪枝if 当前层求max(beta)剪枝:遍历解空间中所有的走棋:递归生成下一层的解并与其比较取最大值val = self.AlphaBeta(depth - 1, alpha, beta)alpha = max(val, alpha)进行beta剪枝if alpha >= beta:breakreturn alphaelse 当前层求min(alpha)剪枝:遍历解空间中所有的走棋:递归生成下一层的解并与其比较取最小值val = self.AlphaBeta(depth - 1, alpha, beta)beta = min(val, beta)进行alpha剪枝if alpha >= beta:breakreturn alpha
      
    • 评估值计算详解:

      评估值 = 当前棋盘所有棋子的棋力之和 + 当前棋盘所有棋子的攻击力之和 + 当前棋盘所有棋子的防守力 + 当前棋盘所有棋子灵活性和位置棋力之和

    • 棋力值设置如下

      • 因为加上了灵活性、位置、攻击力和防守力评估,兵和卒不分为是否过河、是否到底线
      • 帅/将设置为整型最大值sys.maxsize
      • 原为根据百度百科设置,以下是经过对此测试对比后效果较好的棋力值
      属性兵/卒帅/将
      棋力80300500300250250sys.maxsize
    • 攻击力

      • 将棋子的攻击力定义为在所有可能的走棋中能攻击到的敌方棋子的棋力之和
    • 防守力

      • 将棋子的防守力定义为在所有可能的走棋中能保护到的己方棋子的棋力之和的一半(调整对应系数使之攻击欲望大于防守欲望)
    • 棋子灵活性设置如下

      属性兵/卒帅/将
      灵活性1151512630
    • 棋子位置

      • 为每类棋子在棋盘中的位置赋予得分(考虑到效率问题,只计算每个棋子在棋盘的位置,没有考虑棋子间的相对位置),详见constants.py line40
  • 经过上课演示后得到老师和同学的启发做了如下改进

    • 计算棋力时引入棋子灵活性和位置(见上评估值详解)

    • 引入历史启发算法增加搜索树的效率,效率增高后可以适当提高搜索深度以增强程序的智能性(详见代码actions.py line19

      根据部分已经搜索的结果来调整将要搜索的结点的顺序。通常一个局面经搜索被认为较好时,在其后继结点中往往有一些相似的局面(如某些无关紧要的棋子位置有所不同)也是较好的。在搜索的过程中,每当找到一个好的走法,就给该走法累加一个增量以记录其“历史得分”,一个多次被搜索并认为是好的走法的“历史得分”就会较高。对于即将搜索的结点,按 “历史得分”的高低对它们进行排序,保证较好的走法排在前面,Alpha-Beta搜索就可以尽可能早地进行“裁剪”,从而保证了搜索的效率

    • 随着棋盘中棋子数的减少逐渐增加搜索深度,以增强电脑残局能力

      搜索深度 = int(8 - 存活棋子数 / 8),场上的棋子每减少8个双方搜索深度各加1

3. 结果分析

  • (1) 交代实验环境,算法设计的参数说明;

    Python3.8.2,Pygame1.9.6。参数和使用说明见上

  • (2) 结果(图或表格),比如在若干次运行后所得的最好解,最差解,平均值,标准差。

    中间有展示按回车重新开始

    在这里插入图片描述

  • (3) 分析算法的性能,包括解的精度,算法的速度,或者与其他算法的对比分析。

    算法的性能较低,目前搜索四层需要1s左右的时间,节点数根据存活棋子数量减少而降低,基本小于5000;由于效果已经较好(本人多次尝试无法战胜AI),所以没有尝试继续增加搜索深度的情况。

  • (4) 算法的优缺点;本实验的不足之处,进一步改进的设想。

    • 优点

      • 按照课堂上老师和同学的建议进行了完善(具体见上第二点实验过程最后部分)

      • 实现了重开、对当前选中棋子的位置和可能的走步进行了UI展示

      • 每次AI走棋时搜索的节点数和搜索时间也都进行了UI展示

    • 缺点

      • 搜索效率仍然较低
      • 开局较慢,寻找开局库时发现很多都是js相关资源,暂时不知道如何引入本文实验中的python程序
    • 进一步改进的设想

      • 查阅文献后得可以引入hash表结构加快搜索速度,提高搜索效率
      • 以后可以考虑引入一些简单且常见的开局库(中炮对反宫马、中炮对屏风马)

结论

  • 静态估计函数是本实验得关键,可以修改棋力、攻击力、防守力对应系数、位置棋力等等因素以达到更好的效果,为了保证较好的效果,4层搜索深度是必要的,所以要引入开局库、历史启发算法等加快搜索速度,以便在深度搜索时仍能保持较高的性能。

  • 之前一直好奇人机对战的游戏、比如电脑自带的一些棋类游戏如何设置难度等级,经过这次试验后明白了可以设置搜索树深度、或者应用深度学习时设置其网络层数来达到控制难度的目的。本文实现中实验深度为2时AI表现不够智能(未引入开局库的情况),如下:(实验深度为4时较为智能,具体见上动图,这里不再展示)
    在这里插入图片描述

主要参考文献

  • 极大极小α-β剪枝算法
  • 基于alpha-beta剪枝搜索算法的中国象棋游戏设计-【信息通信期刊】
  • 象棋百科全书

http://chatgpt.dhexx.cn/article/AydKlMJS.shtml

相关文章

透析极大极小搜索算法和α-β剪枝算法(有案例和完整代码)

文章目录 前言minimax算法完整代码算法思想代码实现算法优化 α-β剪枝算法完整代码算法思想代码实现算法对比更多案例 结语 前言 先做了一版五子棋的小项目,后面又做了一个功能更强大的中国象棋的项目,但是始终都没有实现一版“智能”AI。 明知道这类博…

决策树后剪枝算法(二)错误率降低剪枝REP

​  ​​ ​决策树后剪枝算法(一)代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法(二)错误率降低剪枝REP  ​​ ​决策树后剪枝算法(三)悲观错误剪枝PEP  ​​ ​决策树后剪枝算法(四&…

C++实现的基于αβ剪枝算法五子棋设计

资源下载地址:https://download.csdn.net/download/sheziqiong/85883881 资源下载地址:https://download.csdn.net/download/sheziqiong/85883881 基于αβ剪枝算法的五子棋 五子棋介绍 简介: 五子棋是世界智力运动会竞技项目之一&#x…

决策树后剪枝算法(四)最小错误剪枝MEP

​  ​​ ​决策树后剪枝算法(一)代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法(二)错误率降低剪枝REP  ​​ ​决策树后剪枝算法(三)悲观错误剪枝PEP  ​​ ​决策树后剪枝算法(四&…

计算机博弈 基础算法 阿尔法-贝塔剪枝算法 α-β剪枝算法

计算机博弈大赛中 α-β剪枝算法剪枝算法是极大极小算法的一种优化,可以更快的搜索博弈树 预备知识: 广度优先搜索(BFS) 深度优先搜索(DFS) 极大极小算法(MaxMin算法) 介绍 剪枝算法来源于极大极小算法,在博弈树分枝过多时可以使用这个方法…

卷积神经网络通道剪枝算法小结

一、剪枝分类 目前常见的模型剪枝算法主要分成两类,即非结构化剪枝与结构化剪枝;在不少的神经网络加速器中已经应用了这些剪枝算法,早期常见的是非结构化剪枝,例如MIT的韩松组的前几年的相关工作中就有此类应用,但是在…

最大最小法及α-β剪枝算法图解

(网上讲的都不是很好理解,贡献一下之前听慕课做的笔记,适合初学者比较简洁明了。) 要想理解α-β剪枝算法,必须从最大最小法的博弈问题讲起!注意不懂的同学不要跳过这一节。 最大最小法 场景:…

剪枝算法实现一字棋-C++

博弈树 alpha & beta剪枝算法实现一字棋 剪枝算法首先就是要理解,把这个算法彻底弄清楚,我觉得这是一件非常有意义的事情!为后续书写其它棋类的AI打下了坚实的基础 剪枝操作的实现,遍历下一步所有可能取到的点,…

模型压缩:剪枝算法

过参数化主要是指在训练阶段,在数学上需要进行大量的微分求解,去捕抓数据中的微小变化信息,一旦完成迭代式的训练之后,网络模型推理的时候就不需要这么多参数。而剪枝算法正是基于过参数化的理论基础而提出的。 剪枝算法核心思想…

人工智能算法模型--Alpha-Beta剪枝算法学习笔记

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪 (*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &a…

理解Alpha-Beta 剪枝算法

Alpha-beta剪枝是一种搜索算法,用以减少极小化极大算法(Minimax算法)搜索树的节点数。裁剪搜索树中没有意义的不需要搜索的树枝,提高运算速度。 搜索中传递两个值。 第一个值是Alpha,即搜索到的最好值,任何…

组合总和(剪枝算法)

组合总和(剪枝算法) 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复被选取 示例 示例 1:输入: candidates [2,…

Alpha-Beta剪枝算法原理

1. 前言 前文:极小化极大(Minimax)算法原理 极小化极大算法在完全信息零和博弈中,基于己方努力使得在N步后优势最大化(即评估函数输出值最大化)和对方努力使得N步后己方优势最小化这两个出发点&#xff0c…

GRNN广义回归神经网络

广义回归神经网络 GRNN (General Regression Neural Network) 广义回归神经网络是基于径向基函数神经网络的一种改进。 结构分析: 可以看出,这个结构与之前我们所讲过的径向基神经网络非常相似,区别就在于多了一层加和…

m分别使用BP神经网络和GRNN网络进行时间序列预测matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 广义回归神经网络是径向基神经网络的一种,GRNN具有很强的非线性映射能力和学习速度,比RBF具有更强的优势,网络最后普收敛于样本量集聚较多的优化回归&#xff…

广义回归神经网络(GRNN)

广义回归神经网络(GRNN) 一、GRNN神经网络概述 二、GRNN神经网络理论基础(如果对理论不感兴趣可直接看GRNN网络结构,网络结构理解更直观) 三、GRNN的网络结构 注意:一定要理解第三个求和层的概念&#xff0…

【GRNN情绪识别】基于GRNN神经网络的情绪识别算法matlab仿真

1.软件版本 matlab2021a 2.本算法理论知识 GRNN,即General Regression Neural Network,中文全称为广义回归神经网络,是由The Lockheed Palo Alto研究实验室在1991年提出的。GRNN是一种新型的基于非线性回归理论的神经网络模型[43,44]。GRN…

m基于C3D-hog-GRNN广义回归神经网络模型的人员异常行为识别算法的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 实时的人群异常行为识别是一项极具挑战的工作,具有较高的现实意义和社会需求,快速准确地判断出异常行为并及时预警,一直是我们探索的方向。传统的机器学习算法…

基于BP神经网络/GRNN神经网络的电力预测matlab仿真

目录 一、理论基础 二、案例背景 三、MATLAB程序 四、仿真结论分析 一、理论基础 BP神经网络,即Back Propagation神经网络,其本质是一种基于误差反馈传播的神经网络算法。从结构上讲,BP神经网络是由一个信息的正向传播网络和一个误差的反…

RNN CNN GCN

RNN CNN GCN 属于深度学习领域——图像识别 主要用于识别提取图像的特征 CNN:对象是图片,一个二维结构,其主要核心是有一个kernel小窗口,用于图片的平移,然后再利用卷积来提取图片的特征。 RNN:针对一维结构,主要利用…