当前位置: 首页 > article >正文

用Python实现五子棋AI:从蒙特卡洛树搜索到Alpha-Beta剪枝的完整实战指南

用Python实现五子棋AI从蒙特卡洛树搜索到Alpha-Beta剪枝的完整实战指南五子棋作为经典的双人策略游戏其AI实现一直是算法与工程结合的绝佳试验场。本文将带您从零开始构建一个完整的五子棋AI系统不仅涵盖蒙特卡洛树搜索MCTS和Alpha-Beta剪枝等核心算法更注重如何将这些理论转化为高效、可运行的Python代码。无论您是希望理解现代博弈AI的工作原理还是想亲手打造一个能击败人类玩家的智能对手这篇实战指南都将提供清晰的实现路径。我们将采用模块化开发的思路先构建基础游戏框架再逐步引入高级算法优化。所有代码都经过Colab环境验证您可以直接复制到Jupyter Notebook中运行。特别地我们会对比纯MCTS与结合Alpha-Beta剪枝的混合策略在性能和效果上的差异并分享多个经过实战检验的优化技巧。1. 基础框架搭建1.1 棋盘表示与游戏规则五子棋AI的第一步是建立准确的棋盘表示。我们使用15×15的二维数组用0表示空位1和2分别代表黑白棋子import numpy as np class GomokuBoard: def __init__(self, size15): self.size size self.board np.zeros((size, size), dtypeint) self.current_player 1 # 黑棋先行 def make_move(self, row, col): if self.board[row][col] ! 0: return False # 非法移动 self.board[row][col] self.current_player self.current_player 3 - self.current_player # 切换玩家 return True def check_winner(self): # 检查四个方向是否有五连珠 directions [(1,0), (0,1), (1,1), (1,-1)] for i in range(self.size): for j in range(self.size): if self.board[i][j] 0: continue for di, dj in directions: count 1 for step in range(1,5): ni, nj i di*step, j dj*step if 0 ni self.size and 0 nj self.size: if self.board[ni][nj] self.board[i][j]: count 1 else: break else: break if count 5: return self.board[i][j] return 0 # 无胜负提示使用numpy数组而非列表可以显著提升后续模拟运算的效率特别是在处理大规模随机模拟时。1.2 游戏可视化良好的可视化能帮助我们直观理解AI的决策过程。使用matplotlib可以简单实现import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap def plot_board(board): cmap ListedColormap([white, black, red]) plt.figure(figsize(8,8)) plt.imshow(board, cmapcmap, vmin0, vmax2) plt.grid(colorblack, linestyle-, linewidth0.5) plt.xticks(range(15)) plt.yticks(range(15)) plt.show()2. 蒙特卡洛树搜索实现2.1 树节点设计MCTS的核心是树节点的设计与更新。每个节点需要记录状态当前棋盘局面访问次数该节点被探索的次数累计价值从该节点出发获得的累计奖励子节点可能的后续状态class MCTSNode: def __init__(self, board, parentNone, moveNone): self.board board.copy() self.parent parent self.move move # 导致该状态的落子位置 self.children [] self.visits 0 self.value 0 self.untried_moves self.get_legal_moves() def get_legal_moves(self): return [(i,j) for i in range(15) for j in range(15) if self.board[i][j] 0] def uct_select_child(self, exploration1.414): # 使用UCT公式选择最优子节点 return max(self.children, keylambda c: c.value/(c.visits1e-6) exploration*np.sqrt(np.log(self.visits1)/(c.visits1e-6))) def expand(self): move self.untried_moves.pop() new_board self.board.copy() new_board[move[0]][move[1]] 1 if self.parent else 2 child MCTSNode(new_board, self, move) self.children.append(child) return child def update(self, result): self.visits 1 self.value result2.2 模拟与反向传播完整的MCTS包含四个步骤选择、扩展、模拟和反向传播def mcts(root, iterations1000): for _ in range(iterations): node root # 选择阶段 while node.untried_moves [] and node.children ! []: node node.uct_select_child() # 扩展阶段 if node.untried_moves ! []: node node.expand() # 模拟阶段 result simulate_game(node.board) # 反向传播 while node is not None: node.update(result) node node.parent return max(root.children, keylambda c: c.visits).move def simulate_game(board): # 随机模拟直到游戏结束 temp_board board.copy() current_player 1 while True: legal_moves [(i,j) for i in range(15) for j in range(15) if temp_board[i][j] 0] if not legal_moves: return 0 # 平局 move random.choice(legal_moves) temp_board[move[0]][move[1]] current_player winner check_winner(temp_board) if winner ! 0: return 1 if winner 1 else -1 current_player 3 - current_player3. 算法优化与混合策略3.1 Alpha-Beta剪枝集成纯MCTS虽然强大但计算成本高。结合Alpha-Beta剪枝可以显著减少搜索空间def alpha_beta_search(node, depth, alpha-float(inf), betafloat(inf), maximizing_playerTrue): if depth 0 or node.is_terminal(): return evaluate_position(node.board) if maximizing_player: value -float(inf) for child in node.children: value max(value, alpha_beta_search(child, depth-1, alpha, beta, False)) alpha max(alpha, value) if alpha beta: break # Beta剪枝 return value else: value float(inf) for child in node.children: value min(value, alpha_beta_search(child, depth-1, alpha, beta, True)) beta min(beta, value) if alpha beta: break # Alpha剪枝 return value3.2 混合策略实现将MCTS与Alpha-Beta剪枝结合形成混合策略使用MCTS进行全局探索构建搜索树对关键节点应用Alpha-Beta剪枝进行局部精细搜索结合估值函数优先探索高潜力区域class HybridAI: def __init__(self): self.mcts_iterations 500 self.ab_depth 3 def get_move(self, board): root MCTSNode(board) best_move mcts(root, self.mcts_iterations) # 对最佳候选进行精细搜索 best_node [c for c in root.children if c.move best_move][0] score alpha_beta_search(best_node, self.ab_depth) # 如果发现更好选择则调整 for child in root.children: current_score alpha_beta_search(child, self.ab_depth//2) if current_score score: best_move child.move score current_score return best_move4. 高级优化技巧4.1 并行模拟加速利用Python的multiprocessing实现并行模拟from multiprocessing import Pool def parallel_simulate(args): board, player args return simulate_game(board, player) def parallel_mcts(root, iterations1000, workers4): with Pool(workers) as p: for _ in range(iterations//workers): nodes [root] * workers results p.map(parallel_simulate, [(n.board, 1) for n in nodes]) for res in results: node root while node is not None: node.update(res) node node.parent4.2 开局库与模式识别建立常见开局模式库可以大幅提升初期决策效率opening_book { # 中心开局 empty_board: [(7,7)], # 对角开局 diagonal: [(7,7), (8,8), (7,9), (6,8)], # 边角开局 corner: [(0,0), (0,14), (14,0), (14,14)] } def check_opening(board): move_sequence [] for i in range(15): for j in range(15): if board[i][j] ! 0: move_sequence.append((i,j,board[i][j])) for name, pattern in opening_book.items(): if len(move_sequence) len(pattern): match True for (i,j,_), (pi,pj) in zip(move_sequence, pattern): if i ! pi or j ! pj: match False break if match: return name return None4.3 记忆化与缓存通过缓存常见局面评估结果减少重复计算from functools import lru_cache lru_cache(maxsize100000) def evaluate_position(board_tuple): board np.array(board_tuple).reshape(15,15) # 评估逻辑... return score在实际测试中基础MCTS AI在1000次模拟/步的设置下需要约3秒/步而经过优化的混合策略AI能将响应时间缩短到0.5秒/步同时保持相当的棋力。对于需要快速响应的场景可以动态调整模拟次数——在局势复杂时增加计算资源在简单局面下快速决策。

