问题标签 [monte-carlo-tree-search]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
544 浏览

deep-learning - 如何恢复以前的状态到健身房环境

我正在尝试在 Openai 的 atari 健身房环境中实施 MCTS,这需要计划能力:在环境中行动并将其恢复到以前的状态。我读到这可以通过游戏的 ram 版本来完成:

在快照中记录当前状态: snapshot = env.ale.cloneState()

将环境恢复到快照中记录的特定状态: env.ale.restoreState(snapshot)

所以我尝试使用突破的 ram 版本:

执行上面的代码显示游戏开始的图像。我们用 snap0 记录了第一个状态。现在让我们玩到最后:

执行上面的代码显示游戏结束的图像。现在让我们再次将第一个状态加载到环境中:

它不是向我显示游戏开始的图像,而是向我显示游戏结束的相同图像。即使我加载了原始的第一个状态,环境也不会恢复。

如果有人开始使用 ale 并记录这些状态,我将非常感谢帮助找出我做错了什么。谢谢!

0 投票
1 回答
155 浏览

python - 是否可以“中断”递归函数并在以后继续它?

我有一个some_result = treesearch(node)递归搜索大树的函数(蒙特卡洛树搜索的变体)。它决定遍历树的顺序,next_node = expensive_heuristic(node)然后在叶子上将结果传播到树上。我必须执行许多这样的搜索,并且expensive_heuristic(...)可以有效地批量计算,例如,通过 SIMD。

所以我的想法是创建一个包含所有搜索/根节点的列表,批量计算expensive_heuristic以选择遍历的“方向”,然后重复此操作,直到找到叶子并将结果传播回树。

当然,我可以使用队列而不是递归来重写我的搜索(保留历史记录),但我很好奇是否可以保持递归风格。我可以“中断”递归并将其放入列表/队列中以便稍后在 python 中继续它吗?

0 投票
1 回答
144 浏览

python - 对 ProcessPoolExecutor 上下文的重复调用变慢(Python)

我正在开发一个 MCTS 算法,我试图通过并行推出多个叶子来并行化一些工作。在进行了一批推出之后,我想返回并将我的结果添加到树中(撤消我的虚拟损失),然后再选择另一批叶子进行推出。除了速度之外,这一切正常 - 我发现围绕 ProcessPoolExecutor 上下文的连续循环变慢了。代码部分如下:

然后我得到以下计时结果。

同样的模式发生在较大的循环中,所花费的时间只是继续增长和增长。

这是什么原因?有没有办法让每个循环以相同的速度执行?

提前致谢

0 投票
0 回答
48 浏览

python - 蒙特卡洛树搜索不断给出相同的结果

