CPU将棋
お年玉で色々な評価関数が発表されましたね。
令和2年1月1日現在。
少なくとも GranpusF と hinnyF改 を確認しております。
(私はもちろん両方ともダウンロードしました。)
どちらが強いか計測班の速報を待ちましょう。
さて、そもそも論ですがCPU将棋って皆さん知っていますか?
パソコンで使える将棋ソフトでしょ?って声が聞こえてきそうですね。
実は全て無料でダウンロードできるんです。
棋譜解析や局面の検討、もちろん対局(駒落ち)もできます。
有料のソフトより強いのが特徴です。
パソコンで将棋を指す人でこれを入れていないのはもったいないです。
細かい設定をしたり、定跡を入れたり、評価関数を入れたりするのは少し敷居が高いかもしれないので、全部セットになっている物を紹介したいと思います。
(全て設定するとプロ棋士よりも強くなります。)
『ShogiGUI』 というものを無料ダウンロードすればCPU将棋に触れることができます。
(同梱の 評価関数 定跡 で必要十分です)
(評価関数の導入 定跡の導入 は改めてレスに上げたいと思います)
ダウンロード先はこちら。
http://shogigui.siganus.com/download.html
このページの一番上(最新の ver.0.0.7.14 ってやつ)の『インストーラ版』ってやつをクリックしてください。
このファイルをインストールすればCPU将棋を導入することができます。
設定や定跡、評価関数の話は後回しです。
使い方は感覚的に分かると思いますが分からなければ、
対局の仕方
https://sites.google.com/site/shogigui/manual/game
検討の仕方
https://sites.google.com/site/shogigui/manual/consider
棋譜解析の仕方
https://sites.google.com/site/shogigui/manual/kifu_analysis
これぐらい目を通していただければほぼほぼ使いこなせると思います。
ご年配の方も騙されたと思って一度試してみて下さい。
エンジンの設定
ツール>エンジン設定>(エンジンを選ぶ)>設定
ここで色々な項目を設定できます。
具体的には下記を参考にして下さい。
設定
USI_Hash 【1024】 置換表サイズ。
USI_Ponder 【True】 相手番での考慮。
Threads 【8】 スレッド数。
Hash 【4096】 置換表サイズ。512以上が推奨。
注意)USI_Hash で設定された値は無視されます。
これは将棋所で、エンジン同士を対局させるときに異なるハッシュの値に
設定することが出来ず、USI_Hashの値に従うと片側だけハッシュサイズを変更しての
対局などのテストが出来なくなるためです。
この値は、長い持ち持ち時間で置換表の使用率が50%を超えるような状況であるなら、
OSのメモリが許す限り大きな値にしたほうが、探索効率が良くなり、
強くなるはずです
EvalHash 【1024】 EvalHash(評価関数の計算した値を保存しておくメモリ)の大きさを
[MB]単位で指定する。2の累乗でなければならない。
※ デフォルト128[MB]。もう少し大きいほうが成績がいいかも。
魔女ではAVX2用は1024[MB]。
MultiPV 1 指し手を上位から指定個数求める。
SkillLevel 20 手加減のためのもの。この値が 20 なら手加減なし。(通常のモード)
20未満であれば、手加減が有効。
0 だと最弱。(R2000以上弱くなる)
Stockfishの"Skill Level"をそのまま移植。
WriteDebugLog False デバッグログ出力。標準入出力をファイル("io_log.txt")にリダイレクトする
(logコマンドでonには出来る)
NetworkDelay 【0】 通信の平均遅延時間。(ms)これを例えば200に設定しておくと、
5.0秒で指さずに、4.8秒(200ms早め)で指すようになります。
NetworkDelay2 【0】 通信の最大遅延時間。(ms)これを例えば600に設定しておくと
秒読み10秒で、切れたら負けという瞬間に限り、9.4秒(600ms早め)に
指し手を返します。
floodgateなどときどき大きな遅延が発生するサーバーで対局させるときは、
この値を1200(1.2秒早め)ぐらいに設定することをお勧めします。
MinimumThinkingTime 【1000】 最小思考時間。(ms)2秒以内に指すと計測1秒となる場合、
2000を指定すべき。(CSAルールなど)
このとき、NetworkDelayの分は減じて思考するので計測1秒となるはず。
SlowMover 100 持ち時間を設定した対局時の序盤重視率(%)切れ負けのときの思考時間を調整する。序盤重視率。百分率になっている。
例えば200を指定すると本来の最適時間の200%(2倍)思考するようになる。
対人のときに短めに設定して強制的に早指しにすることが出来る
MaxMovesToDraw 0 引き分けまでの手数。(0=制限なし)256手ルールなら256と設定する。0なら無制限。
DepthLimit 0 何手先までを限度とするか。(0=制限なし)
NodesLimit 0 何局面を限度とするか。(0=制限なし)
Contempt 2 引き分け時のスコア(歩を100とする)引き分けを受け入れるスコア。歩を100とする。例えば、この値を100にすると引き分けの局面は
評価値が -100とみなされる。(互角と思っている局面であるなら引き分けを選ばずに他の指し手を選ぶ)
この値のデフォルト値は2にしてある。こうすることで千日手を回避しやすくなるからである。
(1だと内部的な計算で切り捨てられてしまうので効果がない。)
ContemptFromBlack False 引き分け時のスコアを先手から見た値とみなす。Contemptの設定値を先手番から見た値とするオプション。Stockfishからの独自拡張。
先手のときは千日手を狙いたくなくて、後手のときは千日手を狙いたいような場合、
このオプションをオンにすれば、Contemptをそういう解釈にしてくれる。
(Contemptを常に先手から見たスコアだとみなしてくれる。)デフォルトではfalse。
EnteringKingRule CSARule27 入玉ルール。27点法(CSAルール)
EvalDir eval 使う評価関数フォルダ。
EvalShare False 評価関数を共有メモリに展開する。
NarrowBook False 出現率の低い定跡は採用しない。
BookMoves 【120】 定跡を用いる手数。定跡を用いる手数(0=未使用)例えば16を指定した場合、開始局面から16手目の局面まで定跡にヒットする。
BookIgnoreRate 0 定跡の穴を見つける際に、一定の確率で定跡の手を不採択にする手が有効である(私調べ)ので、やねうら王の標準機能にどうでしょう
BookFile 【user_book1.db】どの定跡ファイルを使うか。
BookDir book 定跡ファイルを配置しているフォルダ。
BookEvalDiff 30 定跡の第一候補手との評価値の差。定跡の指し手で1番目の候補の指し手と、2番目以降の候補の指し手との評価値の差が、
この範囲内であれば採用する。(1番目の候補の指し手しか選ばれて欲しくないときは0を指定する)
BookEvalBlackLimit 0 先手番定跡の評価値下限。定跡の指し手のうち、先手のときの評価値の下限。これより評価値が低くなる指し手は選択しない。
BookEvalWhiteLimit -140 後手番定跡の評価値下限。同じく後手の下限。
BookDepthLimit 【0】 定跡の探索深さ下限。定跡に登録されている指し手のdepthがこれを下回るなら採用しない。0を指定するとdepth無視
BookOnTheFly False 定跡をメモリに丸読みしない。やねうら大定跡のような巨大な定跡を試合開始時に読み込まれるとその読み込みに時間がかかるため、
対局中、1手指すごとにファイルを読みに行くオプション。定跡は事前にソートされている必要があります。
これはmakebook sortコマンドで行なえます。コマンドの使い方については、doc/解説.txtにある。
なお、やねうら王の公式サイトで配布している定跡ファイルはsortされています。
定跡ファイル内をバイナリサーチで調べているのでファイルサイズが10GBを超える超巨大な定跡でも取り扱えます。
ランダムアクセスに近いアクセスになるので、このオプションを用いるならHDDよりはSSDのほうが好ましいです。
ConsiderBookMoveCount 【True】 定跡の指し手を採択率に比例させる。定跡の指し手を定跡DBの採択率に比例させる
BookPvMoves 8 定跡にヒットしたときにPVを何手目まで表示するか。あまり長いとPVの出力に時間がかかる場合があります。
(HDD使ってて巨大定跡でBookOnTheFly有効だと特に…)
※これは、定跡の指し手で1手実際に局面を進めて、再度定跡にヒットするか判定することを繰り返すため。
このとき、ConsiderBookMoveCount = true , BookEvalDiff = 0 , BookMoves = 0 BookDepthLimit = 0 ,
BookEvalBlackLimit = -99999 , BookEvalWhiteLimit = -99999 として扱われます。
IgnoreBookPly 【True】 定跡DB上の手数を無視する。
例) 局面図が同じであれば、定跡上の36手目の局面に40手目の局面でもヒットする。
PvInterval 300 PVの出力の抑制時間。PVの出力を抑制する。前回出力時間から、この時間(単位は[ms])経過するまでは次のPVを出力しない。
ResignValue 99999 投了スコア。例えば3000にすると相手から見た評価値が3000以上(自分から見たら-3000以下)になった場合に投了する。デフォルトは99999。
nodestime 0 開発者以外関係なし。node as timeモード。時間の代わりに探索ノード数を決めて探索するときのミリ秒当たりのnode数。
この値を0に設定するとnode as timeモードではない。
例) この値を600と指定した場合、go btime 1000とすると、600000ノード(の時間が与えられたものとして)探索する。
1スレッドあたりのnps / 1000 ぐらいを指定すると、goコマンドを従来通り使える。
Palam1 0 パラメータ自動調整用X軸(開発者以外関係なし)
Palam2 0 パラメータ自動調整用Y軸(開発者以外関係なし)
ConsiderationMode 【True】 検討モード用のPV出力。(検討で使用する場合はTrue)"検討モード用のPV出力"ShogiGUIなどの検討モードで用いるためのもので、
このオプションをオンにすると中途半端な読み筋が出力されることが減ります。
OutputFailHPV True fail_low/highのときもPV出力。fail low/highのときにPVを出力するかどうか。ConsiderationModeでも有効。
【 】内は自分の環境に合わせて設定します。
私はメモリを16GB積んでいるのでこの設定です。
自分のPCに合わせて増減して下さい。
いよいよ導入です。
(ShogiGUIは導入済みとします)
まずは下準備。
デスクトップに新しいフォルダを作って下さい。
名前を仮に『将棋ソフト』としてください。(後で変えるので何でもいいです。)
そのフォルダの中に二つ新しいフォルダを作って、名前を『eval』と『book』にしてください。
『eval』には評価関数ファイルを入れて下さい。(nn.bin)
『book』には定跡ファイルを入れて下さい。(user_book1.db)
『eval book』と同じ階層に探索部を入れます。
探索部は YaneuraOu2019V488all の中から、
YaneuraOu2018NNUE_nosse.exe
YaneuraOu2018NNUE_sse2.exe
YaneuraOu2018NNUE_sse41.exe
YaneuraOu2018NNUE_sse42.exe
YaneuraOu2018NNUE_tournament.exe
をコピーして貼り付けて下さい。
上記は下へ行くほど新しいパソコン対応。
上へ行くほど古いパソコン対応です。
ShogiGUIで設定するときに、下から順番に設定してみて、動かなかったら一個上を試すのを繰り返します。
どれが自分のパソコンで動くか分かったら次からはそれだけコピーすればOKです。
次にフォルダの名前の変更。評価関数名/探索部名 としましょう。
Grampus3/YO488 という感じです。
これで下準備は完了。
次にShogiGUIを立ち上げます。
ツール>エンジン設定>追加 をクリック。
デスクトップの先ほど作ったフォルダのexeファイルを下から順番に試しましょう。
立ち上がったら名前を Grampus3/YO488 に変えて設定はそのままでOKしましょう。
これでとりあえず使えるようになりました。
次はエンジンの設定に移ります。
4.定跡
定跡は説明の必要はないですよね?序盤の手筋の集合体です。
例えばその局面で定跡ではどの手かというのを矢印で表示することができたりします。
またCPUとの対局で定跡を入れていなければ、一手一手考えながら指してきますが、定跡を入れておけばノータイムで指してくれます。
定跡も評価関数と同じく、探索部と一緒に入れておくだけです。
(後述しますので、根気よく読み進めて下さい)
定跡も何種類かあります。
1.700テラショック定跡
私はこれを使っています。
https://github.com/yaneurao/YaneuraOu/releases/tag/BOOK-700T-Shock
2.白黒定跡(他)
https://onedrive.live.com/?authkey=%21ADXFPaoXVeV0uFE&id=67BEC1094A080033%2135656&cid=67BEC1094A080033
3.C-book
千田翔太先生が作った定跡ファイル
https://www.dropbox.com/sh/uhzkp1q708porur/AADSnT3RIKtS8tJJh9jCsviwa/定跡%E3%80%80(C-book)?dl=0&subfolder_nav_tracking=1
(アドレスの途中に『定跡』と日本語が含まれるので飛べないですね。コピペして下さい)
定跡も評価関数と同じく、探索部と一緒に入れておくだけです。
(大事な事なので二度言いました)
3.評価関数(その局面に点数をつける基準です。)
評価関数って何か難しい言葉ですよね。基本は歩が100点とか、1500点以上離れるとCPUに逆転するのは難しいとかあるんですが、難しい事は抜きにして、探索部と同じ所に入れておけば大丈夫です。
(詳しくは後述します)
評価関数もたくさん発表されています。
エルモ(elmo)とかエイプリー(Apery)とか聞いたことないですか?
あれは評価関数の名前なんです。
評価関数の違いで強さが変わると思っておけば大体OKです。
ではどの評価関数を選ぶかなのですが、強いのを選んでおけばOKです。
その時点で一番強い評価関数をSOTA(ソータ)といいます。
SOTA=State of the Art (技術の到達点。藤井聡太7段をイメージして下さい)
現在の(裏)SOTAは Gurampus3 test40 です。
https://33.gigafile.nu/0109-d173b99c65334592057a29a3db1077d41
そして振り飛車の評価関数も必要です。
現在の技術では居飛車の評価関数で振り飛車の評価をするのは難しいので専用の評価関数を使います。
振り飛車最強の評価関数のことを TAKESHI と言います。
TAKESHI=The Art of King Evalute-function for Swinging HIsha
(最善の振り飛車評価関数技術。藤井猛9段をイメージして下さい)
今日現在、TAKESHIは定まっていませんが、SOTAとセットで、
GranpusF test48 を使いましょう。
https://20.gigafile.nu/0301-b215ace9d27bb9c9918c8dec221853b9f
同じ理屈で駒落ち用評価関数。NNUE kaiU
https://onedrive.live.com/?authkey=%21ADXFPaoXVeV0uFE&id=67BEC1094A080033%2136387&cid=67BEC1094A080033
評価関数は探索部とセットにしないといけません。
(大事な事なので二回言いました)
2.探索部(エンジンと言われますが人間の脳みそだと思ってください)
思考部分の事です。
短時間特化のエンジンだったり、色々なエンジンがあります。
私も何種類か使っていますが、今現在は『やねうら王』を使っておけば間違いないかと思われます。
1.やねうら王
https://github.com/yaneurao/YaneuraOu/releases
ここで YaneuraOu2019V488all.zip をダウンロードしてください。
2.dolphin(ドルフィン)
評価関数である illqha(イルカ) とセットになっている探索部。
https://drive.google.com/file/d/13jSnNwc1RT_TSX6CnS2tbouHc_6scfsk/view
3.Ditto4s
4.V2
上記二つは短時間特化エンジンです。興味があったら検索してみて下さい。
5.脊尾詰め(せおつめ)
詰将棋エンジン。ミクロコスモス(1525手詰)が解ける。
http://panashogi.web.fc2.com/seotsume.html
ここで大事な事があります。
エンジンと評価関数、定跡は一つにまとめないとGUIで使えません。
(まとめなくても使えるものもある)
根気強く最後まで読み進めて下さい。
1.GUI
GUI=グラフィカルユーザーインターフェース
(Graphical User Interface)
将棋盤と駒、駒台の事だと思ってください。
>将棋やチェスなど、思考ゲームのソフトを作る人にとって、重要なのは「いかに強くするか」という思考アルゴリズムの部分であって、盤面表示などのGUIの部分は本質的ではありません。
しかし、ゲームソフトにとって、GUIというのは欠かせない部分です。しかも、その作成は面倒です。この、「本質的ではないのに面倒な」GUIの作成というのが、思考ゲームのソフトを作成する上で大きな障害になっていたのは間違いありません。
そこで、GUIと思考部分を分離すればいいのではないかという考えが生まれてきました。
肝心の思考部分の作成だけに集中することができます。
GUIと思考部分はUSI(Universal Shogi Interface)プロトコルでつながっています。
引用元:http://shogidokoro.starfree.jp/why.html
GUIは何種類かから選ぶことができます。
1.ShogiGUI
私はこれを使っています。
http://shogigui.siganus.com/
2.将棋所
確かCPU将棋大会では公式に使用されているものだったはず。
http://shogidokoro.starfree.jp/index.html
3.WhaleWatcher(ホエールウォッチャー)
エフェクト付きの将棋盤。可愛いキャラがでてきます。
http://garnet-alice.net/programs/whalewatcher/
将棋盤等の画像を差し替える事ができます。
(駒の書体を換えることもできます。)
その素材(の一部)はこちら。
http://shineleckoma.web.fc2.com/
※マイボナ 画像 で検索すればたくさんでてきます。
もちろん何も変更しないで使っても大丈夫です。
CPU将棋は導入できましたか?
次はもうちょっとだけ踏み込んだ話。
(難しいと思ったらこの先は読み進めなくて大丈夫です。ShogiGUIだけで十分完結できます。)
CPU将棋は4つに分けて考えると理解しやすいと思います。
1.GUI(将棋盤と駒、駒台の事だと思ってください。画像を変更できます)
2.探索部(エンジンと言われますが人間の脳みそだと思ってください)
3.評価関数(その局面に点数をつける基準です。)
4.定跡(これは説明の必要はないですよね?)
この4つの組み合わせでCPU将棋は成り立ちます。
ShogiGUI は4点セットになっています。
2~4を差し替えることによって最強の環境を手に入れることができます。
次からは一つ一つ説明していきます。