棋盘游戏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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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