首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Minimax算法中的线程处理

Minimax算法中的线程处理
EN

Stack Overflow用户
提问于 2016-11-20 22:47:25
回答 3查看 1.5K关注 0票数 0

我正在设计一个3D的Tic-Tac-Toe游戏,并且发现时间是我的Minimax算法能够达到的深度的一个限制。当深度达到6,在时间上基本上是无关紧要的(<1s),但是对于更高的深度,它确实需要时间。

代码语言:javascript
复制
>Depth 7 = 6 seconds
>Depth 8 = 49 seconds
>Depth 9 = 314 seconds

我没有时间(哈哈!)去检查更高的深度。最大的深度是22,这将让我的AI分析每一个可能的游戏状态,从移动1,永远不会导致用户获胜。

我想在我的Minimax函数中实现线程,但对线程处理相对来说还是比较新的。我的Minimax函数如下所示:

代码语言:javascript
复制
//player is -1 for human, +1 for AI
function minimax(board_state, depth, player)
    if depth <= 0 or board == full //full board means no further states
        return score * player
    bestScore = -1000;
    foreach possible move
        if valid move
            /* */
            make_move()
            bestScore = max(bestScore, minimax(board_state, depth-1, -player)
            undo_move()
            /* */
    return bestScore

我希望/* */之间的位是新线程,但是出现了一个问题:即使使用depth = 1,也是8个线程。对于depth = 8,这是16534863个线程。线程的限制是什么?它与我的CPU有多少物理核心有关联吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-20 23:24:16

首先考虑一下在8核系统上你能加速多少.这是8次(除非您的问题是内存绑定的,在这种情况下,您可以得到更好的)。阅读Amdahl定律古斯塔夫森定律

你的问题看起来像一个!N的问题,它很快就会爆炸。您需要考虑更改代码,以显着地筛选选项的数量。

你似乎已经在用你的最小极大值算法来做游戏理论了。

一旦你在一棵树的深处为对方玩家找到了一个获胜的移动,你就不需要测试其他可能的移动,并且可以返回该部分树的胜利者。

票数 1
EN

Stack Overflow用户

发布于 2016-11-21 00:29:25

您的解决方案不是多线程。试着去看看α-β修剪。朴素极大极小最终会发现很多冗余节点。

另外,我你的代码错了

代码语言:javascript
复制
 return score * player

一个完整的棋盘可能意味着平局,这意味着没有人赢:

代码语言:javascript
复制
oxo
oxx
xox

而这个位置是一场胜利,所以你必须返回一个分数,而不是探索愤怒:

代码语言:javascript
复制
xxx
 0 
 0 
票数 0
EN

Stack Overflow用户

发布于 2016-11-22 10:30:39

对于Tac,在维基百科中有清楚的描述,有一个完美的策略。我已经在javascript游戏中实现了它,它很简单。没有线程,没有αβ剪枝,没有极小值,什么都没有.

完美的起点看不出前面的两步(阻挡对手的叉),所以你可以(而且应该)现场使用它。

还要注意: tic的脚趾板是高度对称的,所以无论你用什么方法,有效移动的次数都可以大大减少。如果你看一下完美的策略,移动的数量会聚集在类中(“中心”、“相对角”、“空角”、“空边”等等)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40710338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档