今回は、MarcのMoveGeneratorの手法を将棋へ適用してみることを考える。これは、あくまで指手生成を行う回路のみが対象だが、探索コアの要と言える、このメカニズムとアーキテクチャが理解できれば、局面更新(1手進めるか戻す)処理は赤子の手を捻るようなものであるし、静的局面評価は好きなように演算させれば良いだけだし、探索制御は有限状態マシン(FSM)を組むだけの話になる。


Chrillyの探索コアは、それらを全て含んで10,000slices程度のリソースを消費し、MarcのMoveGeneratorは約10,000LUTs、つまりは5,000slices程度を消費している。ChrillyもMarcも、DeepBlueのMoveGeneratorを参考にしており[*1]、局面評価と探索FSM、その他の足廻の回路を組めば探索コアが出来上がる。探索コアは、前述の数字から指手生成回路のおよそ倍程度に規模が膨れ上がると(大雑把ではあるが)予想できる。


チェスと将棋では盤のサイズ(桝の数)が違うし、そもそもルールが異なる。まず最初に、チェスの指手生成回路を将棋へ適用を考える場合に考慮すべきゲームのルール差を箇条書きする。

--
・チェスより将棋の方が複雑になると考えられる部分
 + 将棋は持っている駒を盤上に打てる。従って、取った駒を管理する必要がある
  + ニ歩の禁手を避けるために、先後共に盤上の筋毎に生歩の存在を検出する必要がある
  + チェスには打歩詰(禁手)の概念がない
  + 打歩詰に関しては、探索によって判定する必要がある(静的な判定が困難なのでFSM側で対処)
  + 静止探索では通常駒を盤上に打つ手を生成しないが、将棋では王手が掛かっている場合ありえる
  + 勿論、静止探索に入る以前では「駒を盤上に打つ手」は普通にある
   + 従って、手番側の持駒にどのような駒種があるかを各桝へ知らせるバスが必要になる
 + 将棋では、歩香桂銀角飛が敵陣に入る(あるいは敵陣から出る)時に、不成か成かを選択できる
+ 行き所のない駒を作る手は禁手なので、その判定が出来るようにする必要がある
 + また、チェスには金銀香歩および竜や馬に相当する駒はなく、成駒を含めると駒種が多い
+ 従って、駒種に基いて利きを生成するデコーダが、将棋では複雑になる

・チェスより将棋の方が単純になると考えられる部分
 - チェスのポーンの動きと利きは、将棋の歩と似て非(チェスの方が複雑)
  - ポーンが初期位置から2つ前進するような手は、将棋の歩にはない
  - また、前方に駒がある時、ポーンは進めない(敵駒であっても取れない)
  - ポーンは前方斜めの敵駒を取れるが、歩にはそのような手はない
 - 同様にアンパサンやキャスリングのような手は、将棋にはない
 - チェスのナイトと将棋の桂馬は利きが異なり、ナイトの方が利き伝搬が複雑になる
 + チェスでは、成れる駒はポーンのみで、敵陣最上段で強制的に成るのみ(このこと自体は単純)
  - 但し、キング以外の好きな駒種に出来るという将棋にはないルールがあり、この点チェスの方が複雑
 - チェスの静止探索では、駒を取る手だけでなく王手も読みに含めている[*2]
--

盤の大きさが異なる点については、チェスでは8x8の64、将棋は9x9の81桝なので、単純計算で将棋はチェスの約(81/64)1.3倍の規模になると考えられ、更に将棋では持駒を管理し、それを各桝に伝えたり、二歩禁検出の必要がある分、付加的な回路と配線が増える。また駒種については、各桝で駒値を管理するFF(レジスタ)が1ビット増えるだけではあるが、駒の利きを生成するためのデコーダはおよそ2倍の規模になると考えられ、付け加えてMVV/LVA[*3]の演算も複雑になる。これらを総合的に考慮すれば、将棋の指手生成回路の規模は、チェスの場合の1.5倍程度には膨れ上がると推測できるし、更に指手の生成条件や生成順序を精密に制御したい、あるいは高速化したい場合(後述)は、2倍近くかそれ以上を覚悟する必要がある。


ここで、動作速度への影響を考えてみる。MarcのMoveGeneratorに限らずDeepBlueにしろHydraにしろクリティカルパス(重大な遅延路)は、生成する手の移動先・移動元の桝を決定するためのアービタ[*4]の性能に大きく影響される。チェスでは、64個の桝の一つを選択するために2分木6レベル、63個のアービタを使用する。これを将棋の指手生成でそのまま用いると2分木7レベルとなり、1レベル分チェスより時間コストが増えることになる。3分木アービタを独自に作れば(34=81なので)4レベルとなるが、3分木アービタは2分木のそれの3倍の回路規模となり、やや遅延が増えると思われるので効果があるかどうかは判らないが、3分木アービタを試してみる価値はありそうだ[*5]

-- 続く --


[*1] どうやら、DeepBlueの論文(の一部だが)「F.-H. Hsu, "A two-million moves/s CMOS single-chip chess move generator," IEEE Journal of Solid -State Circuits, vol. sc-22, no. 5, 1987, pp. 841-846.」を読んでいるようである。ChrillyやMarcの論文を読むと、常にこの参照が出て来る。

[*2] これはDeepBlueは勿論、MarcのMoveGeneratorでもそうなっている。Chrillyの探索コアについては不明。チェスでは、駒を取る手だけでなく、王手も「非常に重要な手になる」と考えられる(チェスプログラムでは、王手が掛かっている局面では必ず延長して探索しているのが殆ど)。例えば、王手クイーン取りといった両取り一発で勝敗が決定的になることが多いからではないだろうか。

[*3] Most Valuable Victim / Least Valuable Aggressor の略。一言でいえば、交換値のこと。

[*4] Marcのソースでいえば、arbitor.vhd。2分木アービタ1つ分の「部品」がVHDLで記述されている。

[*5] 例えば、1回の2分木の遅延が1.0nsなら7レベルで合計7.0nsだが、3分木の遅延が1.5nsで済めば4レベルで6.0nsとなり、ロジック資源を大きく喰うものの、多少なりともfmax(最高動作周波数の意)を上げることが出来る(あるいは犠牲にせずに済む)。