恒例 アピール文章

...これ提出しないと参加禁なので...

今回は極めて古典的・基本的な探索手法で作りました。使用した方策は...

⇒ Alpha Beta
⇒ Aspiration Search
⇒ Parallel Search - PV Split
⇒ Futility Pruning & Razoring
⇒ DFPN Mate Search

...ですね。

⇒ Null Move Pruning
⇒ Late Move Reduction

...は使用せず、CUT/ALLノードにおいてPVからの距離により探索深度を減らしています。
ムーブオーダリングに比較的注力しているので上記の枝刈り手法とは相性が良く無い模様です。

評価関数・パラメターはBonanza 6から拝借しています。Javaで書いているので評価関数は移植となります。

マシンのコア数が十分にあるのでムーブオーダリングを並列で処理しています。ラップトップでテストした場合、探索時間が約3割短縮しました。

今年もOC使用します。クロックは4.2Ghz(標準3.0Ghzから40%増加)で稼動予定。

((追記)) 再テストの結果、

⇒ Null Move Pruning
⇒ Late Move Reduction

...も使用することになりました。

投稿者: webMaster 投稿日時: 木, 03/19/2015 - 14:31 categories [ ]

コメントの表示オプション

お好みの表示方法を選択し、「設定の保存」をクリックすると、表示方法を変更することができます。

探索時間 P2

...は通常時15~20秒に設定していたのですが、序盤に読み負けするみたいなので 20秒 に固定してみます。

正確には 20.8秒 です。対局サーバーは1秒以下は切り捨ててくれるので記録上は20秒の扱いとなります。
まあ 0.8秒 で違いが出るとは思いませんが、おまじないみたいなものです。

探索時間

...対戦相手が一定のペースで時間を消費してくれるとこちらもポンダーで探索できるので助かります。そうでない相手はなんだか苦手ですね。

一次予選枠

...は通常8チームです。

二次予選チーム数(24) - シードチーム数(16) = 8

...なのですが、シード権放棄によりシードチーム数が15になりましたので都合9となります。

でもシード権放棄チームが勝ちあがると予想されますので変わりはありませんね。

一次予選、出馬表
https://dl.dropboxusercontent.com/u/51180643/WCSC25-1.pdf

...が出現しました。

同一手順回避 P6

管理人さん、こんばんは。

これは失礼しました。 いわゆる「一人千日手模様」ですね。 これ、激指も東大将棋も柿木将棋もよくやってきます。

▲2四歩▽同歩▲同飛▽2三歩▲2八飛、そこで▽何か指す、と、▲2四歩・・・(以下、手損する)

持ち時間はもったいないですが、これはきっとあまり有効な手が無いと判断しているからで、致命的な欠陥ではないと思っています。

ちなみに、本戦で「同一局面4回」が出現して千日手が成立するとどうなるのですか? 前後入れ替えて指し直し、引き分け、または両者負け?!

昔、柔道の試合で両者負けにされそうになった・・・ (一応私が相手の反則で勝ちになりましたが)

同一手順回避 P5

テスト対局で圧倒的優勢から 歩打ち無限ループ に嵌って負けました。(悲)

回避しないと駄目なループは、自分から見て

歩打ち ⇒ 同歩 ⇒ 同* ⇒ 受けの歩打ち ⇒ 逃げる...手番の放棄

...ですね。

同一手順回避 P4

繰り返しを検出するのは難しくはないとしても 対応 が面倒なので ⇒ 回避するということは、自信が信じる(*)最善手以外の手を選ぶことになり...その結果、自分の形勢を損ねては自爆行為ですし...

(*)探索の量・質が足らないですけど...

>「歩打ち、歩突き捨て」は、「盤面」は一見同じに見えますが、「持ち駒の数」が違ってきており「同一盤面」になっても「同一局面」にはなりません。したがってこれは千日手になりません。

誠にもってその通りでございます。我の問題は 歩打ち・突き捨て を繰り返すことによる

①時間の浪費
②持ち歩の消耗

...で、形勢を損ねるのが問題です。

テスト対局では千日手は滅多に起きません...

同一手順回避 P3

管理人さ~ん。

「歩打ち、歩突き捨て」は、「盤面」は一見同じに見えますが、「持ち駒の数」が違ってきており「同一盤面」になっても「同一局面」にはなりません。したがってこれは千日手になりません。

馬で飛車を追いかける、とかは持ち駒が変わらないので「同一局面」4回で千日手になります。

まだ仕事が終わらない・・・

同一手順回避 P2

簡単に理論崩壊しました。

(例)

歩打ち ← 受けです
歩打ち ← ぶつけて来ました
同歩 ← 取る一手です
同飛 ← 取り返されました
??? ⇒ ここでまた歩が打てないと受けが成立しません

同一手順回避

...は現在装備されていないので時として不毛な 

①歩打ち、突き捨て ⇒ 4手のサイクル
②馬で飛車の追いかけ ⇒ 4手のサイクル

を繰り返すことがあります。

千日手云々は別としても(*)同手順の繰り返し防止は導入するべきですね。

さて...実際にはどうするべきか考えましたが、盤面データに指し手の履歴が在りますので安易に4手前をチェックして回避すればいいのか...な?

(*)対戦相手が千日手回避してくれれば我の方はやらなくてもよろし...と他力本願なのです。

((追記)) で、探索も少しだけ速くなるはず...なのですが。

現在のNPS

...は初期盤面を探索した場合、60~80万ですね。 ← 前より速いが(~2倍)、大した事は無い

対局中はハッシュが利くので100万超えますね。

