大会版のバイナリなので、なんとか25分で指そうとするよう時間調整を入れる。
Niftyでも公開する。
高速化のために、新たな工夫をしていたのだが、効果無し(--;;
マルチスレッド化開始前の最後のRelease。
現在作成中の、駒の交換値が高い順番を保持する機構にバグがあり、落ちることがあったので修正版をリリース。
PVSで利用する、指し手の生成にバグがあった。 通常の手生成は問題ないのだが、手生成&前向き枝刈りにかかる時間を短縮するために、 通常の手生成の前にβカットの起きそうな手を生成する&昔生成した手を利用する、 という部分にバグがあり、指すことの出来ない手(違法な手)を指そうとしていた。 2/10版だと、落っこちてしまうこともあったようだ。
今回はDLLのみ提供。
NullMoveによる枝刈りにバグを見つけた。詰んでいる局面でパスすることで、詰みを逃れた気持ちになってしまうようだ。パスを評価する前に、可能な着手があるのかどうかチェックを入れるようにしてみた。
玉の広さをちょびっとだけ評価に加えた。単純に広さを評価すると変な手を指したがるので、変な操作を加えた。
αβにバグを見つけた。ハッシュに登録する際に、評価値とα値・β値の関係でハッシュに登録する値を変更する処理があるのだが、そこに変なバグがあった。これだと、PVSやMTDfの時に変なことが起きてしまいそうだ。
探索の方法をαβからPVSに戻した。MTDfやMTD-DualPlusもこれからテストしてみる。
問題集に対しての正解率で性能を測ってみることにしてみた。現在、思考時間40秒なら50/81問正解できる。このくらいで、推定棋力は3〜4級くらいらしい。
作者、30代最初のリリース。
手の生成の順番をほんの少し変更した。ほんの少し効率的になったはず??
デバッグ用のファイルに、何番目の手が一番良かった、とか、ログを残すようにしたが、何番目の手が一番良かったか記録するところがバグってたので修正。
作者、20代最後のリリース。
手の生成の順番を少し変更した。少し効率的になったはず??
デバッグ用のファイルに、どんな手でβカットが起きた、とか、何番目の手でβカットが起きた、とか、何番目の手が一番良かった、とか、その辺のログを残すようにした。
駒をただで捨てる手に対して、読みを延長するようにして、ただ捨てを少なくしたつもり。
高速化のために入れたルーチンのせいで、手の生成がバグっているみたいなので、外してみたけど…。
大駒が敵陣から動く時に、不成になることがあったので修正。
読みの末端の局面の評価の方法を変更。駒を取る手と歩・香・桂が成る手を2手だけ延長し、さらにそこから、今まで同様、取ると一番相手が痛い駒を取る手を一手、読むことにした。元のより、乱戦に少し強くなるはず。
NullMoveにくだらないバグがあったので、修正。
10/10版から導入した、0.5手延長があまり効果的でない感じなので、中止。
今のところ、なんだか、基本の読みが浅くなりすぎる感じがする。
定跡をさらに手直し。今回の版からは、定跡を一緒に配布しています。 以前の定跡データ(Joseki.bin)を持っている方は、usapyon.iniを編集して、
JosekiFile=1999.bin joseki.binとすると、以前の定跡も一緒に使用できます。
定跡のボーナスの利用の仕方にバグがあり、αβの結果との絡みでおかしなことになっていたので、修正。
パスによる枝刈り(NullMove)を再度導入。 昔鈴木将棋で使っていたけど、何か思うように動かなかったんでやめたんだけど、今度はうまく動いている感じ。
ハッシュされた局面での着手をバグ取り。
Futility PrunningとExtended Futility Prunningを導入。末端での局面の評価回数を減らして、 速度を大幅に改善できたはず。
ある地点での駒得を計算する際に、影の利きを考慮できるように変更。 時々とんでもない手を指していたけど、これでもう少しましになるはず。
デバッグのためのログの出力を大幅に変更。
デバッグ&評価のために、問題集を解くための機能を追加。でも、機能を公開していないので、ユーザには関係ない(^^;;
小駒の価値を位置によって変更するコードを追加した。効果は良く分からない。
うーん、もっと前にやったはずなのに、履歴に残っていないなぁ。
先読みの中で、詰め将棋を呼び出すようにしていた。いつ変更したのか忘れた。
定跡ルーチンを大幅に変更した。
具体的には、
lass Joseki { 準備(); 手 定跡通り(); }; Joseki::準備() { 定跡ファイルから棋譜を読み込む; } 手 Joskei::定跡通り() { 現在持っている全部の棋譜を現在の手数まで並べる 現在の局面と一致している棋譜を探す 現在の局面とあまりにかけ離れている棋譜は捨てる 一致している棋譜で次に指された手を候補手とする return 候補手から乱数で選ぶか、 または候補手の中で一番多く指された手 (iniファイルのJosekiRandom=1,0に対応) }というもともとの実装に、
class 定跡候補手 { 手 te; int ボーナス; } 定跡候補手* Joseki::部分一致() { for(現在持っている全部の棋譜) { for(手数=現在の手数-2;手数<=現在の手数+4;手数+=2) { 棋譜を手数まで並べる; 現在の局面と、 自玉側の横9x縦5の領域が一致する棋譜を探し、 その局面で指された手が、一致する領域で指された手なら、 そこで指された手にボーナス45点を与える 自陣の右側の横5x縦5の領域が一致する棋譜を探し、 その局面で指された手が、一致する領域で指された手なら、 そこで指された手にボーナス25点与える 自陣の左側の横5x縦5の領域が〜25点与える 盤面の左側の横5x縦9の領域〜45点与える 盤面の右側の横5x縦9の領域〜45点与える } } for(候補手) { 現在の局面で合法かどうかチェックし、合法でなければ候補から外す; } for(残った候補手) { ボーナスにものすごいたくさんの点数が入っているので、適当に正規化; } return 残った候補手; }を追加して、候補手とボーナスを計算しておき、通常の先読みの中で、このボーナ スを足して手を評価することで、
生成した手の保存にバグがあるのを発見(してもらった。ありがとう奈良さん)したので修正。
最良の手が更新される際に、必ず0.5手延長するアルゴリズムを採用。
とりあえず、9〜11手ぐらい先を読めるようになった。
ただし、最良でなさそうな手は深く読まないので、本当に9〜11手読んでいるわけではなく、
ほとんどの手は5〜6手しか読まない。
効果の方はまだ良く分からない…。
この一ヶ月、色々実験してみたんだけど、結局うまく行かなかったことばかりなので、あちこち元に戻っている。
でも、戻りきっていないところの分だけ強いかもしれない(^^;;のでリリースしてみる。
前向き枝刈りで、意味のある手・ない手の判別をやめた。とりあえず、全部残してみる。 ただし、手に評価値を設けて、評価値の高い手を上からn手(nは読みの深さによって違う)選ぶことにした。
以前は、同一の局面に対して何度でも手の生成・手の評価をしていたが、このバージョンでは、 生成・評価した手を記憶することにした。(おかげでメモリつかいまくり。)
以前は捨てていたような手(駒のただ捨てなど)については、とりあえず捨てないで置いて、 手の評価を大幅に下げる(桂馬一枚〜銀一枚くらい)ことで対処した。
手の評価を変更した。以前は、敵駒へのあたりを高く評価していたが、このバージョンでは、 評価に工夫をし、8手のうち6手では敵駒へのあたりを評価しないで評価の高い手、 残り2手は敵駒へのあたりを評価して評価の高い手、を残すようにした。
末端局面において、王手がかけられているという判定がおかしかった(--;;
味方の利きと敵の利きを間違えていた(^^;;
末端局面の評価や指し手をハッシュに保存することにしてみた。
デバッグ用の表示に、うその手が出てくるバグがあったのでとった。
でも、強さ(弱さ??)にはかけらも関係ない(^^;;
王手がかけられている局面の評価がものすごく遅かったので、もっと手抜きな評価をすることにした。 これで、読みの深さは以前と同じ程度になるだろうと思う。 8/15版だと、読みが一手浅くなっていた気がする。
やっぱりすごいバグがあった(^^;ので修正して再リリース。
安定している気がしないんだけど、大きい変更をしたのでリリース。
前向き枝刈りを行うようにした。特に、持ち駒を打つ際には結構厳しく前刈りしている。 枝を刈った後に、探索の深いノードで出てきた有効そうな手を浅いノードで指すことが出来るようにしているが、 インプリメントがまだいい加減なので、「有効そうな手」でない手も浅いノードで評価してしまいそう。
とりあえず、どの深さでも評価する手の上限は最大50手とした。 前向き枝刈りによって、たいていはもっと少ない手しか指さないはず。
末端のノードの評価がまずいので何とかする必要がある。
#最後に動かした駒しか取り合いを評価しないからなぁ。
現在の盤面の中で取り合いが起きたら、評価が大きく変わる手を評価するようにしないと。
久しぶりに安定版ができたのでリリース。
反復深化を途中で打ち切った際に変な手が出るのを今度こそ修正した。
ハッシュに登録しておく最善手を、二つに増やした。
駒を打ってすぐ取られるような場合に、それによって評価値がα値を超えてしまう場合、読みを2手延長するようにしたつもり。
だけど、よーく考えてみると延長の方法を間違っている気がするなぁ。
駒を打ってすぐ取り返す手を評価した時に、α値を上回る場合に2手延長しているんだけど、これでいいのかなぁ。
またインプリメントしなおしか?
駒の交換値を、駒が動くたびに、それによって利きの変化した地点で計算するようにした。
手の評価を、一手先の評価値+駒の交換値の増減、のようにした。
その評価値で、前向き枝刈りをちょっぴりやってみた。あまり刈っていないので効果は薄い(^^;
次は、もっと枝を刈り込んで、深く読めるようにしてみるつもり…。
うさぴょん復活。前の版で出していたデバッグ用窓を消して、うさぴょんを復活。
反復深化を途中で打ち切った際に変な手が出るのを修正したつもり。
結局手の評価を一手進めた局面の評価にした。
盤面の評価を、移動した駒の行き先の地点での駒の取り合いにした。
よーするに鈴木将棋と変わらない(--;
αβを変形して多少効率を上げた(つもり)。
手の評価を行うのに、移動先地点での取り合い+その地点から駒の逃げる手を評価するようにした。
盤面の評価を行うのに、最後に駒が移動した地点での取り合い+その地点から駒の逃げる手を評価するようにした。
うさぴょんであることをわかりやすくした。
すごくいっぱいメモリを使うようになっていたので修正。