Python 使用极小极大树搜索的机器人速度太慢

Python 使用极小极大树搜索的机器人速度太慢,python,algorithm,artificial-intelligence,Python,Algorithm,Artificial Intelligence,我在读《深度学习与围棋》这本书,我在书中没有走多远;我编写了基础规则、助手类和QtGUI界面。所有的作品和我决定写的例子极小极大程序,看看我是否能打败它- 但它太慢了:玩一个动作需要几分钟,初始板是9x9。默认深度为3步,我认为第一步的计算需要9x9x9x9-1x9x9-2~500000个位置。好的,这是python,不是C,但我认为这最多可以在一分钟内计算出来 我删除了对copy.deepcopy的一个调用,这似乎占用了很多时间。但是速度太慢了 这里有一些东西: 计算线程: class Bot

我在读《深度学习与围棋》这本书,我在书中没有走多远;我编写了基础规则、助手类和QtGUI界面。所有的作品和我决定写的例子极小极大程序,看看我是否能打败它- 但它太慢了:玩一个动作需要几分钟,初始板是9x9。默认深度为3步,我认为第一步的计算需要9x9x9x9-1x9x9-2~500000个位置。好的,这是python,不是C,但我认为这最多可以在一分钟内计算出来

我删除了对copy.deepcopy的一个调用,这似乎占用了很多时间。但是速度太慢了

这里有一些东西: 计算线程:

class BotPlay(QThread):
    """
    Thread de calcul du prochain coup par le bot
    """

    def __init__(self, bot, bots, game):
        """
        constructeur, pour le prochain coup à jouer

        :param bot: le bot qui doit jouer
        :param bots: l'ensemble des 2
        :param game: l'état actuel du jeu (avant le coup à jouer)
        """
        QThread.__init__(self)
        self.bot = bot
        self.bots = bots
        self.game = game

    played = pyqtSignal(Move, dict, GameState)

    def __del__(self):
        self.wait()

    def run(self):
        self.msleep(300)
        bot_move = self.bot.select_move(self.game)
        self.played.emit(bot_move, self.bots, self.game)
选择移动方法及其类:

class DepthPrunedMinimaxAgent(Agent):

    @bot_thinking(associated_name="minimax prof. -> LONG")
    def select_move(self, game_state: GameState):
        PonderedMove = namedtuple('PonderedMove', 'move outcome')
        best_move_so_far = None
        for possible_move in game_state.legal_moves():
            next_state = game_state.apply_move(possible_move)
            our_best_outcome = -1 * self.best_result(next_state, capture_diff)
            if best_move_so_far is None or our_best_outcome > best_move_so_far.outcome:
                best_move_so_far = PonderedMove(possible_move, our_best_outcome)
        return best_move_so_far.move

    def best_result(self, game_state: GameState, eval_fn, max_depth: int = 2):
        if game_state.is_over():
            if game_state.next_player == game_state.winner():
                return sys.maxsize
            else:
                return -sys.maxsize

        if max_depth == 0:
            return eval_fn(game_state)

        best_so_far = -sys.maxsize
        for candidate_move in game_state.legal_moves():
            next_state = game_state.apply_move(candidate_move)
            opponent_best_result = self.best_result(next_state, eval_fn, max_depth - 1)
            our_result = -opponent_best_result
            if our_result > best_so_far:
                best_so_far = our_result
        return best_so_far
我几乎可以肯定问题不是来自GUI,因为书中给出的程序的初始版本,完全处于控制台模式,与我的一样慢

我的要求是什么?好吧,要确定这种缓慢的行为是不正常的,也许要知道哪里出了问题。minimax算法来自于这本书,所以它是可以的


谢谢

机器学习通常是用Python完成的,因为:

它既简单又安全 它是灵活的 所有的重物都是在专门的模块中完成的,比如tensorflow和keras 就你而言,3。不起作用。所有这些嵌套调用、参数传递、复制和板计算都在Python中完成。成本是编译语言的10到100倍[需要引用]

流行的ML项目似乎都是用Python完成的,但实际的Python代码只是处理和提供数据、控制对tensorflow的调用以及显示结果。这就是为什么他们可以这么做


所以,是的,你的故事没有什么不寻常的地方。你查过Leela zero了吗?它要复杂得多,但它是开源的,而且做得很好,而且可能已经超过你了。

机器学习通常是用Python完成的,因为:

它既简单又安全 它是灵活的 所有的重物都是在专门的模块中完成的,比如tensorflow和keras 就你而言,3。不起作用。所有这些嵌套调用、参数传递、复制和板计算都在Python中完成。成本是编译语言的10到100倍[需要引用]

流行的ML项目似乎都是用Python完成的,但实际的Python代码只是处理和提供数据、控制对tensorflow的调用以及显示结果。这就是为什么他们可以这么做


所以,是的,你的故事没有什么不寻常的地方。你查过Leela zero了吗?它要复杂得多,但它是开源的,而且做得很好,而且可能已经超过你了。

用Python编写高性能的快速搜索代码可能很困难。但是,如果您想使用Python,首先要担心的是避免所有内存分配。尝试预先分配将要使用的内存。第二件要担心的事情是不必要的复制-确保您没有不必要地复制数据。这两个更改可能并不容易应用,它们将大大加快代码的速度

<>这些在C语言或C++语言中更容易控制,但仍然可以用Python来完成。根据我的经验,使用Python编写的基于搜索的程序在内存分配和不必要的复制方面做得很差,可能比编写良好的C/C++程序慢100倍甚至1000倍


另外,Monte Carlo树搜索MCT是当今Go中的主要方法,因此您可能需要研究MCT。但是,无论采用哪种方式,您都需要让代码运行得更快,才能使其发挥良好的性能。

用Python编写高性能的快速搜索代码可能会很困难。但是,如果您想使用Python,首先要担心的是避免所有内存分配。尝试预先分配将要使用的内存。第二件要担心的事情是不必要的复制-确保您没有不必要地复制数据。这两个更改可能并不容易应用,它们将大大加快代码的速度

<>这些在C语言或C++语言中更容易控制,但仍然可以用Python来完成。根据我的经验,使用Python编写的基于搜索的程序在内存分配和不必要的复制方面做得很差,可能比编写良好的C/C++程序慢100倍甚至1000倍


另外,Monte Carlo树搜索MCT是当今Go中的主要方法,因此您可能需要研究MCT。但是,无论哪种方式,您都需要让代码运行得更快,才能让它运行得更好。

当然,它打败了我:它已经在一些游戏中打败了stockfish,所以它的elo应该超过3300,不是吗?当然,它打败了我:它已经在一些游戏中打败了stockfish,所以它的elo应该超过3300,不?MCTS在书中紧跟在alpha-beta-minimax之后,但是如果它太慢,我不会仅仅为了等待移动而编写这个代码。。。我将只编写示例f
rom深度网络部分MCTS在书中紧随alpha-beta-minimax之后,但如果速度太慢,我不会仅仅为了等待5mn的移动而编写此代码。。。我将只编写来自深度网络部分的示例