【发布时间】:2016-11-15 10:11:25
【问题描述】:
我正在为我的益智游戏编写 AI,我面临以下情况:
目前,我有一个类,Move,它代表我游戏中的一个动作,其逻辑与国际象棋相似。
在Move 类中,我存储了以下数据:
- 移动玩家颜色。
- 移动部件。
- 棋盘上的原点位置。
- 棋盘上的目标位置。
- 通过执行此动作杀死的棋子(如果有的话)。
- 移动得分。
另外,我得到了一些描述amove的方法,例如IsResigned,Undo等。
这个移动实例正在我的 AI 中传递,它基于 Alpha Beta 算法。因此,移动实例被传递了很多次,并且我正在沿着 AI 实现构建许多 Move 类实例。因此,我担心它可能会对性能产生重大影响。
为了降低性能影响,我考虑了以下解决方案:
我不会使用 Move 类的实例,而是将我的整个移动数据存储在一个长数字中(使用按位运算),然后根据需要提取信息。
例如: - 播放器颜色将来自位 1 - 2(1 位)。 - Oirign 位置将从第 2 位到第 12 位(10 位)。 等等。
看这个例子:
public long GenerateMove(PlayerColor color, int origin, int destination) {
return ((int)color) | (origin << 10) | (destination << 20);
}
public PlayerColor GetColor(long move) {
return move & 0x1;
}
public int GetOrigin(long move) {
return (int)((move >> 10) & 0x3f);
}
public int GetDestination(long move) {
return (int)((move >> 20) & 0x3f);
}
使用这种方法,我可以只传递长数字,而不是类实例。 然而,我得到了一些奇迹:抛开程序增加的复杂性,类实例在 C# 中通过引用(即通过发送指向该地址的指针)传递。那么我的替代方法是否有意义?情况更糟,因为我在这里使用长数字(64bis),但指针地址可能表示为整数(32 位) - 所以它的性能甚至可能比我当前的实现最差。
您对这种替代方法有何看法?
【问题讨论】:
-
你的性能有多糟糕,你真的想要优化它?你甚至会看到差异。这将是我的第一个问题。是否值得考虑...
-
Alpha Beta 搜索在 4 步(5-7 秒~)的深度上挣扎。所以我试图找到让我的算法表现更好的方法,因为用户看不到计算机“思考”(这是一个交互式游戏,而不是经典棋盘)。我从实现 Zobrist Hash 开始,这很有帮助,但现在我想知道这种尝试是否可行。
-
应用程序的内存占用情况如何?首先观察内存是如何变化的(即使在 Windows 默认任务管理器中)。
-
@Evk 我不是在为内存问题而苦苦挣扎,而是在为性能苦苦挣扎。我想知道使用长数字是否会比类实例更有效。无论如何,我会马上回家并发布它需要多少内存,谢谢!
标签: c# performance artificial-intelligence