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

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

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...