Skip to content

Commit

Permalink
update technology explanation, add perft
Browse files Browse the repository at this point in the history
  • Loading branch information
Nyanyan committed Oct 3, 2024
1 parent f7378f4 commit a4964ac
Showing 1 changed file with 32 additions and 1 deletion.
33 changes: 32 additions & 1 deletion web_resources/ja/technology/explanation/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

このページは日本語のみの雑多なオセロAI関連の技術文書です。のんびりと気が向いたときに書き足していきます。章立ての順番に意味はありません。読みたいところだけをぜひお読みください!

最終更新: 2024/09/28
最終更新: 2024/10/03

INSERT_TABLE_OF_CONTENTS_HERE

Expand Down Expand Up @@ -407,6 +407,37 @@ Egaroucidではボードの実装およびオセロのルールの実装にビ

合法手生成や返る石の計算などをすべてビット演算で完結できるため、高速に動きます。また、SIMDとの相性も非常に良く、EgaroucidではEdax-AVXを参考にSIMDによる高速化を行っています(Edax-AVXの作者から直々にプルリクエストをいただき、高速化したところもあります)。

### Perftの活用

ボードはビットボード以外にも様々な方法で実装できますが、どのような方法にしても実装ミスがないかを確かめておく必要があります。また、ボードの処理は高速にできると良いわけですが、変更前後でどれくらい性能向上があったのかをしっかり確かめることが必要です。

こういったデバッグ・検証用途では、Perftという手法が便利です。Perftは決められた深さまでゲーム木を全部展開し、葉ノードの数を数える手法です。葉の数を数えるので、ボードの実装にバグがあったらすぐに気付けます。また、ゲーム木展開で合法手生成と返る石の計算を大量に行うので、これらのボード操作のスピードが顕著に実行時間に反映されます。なお、Perftは"PERformance Test, move path enumeration"の略だそうです(Chess Programming Wikiより)。実装方法は[Chess Programming Wikiに詳しく記載があります](https://www.chessprogramming.org/Perft)

なお、オセロでは9手以降で終局が発生します。終局した場合、そのノードはゲーム木の葉なので、指定した深さに達していなくとも1枚の葉としてカウントします。

オセロにおけるPerftの値(深さを指定したときのゲーム木の葉の数)は以下の通りです。2種類の値を記載しましたが、モード1が一般的なPerft、モード2がEgaroucid独自のPerftです。モード1はパスを1手にカウントしていますが、モード2はパスを0手としてカウントしています。オセロにおいては1手で1マス埋まるため、AIの実装においてはパスを0手としてカウントすることが往々にしてあります。そのため、Egaroucidではモード2としてこれを用意しました。以下はEgaroucidで計測したものですが、モード1の値については[こちら](https://aartbik.blogspot.com/2009/02/perft-for-reversi.html)にも記述があります。

<div class="table_wrapper"><table>
<tr><th>深さ</th><th>葉の数(モード1)</th><th>葉の数(モード2)</th></tr>
<tr><td>1</td><td>4</td><td>4</td></tr>
<tr><td>2</td><td>12</td><td>12</td></tr>
<tr><td>3</td><td>56</td><td>56</td></tr>
<tr><td>4</td><td>244</td><td>244</td></tr>
<tr><td>5</td><td>1396</td><td>1396</td></tr>
<tr><td>6</td><td>8200</td><td>8200</td></tr>
<tr><td>7</td><td>55092</td><td>55092</td></tr>
<tr><td>8</td><td>390216</td><td>390216</td></tr>
<tr><td>9</td><td>3005288</td><td>3005320</td></tr>
<tr><td>10</td><td>24571284</td><td>24571420</td></tr>
<tr><td>11</td><td>212258800</td><td>212260880</td></tr>
<tr><td>12</td><td>1939886636</td><td>1939899208</td></tr>
<tr><td>13</td><td>18429641748</td><td>18429791868</td></tr>
<tr><td>14</td><td>184042084512</td><td>184043158384</td></tr>
<tr><td>15</td><td>1891832540064</td><td>1891845643044</td></tr>
</table></div>

Egaroucidではコンソール版のバージョン7.4.0からperft機能を搭載しました。これは主に開発者である私がデバッグ・高速化を容易に行うためです。他の開発者も、デバッグ用途やスピード比較用途に利用できると思います。



## SIMDによる高速化
Expand Down

0 comments on commit a4964ac

Please sign in to comment.