目前在用python做一个五子棋的AI,当检索深度为4的时候,一步耗时超过4秒。
主要成本在于数棋盘上的线条,看是否组成了活2、活3、活4,等等,主要是在gen函数里面。
因为 inside_make_line 是局势评估和启发函数的前提,所以每走一步都要执行一次,而这个函数每次执行大概是在 8 ms 左右。
现在的做法是:
- 遍历棋盘上的棋子:
- 针对每个棋子,判断八个方向的直线。
- 将直线分组(活三、活四)等。
- 对于局势评估(evaluate函数),根据活三、活四的数量分别给分;对于启发式搜索(gen函数),优先堵冲四活三,这里类似一个决策树。
想到的办法是,启发式搜索不改,仅仅修改局势评估,并且允许误差:
(新的局势评估函数)
- 将棋盘进行霍夫变换。
- 判断霍夫变换后的空间,点的权重情况,根据这个给分。
这样就会遇到问题:
- 假如用最朴素的变换方法(y = ax + b),处理不了水平线条。
- 假如用极坐标变换,感觉三角函数的计算很可能也很耗时。
所以求提示呢:
- 假如用霍夫变换,有没有计算量较低,不用极坐标又能兼容垂直线条的思路
- 假如不用霍夫变换,现在的 inside_make_line 有什么优化思路呢?