五子棋 AI(二)极大极小搜索 + 剪枝

本文介绍了如何利用极大极小搜索和alpha-beta剪枝优化五子棋AI。通过避免转换二维棋盘为一维,使用全局数组记录棋局得分,并优化搜索过程,减少无效计算。同时,通过策略优化,如优先考虑中心位置的落子,直接判断胜负棋型,减少了搜索节点,使得6层搜索能在几秒内完成,提高了AI的响应速度和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​​五子棋(一)

 博客搬家:最爱午后红茶

源码以及演示地址:https://github.com/QYPan/gobang

如果在落子的时候往后推算几步,可以大概估算一下复杂度。如果往后推算 4 步走法,即给自己和对方各推算两步,每步计算 50 个可落子点;那总共需要计算 50^4 = 6,250,000 个结点;这是一颗非常巨大的博弈树;程序的实际情况是每秒大约算 10000 个结点(有点慢~),那将需要 600 多秒才可确定下一步落子,这样的结果是不可接受的。还有一点就是,推算的层数最好是偶数,因为如果是奇数的话,最后一步并没有考虑到对方落子,防御力会降低。

在这颗博弈树中用极大极小的方法去计算计算机的下一步落子,可以使计算机为 MAX 层,玩家为 MIN 层。我们可以使用 alpha-beta 剪枝来实现搜索的优化。(博弈基础)

在源代码的 computer.c -> alpha_beta()

// 初始值 player = 0, depth = 0, alpha = -inf, beta = inf
alpha_beta(player, depth, alpha, beta)
begin
	if 成五 then 
		返回结果(inf or -inf)
	endif
	if depth >= depth_limit then
		返回估值
	endif

	if(!player) then // 计算机
		if !depth then // 在搜索入口层
			// 取落子坐标
			y = p[0].y
			x = p[0].x
		endif
		n = cal_points(p[]) // 计算所有可落子点的得分并记录在数组 p[]
		for i = 0; i < n; i++ 
			set_in(p[i].y, p[i].x) // 落子
			val = alpha_beta(player^1,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值