gpt4 book ai didi

博弈树的C++实现

转载 作者:行者123 更新时间:2023-11-30 03:03:27 32 4
gpt4 key购买 nike

我将把国际象棋游戏表示为 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com