博弈树的C++实现

标签 c++ tree

我将把国际象棋游戏表示为 C++ 结构。我认为,最好的选择是树结构(因为在每个深度我们都有几个可能的移动)。

这是一个好的方法吗?

struct TreeElement{
  SomeMoveType move;
  TreeElement *parent;
  std::vector<TreeElement*> children;
};

如何高效地将这类数据存储在文件中?有没有办法确保整个树结构将存储在内存的同一部分,这将允许使用 mmap 函数?

最佳答案

要将数据存储在内存的同一部分,您可能需要为 std::vector<TreeElement *> 提供一个分配器对象。你使用,并从你的 block 中分配。

为了能够序列化它,而不是存储实际的指针,您可以考虑在 block 中存储偏移量。然后当你读回数据时,你可以将 block 的起始地址添加到每个偏移量以将其转回一个地址。

根据您使用的操作系统/编译器,可能已经对此提供了一些支持。比如微软的编译器支持__based指针,这几乎就是我所描述的:一个基地址,每个基于该地址的指针实际上只是一个偏移量,而不是一个完整的指针。提到mmap表示您可能无法直接使用它,但可能您正在使用的编译器/操作系统有类似的东西。否则,您可能必须自己完成这项工作(例如,使用 based_pointer 类)。

真正的问题是您为什么要尝试序列化移动树。在典型情况下,您最好只保存当前棋盘位置(或者,大约等效地,移动历史记录)并在需要时/如果需要从中重新生成移动树。它足够小,非常容易存储。

关于博弈树的C++实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9350417/

相关文章:

c++ - 从命令行参数指定数组

c++ - struct _stack* 和 Digit::struct_stack* 中的一些问题

c++ - 有没有办法在容器中存储不同的函数指针类型

c++ - 通过 boost regex 替换行与相对复杂的 regex 的 boost

algorithm - 是否可以设计一棵节点有无限多个子节点的树?

C++ 跟踪原始类型值的变化

algorithm - 我的二维树有问题

javascript - 如何使用 JavaScript/Prototype 1.7 递归搜索对象树并根据键/值返回匹配对象

Java 树字符串数据结构

c - 什么是十进制搜索树?