終盤が明らかに弱い。
私自身将棋が弱いためもっぱら
激指2の「棋譜解析」と「検討モード」を使って悪手を探している。
中盤までは解析で出した答えを検討すると
確かにそうかと初心者の私でもわかるのだが、
終盤の場合、
なんとなく無駄な王手による水平線っぽい手だとはわかるものの
この場合は確かにそうだけどこうならどうなんだろう?
と王手が絡んだりそれを逃れたり複雑すぎて初心者の私ではよく分からない。
なので修正のしようがない。。。
でも棋譜解析を見ると
明らかに序盤で劣勢になって中盤で盛り返して終盤で逆転される将棋が多い。
終盤は基本的にKFEndさんのページをそのまま鵜呑みに使っている。
(また鵜呑みですが・・・)
ただ現状の探索速度だと終盤が明らかに読みが遅くて深く読めない。
また、終盤用の指し手生成を行っていないので勝手読みも入っているようだ。(未確認)
もうあまり将棋ばかり作っていられないのだが
でもやはりあまりに弱くてまた気になってしまう今日この頃でした。。。
スパーリングするのによく激指2を使っているのだが、
学習機能をOFFにすると同じような対局が続いてしまう。
しかし逆に学習されると前よりどれだけ強くなったのかがわからないような気がして
毎回学習履歴をクリアした上で学習機能をONにすればいいのではないかと思い
試しに学習した履歴をクリアしてみた。
するとここまで変わるのかというくらい激指の手が弱くなってしまった。
う~ん、これでは学習が進むまでチェックができない・・・
どうしよう・・・
探索速度が相変わらず遅い。
現在、指し手の生成は反復するたびに1から生成している。
特に深さに応じて指し手の生成種類を変えてないので
ツリーにつなげて反復時の生成分を高速化できなくもない。
ツリーにするということは追加する度にnewする必要があるってことだよなぁ・・・
追加のたびにnewするのはなんとなく気が引ける。。。
KFEndさんの指し手のツリー構造はどうやって実現してるのだろうか。
そもそも指し手は小出しで生成はしているのだが、
小出しゆえにカットが起こらない場合、
何回も指し手の生成を検討してしまって無駄が多い。
一回でやろうと思えばコードが汚くなって追加修正がしにくくなるし、
まいった、まいった、、、
現在DirectXベースで開発しているため
CPUの手番でも常にGUI(ゲームループ)を動かしている必要がある。
なので先読みの時はもちろんCPUの手番でも基本的に
思考ルーチンはスレッドで動かすことになる。
そうなると表示中の盤と思考中の盤が二つ必要になる。
しかし今まで思考ルーチンの部分をCベースで開発していたため
簡単に盤を増やすことができなかった。
なので今日まではなんとか無理やりひとつの盤でがんばっていた。
もちろんバグの温床となりえるコーディング。
が、今日の負けた腹いせにC++で1から作り直した。
データ構造はほとんど変える必要はなかったので
そのままC++で囲っただけに近い。
でもこれでコードがきれいになった。
はぁ、すっきりした。。。
2勝2敗。。。
だめだめ・・・ orz
必至探索で強制終了したり(ヌルポ参照で自爆)
投了がちゃんと送れなかったり(\nが送信できてなかった?)
王を囲ってくれなかったり(駒組み下手すぎ)
馬をタダ捨てしたり(明らかなバグ)
相手の穴熊に全く攻める気がなかったり(評価関数がしょぼい)
相手がしかけてこないと仕掛ける気0だったり(特に最終戦がひどかった・・・)
全くお粗末な内容でした。
まぁいいか、
ここがスタートラインということで
ぼちぼち改良しようと思います・・・