今日の改良 P2

...PVノードからの読み幅を広げ、CUT/ALLノードでの探索をしぼりました。
もっとテストが必要ですがよろしいみたいです。

なんとなく最良優先探索風になってきた...

詰め将棋コード

...実装完了。

現在不成りは生成しませんが今はこれでよし...とします。(*)

残りは...

⇒ 定跡から手を指したときポンダーする
⇒ 詰め将棋コードを組み込む
⇒ 負けたときの評価値がおかしくなるので直す

(*)実際、詰め将棋で不成りが必要なのは創作品を除けば数えるほどしかありませんし...

テスト対局棋譜

(それなりに)強くなれたのかな?
ご批評お願いいたします。


考えすぎは良くない

...いや、有害です。

CUT/ALLノード打ち切りは適度なところに落ち着いたみたいです。

選手権まで一ヶ月ですう。

およっ?

PVS = Principal Variation Search を忘れていました。
実験するべし。

現状確認

①序盤・中盤はそつなく指せるみたいです ← 評価値を見る限り
②並列化は...これ以上あんまし手を入れたくないです
③CUT/ALLノードの枝刈りは...ハッシュテーブル等の手でカットが起きなかった場合、カットが平均2ノード以下で起きるのでこれ以上は無理っぽい

④終盤で手が広くなるともたつきます

...とすればやるべきことは

PVの兄弟ノードを如何にして早期に見切りをつけるか?

...ですなあ。(難)

深く読めれば見切りを付けるのはカンタン(いや、深く読めるのならその必要すら無いデス)。それが出来ないから困っている訳ですね。

無明5のコードを

...手直ししてみたら意外と強いです。フム。

未だ弱いですね

...更なる修行です。

今日の失敗 P3

Futility Pruning の問題は解決した...と思います。 ⇒ 使用時の条件を絞りました。

今日の失敗 P2

静的探索が時として妙な結果を出すのでオーダリングを変更しました。

((追記)) 結果として以前もたついていた局面での挙動が改善したみたいですね。

((追記)) これでFutility Pruningの問題が解決したらもうけもの。

今日の失敗

Futility Pruning と Razoring がへんちょこりんですね。
どこで間違えたのかな???

今日の改良

...ムーブオーダリングは並列で処理するわけですが、以前の探索結果が使用できる場合にはスレッドプールは不要ですので、その時は生成しない ⇒ 必要時のみ召喚するように変更しました。 ⇒ 少々速くなったと思われます。

評価値の差分計算

...をまた考える時期となりました。

ボナ系の評価値は

持ち駒 + KKP + KPP

...で計算されます。K = King = 玉、 P = Piece = 玉以外の駒

あまりに自明ですが、将棋の盤面上の変化は ①駒を盤面に除く、②駒を盤面から置く で表現されます。

①駒を盤面に除く

持ち駒 - 変化ナシ
KKP - この数値がゼロになる <- 駒が居なくなるので
KPP - この数値がゼロになる <- 駒が居なくなるので

②駒を盤面に置く

持ち駒 - 変化ナシ
KKP - この数値が??になる <- 駒を置いたので
KPP - この数値が??になる <- 駒を置いたので

よって、差分は

[現在の評価値] - ① + ②

...となります。(持ち駒に関係する評価値は現在無視しています)
これっておもったより難しくない...みたいなんですが...

((大例外)) - 玉が動くと変化する部分が多すぎる(全部です)ので素直に計算した方が良いですね。

指し手の種類は...

①盤上の駒を動かす

A.取らない、成らない
B.取る、成らない
C.取らない、成る
D.取る、成る

②駒を打つ

B,D と ② において持ち駒関係の評価値が変わります。

難易度でならべると

② 1A 1C 1B 1D...かな?

((訂正)) KKPの計算は持ち駒の数も考慮しますので盤面の駒だけではありませぬ。

((追記)) 評価関数のコード読み返していたら(無駄な努力ダケド)冗長な部分を発見したので即刻修正しました。ちょびっとだけ速くなった(つもり)。

序盤・中盤

...はそこそこ指せるようになりました。

ですが、現在の実装では終盤がとろいですね。

ソフトを書くということは...

...本来は人力ですること(将棋を指す)をマシンで自動で遂行するため人力を消費する...と、結果としては

人力 ⇒ ((変換)) ⇒ 人力の結果

...なのね。

Aspiration Search の幅を絞ってみる

...以前の敷居値は緩めだったので...

OCの状況

...4.2Ghzの設定で負荷テストです。

CPU最高温度は55℃で安定...余裕で安全圏です。

合法手生成テストではラップトップと比較して3倍以上のスピードが出ています。 ⇒ 仮に全部分で3倍になっても読める深さは1~2手程度なのですが。 ⇒ 気休め、気休め。

現在の状況 P3

探索深度強化の為枝刈りを増やしましたが、未だ及ばぬみたいです。 ← 終盤の斬り合い時に踏み込みが足りませぬ。

まあその内なにかいい方策が浮かぶでしょう。

現在の状況 P2

次はSSPよりかなり格上のソフトと対戦しました...

中盤までは互角でしたが(中盤でヘボして瞬間崩壊は無くなりました)、終盤が進むにつれてジリジリと引き離されました。 ⇒ まだ探索深度不足ですね。

現在の状況


1コアでテスト対戦しました。以前より進歩・進化したはず...です。

久しぶりに対局したら

...完全にボコられました。

コメントの表示オプション

お好みの表示方法を選択し、「設定の保存」をクリックすると、表示方法を変更することができます。