在我的AI算法上设置内存限制?

时间:2010-09-04 02:55:30

标签: c++ multithreading memory-management

我正在开发Tetris AI实现。它是一个GUI应用程序,可以自己玩游戏。用户可以操纵影响AI做出的决定的一些参数。基本算法如下:

  • 启动新主题并克隆当前游戏状态以避免过度锁定。
  • 生成所有可能的未来游戏状态的列表。这些成为当前游戏状态的子节点。
  • 为每个子节点生成它的未来游戏状态。
  • 以递归方式执行此操作,直到达到预定义的深度。
  • 达到请求的深度后,找到最佳结束节点并递归找到它的父节点,直到您拥有第一级子节点。
  • 删除不在子节点和结束节点之间的路径上的所有子节点。
  • 此路径现在是预先计算的移动列表。
  • 主游戏执行预先计算的动作列表(带有一些奇特的动画)。

在搜索深度为4之前,这种方法运行良好。之后我开始遇到内存问题。可能的游戏状态数量可以从9到34。因此,4级搜索的最坏情况是34 ^ 4个游戏状态。 Windows XP似乎无法处理5级搜索(它挂起2 GB以上)。

因此,如果我想使用更深层次的搜索,我需要使用一种策略,我会删除非有前途的分支,并继续使用能够获得良好分数的分支。但这使得估计最大可接受搜索深度变得更加困难。因此,我认为最好指定内存限制而不是深度限制。

我考虑使用内存池并使用“placement new”在池的内存段上创建我的对象。然而,游戏网格被实现为STL向量。因此,为了在池上分配它,我需要实现一个自定义分配器。

这似乎是一个很大的挑战,也许我忽视了一个更简单的解决方案。所以我想了解如何最好地解决这个问题。

可以提升或其他图书馆为我提供一些这些设施吗? (我已经找到了Poco的MemoryPool。)有没有很好的在线资源可以帮助我开始?

仅供参考:这是source codesample binary for Windows

2 个答案:

答案 0 :(得分:1)

您可以创建内存池等,但这并不会使计算游戏状态实例变得更容易或更难。您确实需要确保在决策树中没有超过一定数量的活动状态,无论是否有池。而Boost确实有一个:http://www.boost.org/doc/libs/1_44_0/libs/pool/doc/index.html

听起来你并没有真正对树进行任何修剪,这样可以让你更深入。评估每个未来的游戏状态,并删除不太可能发展成任何有用的东西,并且不要浪费你的时间去那个分支。

答案 1 :(得分:0)

尽管缺乏背景[你在做什么样的搜索问题?深度优先,广度优先,A *?....]我的建议是:

使用信号量限制一次完成的处理量,然后在评估处理后释放它。我不能真正推荐一个包含Semaphores的特定库,因为该线程不是内置于C ++中,但请查看您的框架文档。