棋盘游戏AI中的对象池技术

我被要求创建一个棋盘游戏的AI(这个游戏与跳棋非常相似)。到目前为止,我已经完成了一个基于位板的NegaScout基本实现,并且在5秒内可以搜索到10个半步的深度。该游戏的复杂度属于EXPTIME完全级别。换句话说,游戏中的可能移动数量几乎比整个宇宙中的原子还要多。NegaScout帮助我减少了这个数字,但我仍然需要处理大量的可能移动。

我的棋盘已经是静态的,具有执行/撤销功能。但是,对于每一个新的棋盘配置,我都需要生成所有允许的移动,这即使在我的类非常简单的情况下也需要花费大量的时间,例如:

public class Move{    private final byte startIndex;    private final byte endIndex;    private byte endPawn;    public Move(final byte start,final byte end){startIndex = start; endIndex = end;}    public final void setEndPawn(byte pawn){endPawn = pawn;}    //OTHER FUNCTIONS.. (ONLY FOR DISPLAY/DEBUG)}

因此,我有两个问题。

第一个问题 = 使用对象池技术(针对Move类)是否能提升我的性能?

第二个问题 = 如果第一个问题的答案是肯定的,那么你能告诉我如何实现它吗?(提供链接和小段代码示例将非常感谢!!)


回答:

使用对象池技术(针对Move类)是否能提升我的性能?

对象池技术通常被用来尝试提升性能。然而,是否真的能提升性能完全是另一回事。

如果你在一个内存充足且垃圾回收器性能良好的平台上运行,那么丢弃一个对象并创建一个新对象通常会比尝试回收利用更快。这真的取决于初始化一个对象的成本有多高。

如果你在一个性能较低或内存有限的平台上,情况可能会倾向于使用对象池技术。然而,缺点是内存池会使你的代码变得更加复杂。此外,你需要防止池成为一种内存泄漏的来源。

总的来说,我建议在你没有硬性的性能分析数据表明它可能有帮助之前,不要实施内存池技术。

参考资料:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注