相关文章:

用Python实现五子棋AI:从蒙特卡洛树搜索到Alpha-Beta剪枝的完整实战指南

用Python实现五子棋AI:从蒙特卡洛树搜索到Alpha-Beta剪枝的完整实战指南 五子棋作为经典的双人策略游戏,其AI实现一直是算法与工程结合的绝佳试验场。本文将带您从零开始构建一个完整的五子棋AI系统,不仅涵盖蒙特卡洛树搜索(MCTS&…...

mPLUG视觉问答体验:无需联网,上传图片问问题,AI帮你分析细节

mPLUG视觉问答体验:无需联网,上传图片问问题,AI帮你分析细节 1. 引言:让图片开口说话的智能助手 想象一下这样的场景:你正在整理旅行照片,看到一张复杂的街景照片,想知道画面中有多少个人、他…...

【开题答辩全过程】以 基于python的天气预测可视化系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

污水口水质在线监测系统方案

水污染治理工作中,实现排水口、入河口等场景的监测是第一步。建立高效可靠的污水口水质在线监测系统,能够快速识别异常故障信息,从而快速定位诊断采取措施,确保水污染得到及时管控,避免污染事故扩大。通过水利水文网关…...

华为设备实战:3种代理ARP配置全解析(路由式+VLAN内+VLAN间)

华为设备代理ARP配置实战指南:从原理到场景化部署 在复杂的企业网络环境中,代理ARP(Proxy ARP)技术常常是解决特定连通性问题的"秘密武器"。作为网络工程师,你是否遇到过这样的场景:两个 logica…...

HuggingFace模型下载路径修改指南:告别~/.cache/huggingface爆盘困扰

HuggingFace模型下载路径修改指南:告别~/.cache/huggingface爆盘困扰 你是否也遇到过这样的场景:兴致勃勃地准备跑一个最新的开源大模型,结果huggingface-cli download命令一执行,系统盘瞬间飘红,紧接着就是令人头疼的…...

Ghidra vs IDA:逆向工具对比与Java脚本开发指南

Ghidra vs IDA:逆向工程双雄的深度对比与Java脚本开发实战 逆向工程领域的两大标杆工具——Ghidra与IDA Pro,长期占据着安全研究人员的工具箱。本文将深入剖析两者的设计哲学差异,并通过实际案例展示如何利用Ghidra的Java脚本扩展能力构建自动…...

提示词的时代快结束了,下一个是什么?

前两天我做了一件事,让我对Al的理解彻底变了。 在MiniMax Agent中,有一项实用的Expert功能。无论你擅长哪个领域,都能将自己积累的相关经验、成熟的工作流程以及核心判断标准,用通俗的自然语言进行梳理描述,进而封装成…...

DailyTxT+cpolar 打造专属私密日记,外网也能安全看!告别数据泄露!

DailyTxT 是一款主打隐私保护的开源私人日记系统,核心功能围绕日常日记记录展开,支持文字撰写、日期归档、关键词搜索、图片上传以及内容收藏等实用操作,适配想要记录生活、工作点滴,又注重数据隐私的人群 —— 比如职场人记录工作…...

Keil MDK 5.38a实战:3分钟搞定Hex文件生成与烧录(Windows 11环境)

Keil MDK 5.38a高效开发指南:Hex文件生成与烧录全流程解析 在嵌入式开发领域,时间就是竞争力。当项目进入交付阶段,如何快速生成可执行文件并完成烧录,往往成为工程师们最关心的实际问题。特别是在Windows 11环境下使用Keil MDK 5…...

快速体验AI视觉定位:Chord模型Web界面使用详解,上传图片+输入文字=获得结果

快速体验AI视觉定位:Chord模型Web界面使用详解,上传图片输入文字获得结果 1. 引言 你有没有想过,如果电脑能像人一样,看着一张图片,然后根据你的文字描述,准确地找到图片里的某个东西,那该多方…...

使用mPLUG-Owl3-2B构建智能Mathtype公式编辑器:自然语言转数学表达式

使用mPLUG-Owl3-2B构建智能Mathtype公式编辑器:自然语言转数学表达式 让数学公式编辑像说话一样简单 还记得上次写论文时,被复杂的数学公式折磨得焦头烂额的情景吗?一个个符号手动输入,稍有不慎就格式错乱,检查起来更是…...

实测GLM-4V-9B:单卡24G显存,轻松运行最强开源视觉语言模型

实测GLM-4V-9B:单卡24G显存,轻松运行最强开源视觉语言模型 如果你正在寻找一个既能看懂图片,又能用中文和你流畅对话,还能在单张消费级显卡上就跑起来的AI模型,那么GLM-4V-9B可能就是你的答案。 这个由智谱AI在2024年…...

漂亮大气的酒店和旅游业务预订网站模板WordPress主题

HotelBooking是干净的酒店预订设计WordPress主题,适合所有酒店和旅游业务在线预订。模板有一个专门的页面,显示所有住宿细节的预订系统。主题还包括一个简单的搜索过滤器系统,显示所有可以预订的房间。这个WordPress酒店预订模板是100%的响应式设计,在所…...

嵌入式C语言代码优化实战:从编译器到硬件的性能调优

1. 嵌入式C语言代码优化的工程实践指南嵌入式系统开发中,资源约束是永恒的主题。MCU的Flash容量、RAM空间、主频带宽和功耗预算共同构成了硬性边界。在这些边界内,代码执行效率直接决定系统响应能力、实时性保障和电池续航时间。本文基于多年嵌入式硬件项…...

5G核心网核心之辨:从服务化架构(SBA)到网络切片的深度实践解析

前言作为一名通信领域的开发者,在从4G LTE向5G转型的过程中,我深刻感受到:5G不仅比4G多了一个G,它本质上是一次架构层面的彻底重构。4G核心网(EPC)依赖于紧耦合的网元(MME, PGW, SGW&#xff09…...

OFA-VE在金融领域的应用:票据识别与理解

OFA-VE在金融领域的应用:票据识别与理解 1. 引言 金融票据处理一直是银行、保险和会计行业的痛点。每天都有成千上万的发票、支票、汇票需要人工审核,不仅效率低下,还容易出错。传统的光学字符识别(OCR)技术虽然能识…...

STM8 CAN总线Bootloader设计与实现

1. STM8单片机CAN总线Bootloader设计与实现在工业现场、车载电子及长期部署的嵌入式设备中,产品完成量产封装后,物理访问调试接口(如SWIM、JTAG、SWD)往往不可行。当用户端出现功能缺陷或需迭代新特性时,必须依赖远程固…...

OpenClaw+CC Switch:小白也能配置好的小龙虾(2026最新)

在日常 AI 接口开发中,很多开发者都遇到过这样的困境:直连官方 API 不稳定、延迟高,多个供应商的 Key 难以统一管理,项目切换渠道时还要频繁改代码。本文将介绍一套基于 OpenClaw CC Switch 的本地 AI 网关方案,帮你用…...

CD4013触发器实战:如何用双稳态电路驱动继电器(附防烧线圈技巧)

CD4013触发器实战:双稳态电路驱动继电器的工程级解决方案 从理论到实践的跃迁:为什么选择CD4013驱动继电器? 在电子控制系统中,继电器作为强电与弱电之间的桥梁,其稳定性和可靠性直接影响整个系统的运行质量。传统晶体…...

涛的天道观【其九十一】真正的能力

真正的能力是不能依靠任何单位组织依然具备收入或者其他创造的(含生产力),所以成为公司领导、单位干部或拿多少收入都是依靠组织生存的方式。所以工作和生活要分开,不要太卷加班,不要太消耗自己到生存方式中。只有不断…...

51汇编仿真Proteus8.15实战篇一(附源码)

1. 从零搭建你的第一个51汇编仿真项目 第一次接触51单片机和Proteus仿真时,我完全被那些闪烁的LED迷住了。记得当时为了让一个小灯按我的想法亮灭,折腾了整整一个下午。现在回头看,那些踩过的坑都成了宝贵的经验。今天我们就用Proteus 8.15&a…...

解决Quartus 18.1下载失败的5个常见问题:以USB-Blaster配置为例

解决Quartus 18.1下载失败的5个常见问题:以USB-Blaster配置为例 在FPGA开发过程中,Quartus Prime 18.1作为Altera(现Intel FPGA)的主流开发工具,其程序下载环节往往是项目落地的最后一道关卡。然而,许多开发…...

为什么说地平线被低估了?

文|刘俊宏 编|王一粟2025年,是智驾行业势如破竹的一年。在这一年里,高阶智驾渗透率迎来爆发式增长。20万元以内主流市场,智能车比重从年初的5%陡峭上升至年底50%以上,“高阶智驾人人可享”已经成为现实。智…...

Qwen3-32B-Chat多场景落地:智能写作助手、会议纪要生成、研发文档自动摘要案例

Qwen3-32B-Chat多场景落地:智能写作助手、会议纪要生成、研发文档自动摘要案例 1. 私有部署镜像介绍 1.1 硬件与软件配置 本镜像专为RTX 4090D 24GB显存显卡优化,包含以下核心组件: 基础模型:Qwen3-32B完整权重计算框架&#…...

Newtonsoft.Json 高级玩法:用 JsonSerializerSettings 定制你的 JSON 序列化规则

Newtonsoft.Json 高级玩法:用 JsonSerializerSettings 定制你的 JSON 序列化规则 在数据交换和存储的场景中,JSON 格式因其轻量和易读性而广受欢迎。对于 C# 开发者来说,Newtonsoft.Json(现称 Json.NET)无疑是处理 JSO…...

贾子德道定理 (Kucius De-Dao Theorem):能力与德行的平衡铁律——AI时代的文明生存法则

贾子德道定理 (Kucius De-Dao Theorem):能力与德行的平衡铁律——AI时代的文明生存法则摘要:贾子德道定理(2026年3月)揭示,外在优势(美丽、聪明、才华、智能)若缺乏内在德…...

CVPR/ICCV/ECCV傻傻分不清?一图看懂计算机视觉顶会命名规律与投稿指南

计算机视觉顶会命名密码:从CVPR到ICCV的学术地图导航 当你在深夜实验室对着投稿系统犹豫不决时,是否曾被CVPR、ICCV、ECCV这一串字母游戏绕晕?这些看似随意的缩写背后,藏着计算机视觉领域四十年的演进密码。让我们拨开迷雾&#x…...

用Python和GNU Radio玩转USRP:从环境搭建到第一个FM收音机实战

用Python和GNU Radio玩转USRP:从环境搭建到第一个FM收音机实战 引言:为什么选择GPP-Based SDR? 想象一下,你手边有一台普通笔记本电脑和一块USRP设备,就能搭建起一个功能完整的FM广播接收站。这种看似科幻的场景&#…...

Kepware OPC UA服务端配置全攻略:从匿名登录到用户名密码验证(附UaExpert连接教程)

Kepware OPC UA服务端安全配置实战:从匿名访问到用户认证的完整指南 在工业自动化领域,数据通信的安全性和可靠性至关重要。OPC UA作为新一代工业通信标准,正在逐步取代传统的OPC DA协议,成为设备间数据交换的首选方案。而Kepware…...