将棋ベーシック改の高速化まあまあ進行

 まずは指し手生成とか合法手生成と呼ばれる探索部の根幹部分で指し手データであるMoveDataを空きでnewしてから代入していたのをSub New(a,b,c,d)と引数付きのコンストラクタを作ることでメモリの高速化を実現。コンストラクタはデフォルト、指し手付き、持ち駒から駒を置く時の3種類となった。

 次に詰み局面というか、玉または王が取られるまで計算するので玉の点数を高くすることで得点が一定値より高いと終端ノードとして詰将棋も駒得も同じロジックで計算していたけど、評価関数の複雑化と詰みの判定が同じ関数であるために指し手を進めるたびに「詰んでいるか」を評価する関数を通るので、総合点で詰みを判定するのではなく、まず「玉があるか」だけで高い得点を判定して、双方の王と玉があるときには厳密に得点を計算するという簡単な方法で案外とそこそこの高速化になった。

 ここまでが今朝までの改良。

 次に終端ノードでの指し手のうち、終端ノードで駒を手駒から指す指し手を全部枝刈りしようかと考えたのだけど、自分の研究のテーマというか電竜戦の参加テーマだった「駒の利きを評価することで疑似的に深読みする」というところを手駒からの指し手の文ほとんど刈ってしまうこととなる。悩んでいるが、まず実装してみて指して試験してみないとどれくらい変わるか実感は無いよなぁ。考えつくせないからコンピュータに問い合わせているわけだから。

 ただ、改良を重ねると今までの実験はコーディングとコンピュータの思考待ちで自分は待ちながら他の作業をしたりタバコを吸ったりだったけど、返事が速くなった分だけ自分の将棋に対する思考時間が増えて強くなったかもしれない。

 今朝の始まったばかりのNHK連ドラを丸々1回見逃して、まあ昼にももうワンチャンあるんやけどさ。

 まあ、終端ノードでの手駒を刈ると速くなったとして、速くなったら持ち時間に余裕が出来るので別のロジックで軽いものが見つかったとしたらそれを追加できるので、作業することとした。結果は追記の形で書くとして、進捗報告は以上です。

 

追記:

 終端ノードでの手駒からの指し手を枝刈りしてみて、十分に強かったので採用。それでも先手後手とも手駒が3種ほどあると1分くらいの思考時間となる。

 1時間くらいの持ち時間の将棋なら、まあ指せるかなと。

 まあ変更点としては少ないけど、ソースを読み直して考えてアイデア出しもして採用しやすいものからデバッグのため試験対局もやったので今日はここまでとします。

 

参考スペック

 富士通Win10ノート型

 Intel(R) Core(TM) i3-7130U CPU @ 2.70GHz   2.70 GHz


🄫1999-2023 id:karmen