找回密码
 立即注册
搜索
热搜: 活动 交友
查看: 301|回复: 6

五子棋棋力提升计划(2) 深度搜索

[复制链接]

15

主题

37

回帖

1296

积分

版主

积分
1296
发表于 7-30-2025 16:50:20 | 显示全部楼层 |阅读模式
在课堂上我们的五子棋程序有最基本的棋型判断,但是并不具有“前瞻性”。我们可以利用Minimax算法来解决这一问题。该算法基于当前状态推测对我方最有利而对方最不利的落子点位,同时假设对方会在对对方最有利而对我方最不利的点位落子。α-β剪枝搜索是Minimax算法的一个优化。
下面是实现上述逻辑的伪代码:
  1. # Minimax算法框架:
  2. # - 最大化己方收益,最小化对方收益
  3. # - 通过深度搜索模拟未来几步的可能走法
  4. # - alpha表示己方保证的最低分,beta表示对方保证的最高分
  5. # - 当alpha >= beta时,可以剪枝停止搜索该分支
  6. def recursive_search(board,turn,depth,a,b):
  7.     if depth<=0:
  8.         return 静态评估棋盘的价值
  9.     生成有价值的下一招候选集合(取决于你怎么判断有价值,可以将所有空白点位设为下一招,也可以将有邻居的空白点位设为下一招,或者别的方法也行)
  10.     for 下一招 in 下一招候选集合:
  11.         取出下一招的x,y
  12.         board[y][x]=turn #假设这一步是己方下,注意此处的己方可能是我方,也可能是对方,会交替更换
  13.         score=-self.recursive_search(board,对方的turn(交替落子方),depth-1,-b,-a) #深度搜索,score由静态评估棋盘的价值一层层传递上来
  14.         board[y][x]=0 #深度搜索后重置
  15.         if score>a:
  16.             a=score #a是此前最好的评分,但是现在被更新了
  17.             认为(x,y)是局部最优解
  18.             if a>=b:
  19.                 break
  20.         更新当前最优解为(x,y)
  21.     return a
复制代码
在实现这一算法后,棋力将有很大提升。







15

主题

37

回帖

1296

积分

版主

积分
1296
 楼主| 发表于 7-30-2025 16:55:54 | 显示全部楼层
如果可以判断双三、三四、双四等棋型,同时加以4层搜索,即可做杀。6层的做杀很隐蔽。楼主第一届参赛程序的搜索只有6层

12

主题

34

回帖

951

积分

资深程序员

积分
951
发表于 8-1-2025 03:51:30 | 显示全部楼层
大佬a和b这两个参数的含义有点没看懂啊,什么叫“保证”的最高/最低分?

15

主题

37

回帖

1296

积分

版主

积分
1296
 楼主| 发表于 8-3-2025 13:12:34 | 显示全部楼层
脆脆大奶酪 发表于 8-1-2025 03:51
大佬a和b这两个参数的含义有点没看懂啊,什么叫“保证”的最高/最低分?

a是我觉得我是 b是不要你觉得 要我觉得

12

主题

34

回帖

951

积分

资深程序员

积分
951
发表于 前天 02:34 | 显示全部楼层
Ray 发表于 8-3-2025 13:12
a是我觉得我是 b是不要你觉得 要我觉得

连夜研读链接里的文章终于理解了。
以防有同学和我一样第一眼没看懂,先从minimax搜索讲讲我的理解:
minimax的原理是始终从我方视角来评估当前局面分数,同时假设对手总能做出最优(即对我方最不利而对对方最有利)的决策。
那么很自然地,我方应该选择分数最高的,而对方则会选择分数最低的(注意此处的“分数”均指对我方而言局面的好坏,因此对对方最有利的选择就是分数最低的)
简单做了张决策树示意图:

假设我方执白,红色的×表示下一步可能走的位置(其实理论上棋盘上每个空位都能走,这里为了简化人为挑了几个看起来好一点的走法)
箭头指向的是走出某一步后的局面,此时轮到另一方走棋,红色的×同样表示再下一步可能走的位置
这里我假定是搜索三层,所以第三层箭头指向的叶子节点就直接用局面的静态分值代替了(具体分值自己瞎脑补的,仅作示意)
可以看到图中每层的节点分为两类:轮到我方走棋和轮到对方走棋。轮到我方走棋的节点分值即为子节点分值的最大值,反之则为最小值,这样从下往上推出了根节点得分。
这里要注意这个根节点的得分并非是真正的“最优解”,而是在最坏情况下(即对手始终做出了最合适的选择)我方能获得的最高分,换言之,这个得分只是个“下限”,在走完这步后完全有可能因为对手的应对失误而最终获得更高的局面分数。
理解不一定完全准确,希望可以给同样的初学者提供一些思路

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

15

主题

37

回帖

1296

积分

版主

积分
1296
 楼主| 发表于 前天 10:40 | 显示全部楼层
脆脆大奶酪 发表于 8-11-2025 02:34
连夜研读链接里的文章终于理解了。
以防有同学和我一样第一眼没看懂,先从minimax搜索讲讲我的理解:
min ...

主播图文并茂的理解非常深刻!需要注意的是,这个算法有一个短视的局限性,即假设对方认为的好与坏和你认为的好与坏相同。这一点在连续活三/连续冲四时是成立的(不堵就死了),但是在前期评估棋盘时就会显得乏力。因此,我们可以考虑使用特判来区分“前期” “中期”和“杀招”,进行分治。这一想法是比较自然的

15

主题

37

回帖

1296

积分

版主

积分
1296
 楼主| 发表于 前天 15:31 | 显示全部楼层
ab搜索就是在minimax搜索的基础上,记录了到此为止我方可以保证最好的评分&到此为止对方可以得到的最好的评分,并将相对差/没有吸引力的分支剪除。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RealDevClub ( 沪ICP备2024093864号-1 )

GMT+8, 8-13-2025 17:03 , Processed in 0.329342 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表