问题标签 [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.
deep-learning - 如何恢复以前的状态到健身房环境
我正在尝试在 Openai 的 atari 健身房环境中实施 MCTS,这需要计划能力:在环境中行动并将其恢复到以前的状态。我读到这可以通过游戏的 ram 版本来完成:
在快照中记录当前状态:
snapshot = env.ale.cloneState()
将环境恢复到快照中记录的特定状态:
env.ale.restoreState(snapshot)
所以我尝试使用突破的 ram 版本:
执行上面的代码显示游戏开始的图像。我们用 snap0 记录了第一个状态。现在让我们玩到最后:
执行上面的代码显示游戏结束的图像。现在让我们再次将第一个状态加载到环境中:
它不是向我显示游戏开始的图像,而是向我显示游戏结束的相同图像。即使我加载了原始的第一个状态,环境也不会恢复。
如果有人开始使用 ale 并记录这些状态,我将非常感谢帮助找出我做错了什么。谢谢!
python - 是否可以“中断”递归函数并在以后继续它?
我有一个some_result = treesearch(node)
递归搜索大树的函数(蒙特卡洛树搜索的变体)。它决定遍历树的顺序,next_node = expensive_heuristic(node)
然后在叶子上将结果传播到树上。我必须执行许多这样的搜索,并且expensive_heuristic(...)
可以有效地批量计算,例如,通过 SIMD。
所以我的想法是创建一个包含所有搜索/根节点的列表,批量计算expensive_heuristic
以选择遍历的“方向”,然后重复此操作,直到找到叶子并将结果传播回树。
当然,我可以使用队列而不是递归来重写我的搜索(保留历史记录),但我很好奇是否可以保持递归风格。我可以“中断”递归并将其放入列表/队列中以便稍后在 python 中继续它吗?
python - 对 ProcessPoolExecutor 上下文的重复调用变慢(Python)
我正在开发一个 MCTS 算法,我试图通过并行推出多个叶子来并行化一些工作。在进行了一批推出之后,我想返回并将我的结果添加到树中(撤消我的虚拟损失),然后再选择另一批叶子进行推出。除了速度之外,这一切正常 - 我发现围绕 ProcessPoolExecutor 上下文的连续循环变慢了。代码部分如下:
然后我得到以下计时结果。
同样的模式发生在较大的循环中,所花费的时间只是继续增长和增长。
这是什么原因?有没有办法让每个循环以相同的速度执行?
提前致谢
python - 蒙特卡洛树搜索不断给出相同的结果
我写了一个蒙特卡洛树搜索算法(基于https://en.wikipedia.org/wiki/Monte_Carlo_tree_search),并将它与“python-chess”库连接起来。
基本上,该算法卡在某个地方,因为它一直打印为输出“1/2-1/2”(绘图)。
扩展功能可能有问题,但我真的不知道在哪里。
这是代码:
python - 在基于模型的 RL 任务中加快蒙特卡洛树搜索的方法
这个领域对我来说还是很新的,所以如果我问愚蠢的问题,请原谅我。我正在利用 MCTS 运行基于模型的强化学习任务。基本上我有一个代理在一个离散的环境中觅食,代理可以看到它周围的一些空间(为了简单起见,我假设完全了解它的观察空间,所以观察与状态相同)。代理有一个由 MLP 表示的世界的内部转换模型(我正在使用 tf.keras)。基本上,对于树中的每一步,我使用模型来预测给定动作的下一个状态,并让代理根据预测的状态变化来计算它将获得多少奖励。从那里开始是熟悉的 MCTS 算法,包括选择、扩展、推出和反向传播。
本质上,问题在于这一切都运行得非常缓慢。通过分析我的代码,我注意到很多时间都花在了推出上,这可能是我想像的,因为需要多次咨询 NN,并且每次预测都需要一些不平凡的时间。当然,我可能会清理我的代码以使其运行得更快(例如更好的矢量化),但我想知道:
- 有没有办法加速/解决为在 MCTS 中推出而进行的传统随机游走?
- 通常还有其他方法可以加速 MCTS 吗?就运行时间而言,它与使用 NN 是否不能很好地混合?
谢谢!
python - 使用 pathos.multiprocessing 时出现“ValueError:空模块名称”
作为前言,我正在使用蒙特卡洛树搜索来运行基于模型的强化学习任务。基本上我有一个代理在一个离散的环境中觅食,代理可以看到它周围的一些空间(为了简单起见,我假设完全了解它的观察空间,所以观察与状态相同)。代理有一个由 MLP 表示的世界的内部转换模型(我正在使用 tf.keras)。基本上,对于树中的每一步,我使用模型来预测给定动作的下一个状态,并让代理根据预测的状态变化计算它将获得多少奖励。从那里开始是熟悉的 MCTS 算法,包括选择、扩展、推出和反向传播。
我想并行运行多次试验以节省时间。我一开始尝试使用香草多处理,但它使用了泡菜,它不能序列化很多东西(包括我的代码)。因此,我使用 pathos.multiprocessing 显然解决了这个问题,因为它使用了莳萝。但是,当我运行我的代码时,而不是伴随香草多处理的“无法腌制”错误,我得到了这个(对不起,跟踪的长度很长,我会删掉一些东西,但我不确定什么是相关的或不是,所以也许只是滚动到底部):
我认为这可能与为什么它不能在香草多处理下腌制有关,但我不确定。这是我尝试运行的代码的相关部分:
trial_runner 是我试图并行化的函数,它运行前言中描述的算法。我有两个想法是:
- 可能是因为它调用了许多类和类函数,所以并行化太复杂了。
- 它们都导入同一个文件(其中包含一些变量值),并且不同的进程可能会变得混乱。
任何帮助将不胜感激。
python - MCTS:RecursionError:调用 Python 对象时超出最大递归深度
对于这个Monte-Carlo Tree Search python 编码,为什么我有RecursionError: maximum recursion depth exceeded while calling a Python object
?
这对于需要不断扩展的 MCTS 是否正常?还是我错过了目前仍在追踪的任何其他错误?
至于解释puct_array
见PUCT公式
python - MCTS 代理在井字游戏上做出错误决定
我已经在 MCTS AI 上工作了几天了。我试图在井字游戏上实现它,这是我能想到的最简单的游戏,但出于某种原因,我的人工智能总是做出错误的决定。我已经尝试更改 UCB1 的探索常数的值、每次搜索的迭代次数,甚至是赢得、失败和平局所获得的分数(试图让平局更有回报,因为这个 AI 只打第二,并尝试平局,否则获胜)。截至目前,代码如下所示:
首先,这个 AI 的目的是返回一个改变的矩阵,在这种情况下他可以做出最好的发挥。我发现自己质疑 MCTS 算法是否是所有这些失败游戏背后的原因,因为它的实现中可能存在一些错误。话虽如此,在我看来,代码执行以下操作:
- 检查根是否已经有它的孩子,如果有,选择最有希望的。
- 展开随机模拟并保存结果。
- 更新叶子的分数、访问次数和根的访问次数。
- 在我的示例中重复 1200 次迭代
- 返回可能的最佳移动(矩阵,child_node)。
为什么它不起作用?为什么选择糟糕的游戏而不是最佳的游戏?算法是否执行错误?
python - 单元测试的问题
我想测试一个功能,但我肯定在这方面苦苦挣扎。如果 NO_PLayer 是有效位置,该函数将遍历板的最后一行。
我研究了它,并尝试了它,但是:
谁能帮我?提前谢谢了!
c++ - 尝试将二叉树保存为向量会出现内存问题(C++)
我正在尝试使用 C++ 实现 MCTS,并且为了保存(在文件中)模拟播放的所有动作,我实现了一个“arbrecontigu”类来构造一个向量element
(其中包含我们 MCTS 中使用的信息:' Brix' 是例如我们游戏的名称),来自不完整且不平衡的二叉树。
MC 算法本身工作得很好,但是当我的二叉树的高度在 30 左右时,我得到了一个“错误分配”错误//values.reserve(tailletab);
同时,我可以初始化一个大小为 2^100 的向量int
而不会出错,所以我有点困惑......
例 1
是的,这对于 2 ^ 100 来说也很奇怪,但是这段代码让我很成功,没有任何错误
但是在我的转换构造函数中,我不能做超过 2 ^ 20 的储备