王手の判断

合法手生成時に必ずチェックしなければならない事の一つに「生成された手が自玉の王手にならない」があります。人間にとっては馬鹿らしいほど基本中の基本ですがソフトを書く身としては避けては通れない道ですね。

その方法としては、「候補手」を指した後...

①敵側の駒を全部動かして自玉を取れる手が存在するかを調べる ⇒ 一番単純

②自玉の位置に(玉以外の)他の駒が有ると仮定して、そこから駒を動かす。その到達地点に同じ敵の駒が有れば王手が存在する。 ⇒ これは①を反転した見方です。

(例)自玉の位置に飛車が有ると仮定し、そこから到達できる升を全てチェック。敵の飛車がその中に有るならば(敵の飛車も自玉の位置まで到達できるので)王手の存在が確認されました。

③敵の駒が利いている全ての升をマークします。王がマークされた升に乗っているなら王手確認です。 ⇒ ①と似ているがチョッと違う。更には「利き」の情報は(評価関数での)二次的使用ができます。

「王手チェック」は合法手候補全てに繰り返さないといけませんので。

(A)可能な限り速く
(B)...より速く

がルールです。(将棋ソフト書くには何でも「速く、速く、より速く」なのね)

現在の所、無明君は(こうなることは想定内なのですが...以下参照)28%の検索時間を「王手チェック」に取られているので改良なのです。

無明君は現在の所「③敵の駒が利いている全ての升をマークします」を使用しています。ところが一手生成する毎にマーキングを始めからやり直すのですこぶる効率悪しです。駒を動かした差分だけをアップデートすればより速く成ります。(と思う)

(補足)

更には「王手が掛かっていた場合、応手はそれを解消しなければならない」も同じ場所でチェックしています。解消できない場合は「詰み」ですね。

投稿者: 紫外線 投稿日時: 日, 10/04/2009 - 14:17 categories [ ]

返信

このフィールドの内容は非公開にされ、公表されることはありません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 使用できるHTMLタグ: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <hr>
  • 行と段落は自動的に折り返されます。

書式オプションに関するさらに詳しい情報...