![]() |
1
9
这就是过早优化的问题。你的棋盘本来需要64个字节来存储,现在需要32个字节。这到底给你带来了什么?你真的分析过这种情况,看看是否需要保存这些记忆吗? 假设你使用了一种最不理想的搜索方法,直接AB搜索到深度D,没有启发式,并且你在搜索之前在一个位置上生成了所有可能的移动,那么你的电路板所需的绝对最大内存将是Sizeof(Board)*W*D。e w=100,大的d=30,那么在深度d,64k和32k,内存中会有3000块板……真的值得吗? 另一方面,你增加了访问board[位置]所需的操作量,每次搜索将被称为数百万次。 当建立国际象棋人工智能的主要事情,你将最终寻找的是CPU周期,而不是内存。如果你的目标是手机或其他东西,这可能会有一些变化,但即便如此,在你达到足够的深度导致任何内存问题之前,你会更加担心速度。 至于我更喜欢哪种表示法…我喜欢bitboard。我没有做过很多认真的测量,但是我比较了我做的两个引擎,一个是bitboard和一个数组,bitboard一个更快,可以达到比另一个更大的深度。 |
![]() |
2
3
让我首先指出一个潜在的bug(取决于编译器和编译器设置)。而错误就是为什么过早优化是邪恶的:
如果*C为负,则>>可能会重复负高位。二进制IE:
对于某些编译器(即C++标准将它留给编译器来决定是否携带高位,以及CHARR是签名还是未签名)。 如果您确实想继续使用压缩位(让我说,您可能不必费心,但这取决于您自己),我建议将压缩位包装到一个类中,并重写[],以便
给你未包装的零件。然后您可以轻松地打开和关闭包装,并且在任何情况下都具有相同的语法。如果内联运算符重载,那么它应该和现在的代码一样高效。 |
![]() |
3
2
好吧,64字节是一个非常小的内存量。你最好只用一个字符[8][8]。也就是说,除非你打算 吨 棋盘的。使用char[8][8]可以更容易(更快)地访问电路板并对其执行更复杂的操作。
如果您仍然有兴趣将电路板存储为打包表示(无论是用于实践还是存储大量电路板),我认为您在位操作方面“做得很好”。如果要使用
|
![]() |
4
0
如果不能用一个完整的字节来表示一个正方形,空间是否足够考虑?这将使访问更容易跟踪程序,而且由于不需要位操作,访问速度可能更快。 否则,为了确保一切顺利进行,我将确保所有类型都是无符号的:getposition返回无符号字符,并用“u”(例如0xf0u)限定所有数字文本,以确保它们始终被解释为无符号。很可能您不会对签名ness有任何问题,但是为什么要冒险使用一些行为出乎意料的架构呢? |
![]() |
5
0
代码不错,但如果您真的对性能优化有那么深入的了解,那么您可能应该了解更多关于您的特定CPU体系结构的信息。 afaik,您可能会发现将一个棋子存储在8个字节内会更有效。即使递归15次深移动,二级缓存大小也很难成为一个约束条件,但是ram不对齐 可能是 . 我想象棋棋盘的正确处理应该包括expand()和reduce()函数,以便在算法的不同部分中在棋盘表示之间进行转换:有些在紧凑表示上可能更快,有些则相反。例如,缓存和通过两个相邻单元格的组合进行散列的算法可能对紧凑结构有好处,其他的都没有。 如果性能非常重要,我也会考虑开发一些辅助硬件,比如一些fpga板,或者一些gpu代码。 |
![]() |
6
0
作为一个棋手,我可以告诉你:一个位置不仅仅是每一个棋子的位置。你必须考虑到其他一些事情:
如果你用来表示职位的数据结构没有反映出这些信息,那么你就有大麻烦了。 |
|
Griffin Kennedy · 如何将PGN数据读入数据帧 7 年前 |
|
user2809437 · 为什么这个棋盘动作不能正常工作? 11 年前 |
![]() |
agweber · 未定义的HTML元素 11 年前 |
|
user2317760 · 国际象棋分层问题 12 年前 |
![]() |
EralpB · 带FPGA的象棋引擎[关闭] 12 年前 |
![]() |
user1559625 · 奈特最短路径图数据结构与算法 12 年前 |