微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 处理非常大的树状数据结构:OutOfMemoryException

我正在创建一个象棋程序的变体,需要同时生成和遍历一个非常大的树状结构.每个节点有10个bool,一个int,8个ulongs,一个短[64]和2个ulong [64] s.根节点接收一些初始参数,然后从那里以编程方式(递归地)确定有效子节点.

基本上,我的程序不断增长这个树,而用户和程序轮流从子节点遍历到子节点.每次“选择”新的子节点时,不再需要它的父节点和兄弟节点并被丢弃.当树(平均)达到大约60的深度(从初始根节点)时,有效子节点的数量将自然地开始减少直到大约75的深度,树被解析为一个最终节点,没有更多的孩子.

这背后的逻辑看起来相当直接,但我经常遇到OutOfMemoryException,直接杀死任何进一步的进展.

以下是“每代”有效儿童的平均值:

Generation    New Nodes
1             1    
2             20
3             4,000
4             30,000
5             2,200,000
6             > 50,000,000

在我的实际程序中,我甚至无法完全扩展第五代.当我不保留节点特定数据时(我清除节点的数据,一旦它被用来确定它自己的孩子)我可以完全扩展第5代,但是在第六代中途打了一个非常坚固的墙.

理想情况下,我希望我的程序最终到达并在“当前”节点之后维护8代节点.我越看这个,这似乎越不可能.

我厌倦了使用sqlite数据库运行它,但它无法足够快地增长树.

有没有人知道处理非常大的树结构的任何潜在替代方案?

解决方法

通常,您在构建树时进行评​​估,这已经为您提供了边缘的权重.使用这些权重来查看哪些路径将评估比其他路径更强的路径,并且只要您可以看到哪些路段更有价值,就可以在这些路径上工作.由于您已经在算法中遇到了第五代的问题,因此您只能选择在更高权重的分支上进行深入研究,并选择其中一个,从而忽略其他多个分支.只是一个想法…也许你可以在第三代运行这个,选择走哪条路.据我所知,国际象棋可能会让你只用更多可移动的棋子进行动作,因为他们的probalby会对游戏产生更大的影响,与第五代动作相比,这可能不是最好的解决方案.非常有趣的问题!

你应该调查国际象棋编程:Chess programming wiki

以下是关于引擎的更多内容Chess programming wiki on Engines

还有一个论坛,讨论了不同的方法

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