我写了一个蒙特卡洛树搜索算法(基于https://en.wikipedia.org/wiki/Monte_Carlo_tree_search),并将它与“python-chess”库连接起来。

基本上,该算法卡在某个地方,因为它一直打印为输出“1/2-1/2”(绘图)。

扩展功能可能有问题,但我真的不知道在哪里。

这是代码:

0 投票
1 回答
499 浏览

python - 在基于模型的 RL 任务中加快蒙特卡洛树搜索的方法

这个领域对我来说还是很新的,所以如果我问愚蠢的问题,请原谅我。我正在利用 MCTS 运行基于模型的强化学习任务。基本上我有一个代理在一个离散的环境中觅食,代理可以看到它周围的一些空间(为了简单起见,我假设完全了解它的观察空间,所以观察与状态相同)。代理有一个由 MLP 表示的世界的内部转换模型(我正在使用 tf.keras)。基本上,对于树中的每一步,我使用模型来预测给定动作的下一个状态,并让代理根据预测的状态变化来计算它将获得多少奖励。从那里开始是熟悉的 MCTS 算法,包括选择、扩展、推出和反向传播。

本质上,问题在于这一切都运行得非常缓慢。通过分析我的代码,我注意到很多时间都花在了推出上,这可能是我想像的,因为需要多次咨询 NN,并且每次预测都需要一些不平凡的时间。当然,我可能会清理我的代码以使其运行得更快(例如更好的矢量化),但我想知道:

  1. 有没有办法加速/解决为在 MCTS 中推出而进行的传统随机游走?
  2. 通常还有其他方法可以加速 MCTS 吗?就运行时间而言,它与使用 NN 是否不能很好地混合?

谢谢!

0 投票
0 回答
105 浏览

python - 使用 pathos.multiprocessing 时出现“ValueError:空模块名称”

作为前言,我正在使用蒙特卡洛树搜索来运行基于模型的强化学习任务。基本上我有一个代理在一个离散的环境中觅食,代理可以看到它周围的一些空间(为了简单起见,我假设完全了解它的观察空间,所以观察与状态相同)。代理有一个由 MLP 表示的世界的内部转换模型(我正在使用 tf.keras)。基本上,对于树中的每一步,我使用模型来预测给定动作的下一个状态,并让代理根据预测的状态变化计算它将获得多少奖励。从那里开始是熟悉的 MCTS 算法,包括选择、扩展、推出和反向传播。

我想并行运行多次试验以节省时间。我一开始尝试使用香草多处理,但它使用了泡菜,它不能序列化很多东西(包括我的代码)。因此,我使用 pathos.multiprocessing 显然解决了这个问题,因为它使用了莳萝。但是,当我运行我的代码时,而不是伴随香草多处理的“无法腌制”错误,我得到了这个(对不起,跟踪的长度很长,我会删掉一些东西,但我不确定什么是相关的或不是,所以也许只是滚动到底部):

我认为这可能与为什么它不能在香草多处理下腌制有关,但我不确定。这是我尝试运行的代码的相关部分:

trial_runner 是我试图并行化的函数,它运行前言中描述的算法。我有两个想法是:

  1. 可能是因为它调用了许多类和类函数,所以并行化太复杂了。
  2. 它们都导入同一个文件(其中包含一些变量值),并且不同的进程可能会变得混乱。

任何帮助将不胜感激。

0 投票
1 回答
159 浏览

python - MCTS:RecursionError:调用 Python 对象时超出最大递归深度

对于这个Monte-Carlo Tree Search python 编码,为什么我有RecursionError: maximum recursion depth exceeded while calling a Python object

这对于需要不断扩展的 MCTS 是否正常?还是我错过了目前仍在追踪的任何其他错误?

至于解释puct_arrayPUCT公式

错误

0 投票
1 回答
194 浏览

python - MCTS 代理在井字游戏上做出错误决定

我已经在 MCTS AI 上工作了几天了。我试图在井字游戏上实现它,这是我能想到的最简单的游戏,但出于某种原因,我的人工智能总是做出错误的决定。我已经尝试更改 UCB1 的探索常数的值、每次搜索的迭代次数,甚至是赢得、失败和平局所获得的分数(试图让平局更有回报,因为这个 AI 只打第二,并尝试平局,否则获胜)。截至目前,代码如下所示:

首先,这个 AI 的目的是返回一个改变的矩阵,在这种情况下他可以做出最好的发挥。我发现自己质疑 MCTS 算法是否是所有这些失败游戏背后的原因,因为它的实现中可能存在一些错误。话虽如此,在我看来,代码执行以下操作:

  1. 检查根是否已经有它的孩子,如果有,选择最有希望的。
  2. 展开随机模拟并保存结果。
  3. 更新叶子的分数、访问次数和根的访问次数。
  4. 在我的示例中重复 1200 次迭代
  5. 返回可能的最佳移动(矩阵,child_node)。

为什么它不起作用?为什么选择糟糕的游戏而不是最佳的游戏?算法是否执行错误?

0 投票
1 回答
22 浏览

python - 单元测试的问题

我想测试一个功能,但我肯定在这方面苦苦挣扎。如果 NO_PLayer 是有效位置,该函数将遍历板的最后一行。

我研究了它,并尝试了它,但是:

谁能帮我?提前谢谢了!

0 投票
0 回答
54 浏览

c++ - 尝试将二叉树保存为向量会出现内存问题(C++)

我正在尝试使用 C++ 实现 MCTS,并且为了保存(在文件中)模拟播放的所有动作,我实现了一个“arbrecontigu”类来构造一个向量element(其中包含我们 MCTS 中使用的信息:' Brix' 是例如我们游戏的名称),来自不完整且不平衡的二叉树。

MC 算法本身工作得很好,但是当我的二叉树的高度在 30 左右时,我得到了一个“错误分配”错误//values.reserve(tailletab);

同时,我可以初始化一个大小为 2^100 的向量int而不会出错,所以我有点困惑......

例 1

是的,这对于 2 ^ 100 来说也很奇怪,但是这段代码让我很成功,没有任何错误

但是在我的转换构造函数中,我不能做超过 2 ^ 20 的储备