我正在开发Tetris AI实现。它是一个GUI应用程序,可以自己玩游戏。用户可以操纵影响AI做出的决定的一些参数。基本算法如下:
在搜索深度为4之前,这种方法运行良好。之后我开始遇到内存问题。可能的游戏状态数量可以从9到34。因此,4级搜索的最坏情况是34 ^ 4个游戏状态。 Windows XP似乎无法处理5级搜索(它挂起2 GB以上)。
因此,如果我想使用更深层次的搜索,我需要使用一种策略,我会删除非有前途的分支,并继续使用能够获得良好分数的分支。但这使得估计最大可接受搜索深度变得更加困难。因此,我认为最好指定内存限制而不是深度限制。
我考虑使用内存池并使用“placement new”在池的内存段上创建我的对象。然而,游戏网格被实现为STL向量。因此,为了在池上分配它,我需要实现一个自定义分配器。
这似乎是一个很大的挑战,也许我忽视了一个更简单的解决方案。所以我想了解如何最好地解决这个问题。
可以提升或其他图书馆为我提供一些这些设施吗? (我已经找到了Poco的MemoryPool。)有没有很好的在线资源可以帮助我开始?
仅供参考:这是source code和sample binary for Windows。
答案 0 :(得分:1)
您可以创建内存池等,但这并不会使计算游戏状态实例变得更容易或更难。您确实需要确保在决策树中没有超过一定数量的活动状态,无论是否有池。而Boost确实有一个:http://www.boost.org/doc/libs/1_44_0/libs/pool/doc/index.html
听起来你并没有真正对树进行任何修剪,这样可以让你更深入。评估每个未来的游戏状态,并删除不太可能发展成任何有用的东西,并且不要浪费你的时间去那个分支。
答案 1 :(得分:0)
尽管缺乏背景[你在做什么样的搜索问题?深度优先,广度优先,A *?....]我的建议是:
使用信号量限制一次完成的处理量,然后在评估处理后释放它。我不能真正推荐一个包含Semaphores的特定库,因为该线程不是内置于C ++中,但请查看您的框架文档。