paperplane110 / resume-nuxt

A static portfolio framework build with Nuxt3 and Vue3
https://tyyuan110.com/
5 stars 0 forks source link

Add AI to Gobang Game #26

Open paperplane110 opened 1 year ago

paperplane110 commented 1 year ago

Alpha-Beta pruning: https://www.jiqizhixin.com/graph/technologies/56dbb21e-c3f9-4e06-b16a-2e28f25b26c8

paperplane110 commented 1 year ago

Todo:

paperplane110 commented 1 year ago

评估函数

links:https://github.com/lihongxun945/myblog/issues/13

按照教程,评估函数返回的是整个棋盘的分数,而非某一位置的分数。

若一个一个点的遍历,对于每个点进行九个方向延伸,数棋型,会出现重复数同一个棋型的情况,这也是我想了很久没想通的地方。

今天想到了另一种方法来评估,

  1. 从四个方向(横,纵,撇,捺)来遍历棋盘,每次取一行
  2. 使用滑动窗口的方法来评估这一行这个方向上的分数
  3. 最后汇总即为总分数

首先列出棋型,简化了对称的情况:1(黑,ai),2(白,玩家,棋盘边界)

注意:

paperplane110 commented 1 year ago

image

可能有bug

paperplane110 commented 1 year ago

问题在于由于滑动窗口,活三匹配上两次: 011100, 001110

需要添加校验逻辑,在一次 evalLine 中,同一棋子不能被两个 pattern 匹配上

或者扩展pattern为:0011100, 2011100,0011102

同理:

paperplane110 commented 1 year ago

Alpha-Beta 剪枝

image

paperplane110 commented 1 year ago

实现ab剪枝后,目前ai可以搜索四层,每次搜索125w节点左右,搜索时长1分钟以上。

局限:局面评估函数是一个O(n^2)复杂度的一个函数,需要优化

paperplane110 commented 1 year ago

加速方法:

  1. 判断没有棋子的情况直接返回0分
  2. 使用变量,记录出现过的整行的pattern,相当于使用”记忆“的方法来加速

昨晚想到,其实每下一步棋子,只会影响其所在的四个方向的pattern的变化,因此整个棋盘的评估可以改成递推式的

需要考虑:是否保存每一步的历史分数

image

paperplane110 commented 1 year ago

image isWin function has bug