56将棋開発ブログ

5×6マスのミニ将棋、「56将棋」で遊べるものをいろいろ開発してます。

56将棋でPerft

はい。約10か月ぶりのブログ更新です。

競技プログラミングAtCoder)をしたり、ランニングしたりしてたらこんなに時間が経ってしまいました。

最近はAperyを56将棋エンジンに改造すべく、ぼちぼちソースコードをいじっていました。
で、指し手生成はできるようになったので、合法手生成がきちんとできているかチェックしました。
コンピュータチェス(将棋)では、Perftという方法でテストするのが一般的みたいなのでやってみました。

chessprogramming - Perft

将棋でPerftしてみたまとめ - Qiita

将棋でPerftしてみたまとめのまとめ | やねうら王 公式サイト

一言でいうと、「すべての合法手を生成して局面を進めたとき、n手後に現れる局面数を求める」テストです。(わたしの理解が正しければ)

本当は複数の人でテストして、結果が一致するか確かめたほうが良いのですが、
とりあえず今回はAperyベースとBonanzaベース(プチボナ)とでテストしました。
以下がその結果です。

平手初期局面
f:id:tetsuzuki1115:20180313173232p:plain
sfen rskgb/ppppp/5/5/PPPPP/BGKSR b -
depth: 1 5
depth: 2 25
depth: 3 198
depth: 4 1538
depth: 5 15301
depth: 6 149264
depth: 7 1685699


いろいろな指し手が現れるように適当に作った局面
Bonanza 56shogi 指し手生成 - 56将棋開発ブログのときに使ったやつ)
f:id:tetsuzuki1115:20180313173452p:plain
sfen 2kgB/1pp2/1s1P1/1B2p/r1PS1/3K1 b RG3P2p
depth: 1 63
depth: 2 1621
depth: 3 75088
depth: 4 1797781
depth: 5 71016894
depth: 6 1767336536
depth: 7 62269369719

2つの局面ともに、depth7までの局面数がBonanzaベースとAperyベースとで一致しました。
よかったですね。

【追記】


ブログ更新からわずか数時間。天才かよ。(感謝)


今後はAperyの改造をぼちぼち進めつつ、だいぶ放置しているAndroidアプリのほうもやっていきたいです。
それでは。

56将棋のAndroidアプリの開発をはじめました

56将棋のAndroidアプリの開発をはじめました。

開発環境はAndroid Studioでやってます。

Java自体ほぼ初めてなので大変ですが、自分にとって新しいことばかりで楽しいです。

とりあえず56将棋の盤面を表示させることができました。

f:id:tetsuzuki1115:20170527213132p:plain

ブラウザでの開発でもそうでしたが、やっぱり最初は将棋盤と駒の画像がきちんと並んで表示されるだけでも嬉しいものですね。

この画像はNexus5のエミュレータですが、FreetelのReiというスマートフォンを持っているので実機でもデバッグしています。
このエミュレータだとなぜか「将棋」という字が簡体字で表示されてしまっていて、大丈夫なのか心配しています。(実機だと問題ないのですが)

以下のサイトがとても参考になったのでリンクしておきます。

Android用リバーシゲームの作り方
Android開発日記 - 干支将棋

Androidアプリ開発の本やWebサイトで良いものがあったらコメントで教えていただけると助かります。(買うことも考えてます)(気が向いたらですが)

こんな感じでぼちぼち開発を進めていけたらと思っています。

それでは。

プチボナ 56shogi ver 2.0を公開しました

タイトルの通り、プチボナ 56shogi ver 2.0を公開しました。

リンク先のページからダウンロードできます。

将棋GUIプチ将棋」の思考エンジンとして登録することで、対局ができます。


ver 1.0では手調整だった評価関数ですが、ver 2.0では自己対戦棋譜から学習させて評価関数を作成しました。

最初は駒割りのみの評価関数同士を自己対戦させた棋譜から学習させて、
以降はできた評価関数同士をまた自己対戦→学習という手順を繰り返しました。

こちらのページに詳しく書いたので興味のある方はどうぞ。)


自己対戦→学習の繰り返しは数回で棋力が上昇しなくなってしまいました。
56将棋は本将棋と比べて盤面が狭く、決まった形が何度も現れやすいためかもしれません。

ver 1.0に対する勝率は7割弱くらいです。
自分の棋力(将棋倶楽部24中級くらい)ではまともに指したら勝てない強さになりました。
勝てなくて悔しいので、序盤だけいろいろな指し手を検討させたりしています。

ver 2.0は、「56将棋は先手有利」と主張しているような評価値を返すことが多く、
わたしはムキになって後手も戦える変化を探しています。

ちょっとでも反省させられると嬉しいですし、一応自分が考えた初期配置なので、
56将棋はそんなに浅くないということがわかると安心します。


今後としては、Aperyかやねうら王を56将棋で動作するように改変したいと思っています。

それでは。

進捗いろいろ

せめて数ヶ月に1回くらいは開発状況を書いておくかな、という気分になったので更新してみます。

最近取り組んでいるのは大きくわけて2つ、

ごーろく将棋 56shogi ブラウザ版への機能追加
プチボナ 56shogi機械学習

です。


ごーろく将棋 56shogi ブラウザ版には、これからいろいろな機能を追加していく予定です。

とりあえず現時点で形になっているのは以下の2つです。


・局面編集
駒を好きなところに動かして局面をつくることができる機能をつくりました。

ごーろく将棋 56shogi 局面編集


f:id:tetsuzuki1115:20160226162536p:plain


デバッグなどでつかう局面をつくるのが捗るので、正直に言うと自分用の意味が強いです。

こういうものはコンピュータ将棋におけるインフラみたいなものだと思うのですが、

56shogi の解に近づくという目標を達成するため、

あるいは、もう少しごーろく将棋が普及するといいな、というささやかな希望が実現するためには、

そういったインフラを少しずつでも整えていく必要があるのだな、と実感しています。

(どうでもいいことですが、コンピュータ将棋に関係する文脈では "56shogi"、
本将棋への導入、普及、教育といった文脈では"ごーろく将棋"あるいは"ごーろく将棋 56shogi"というふうに、わたしは勝手に呼び分けています)


・練習問題

COMとの対局だけでなく、ごーろく将棋や本将棋の棋力が向上するような練習問題が毎日アップされるページをつくっています。

開発言語はphpMySQLで、ドットインストールをみて勉強しました。

練習問題の内容としては、ある局面において、浮き駒(味方の駒に支えられていない駒)をすべてクリックすると正解、というものです。

f:id:tetsuzuki1115:20160226162218p:plain

f:id:tetsuzuki1115:20160226162227p:plain

毎日数問ずつアップされるようにするのと、解くまでにかかった時間を最後に表示するようにしたら公開しようかなと思っています。


ほかにも、ある局面での駒割りを計算する問題や、あるマスで駒交換したときの駒割りを答える問題を出題するページもつくる予定です。


プチボナ 56shogi の開発の方も、ゆっくりではありますが進めています。

機械学習
去年公開したプチボナ 56shogi は、指し手生成と探索部分はほぼBonanzaそのままで、56shogiで動くようにしたというものだったのですが、
評価関数はわたしが手調整で値を決めたものでした。(というほど調整もしていないのですが)

より棋力を向上するため、機械学習による評価関数のパラメータ調整に挑戦してみよう、ということでBonanzaのコードを読んでいます。

「コンピュータ将棋の進歩6 プロ棋士に並ぶ」という本にある解説が非常に参考になっています。
(というか解説文がないと、それぞれの関数のざっくりとした役割すら全くわからないレベルです…)

とりあえず学習部分のコードすべてに目を通したら、駒得のみの評価関数同士で自己対戦させた棋譜から学習させてみる予定でいます。

学習について勉強しはじめる前は、56shogiは本将棋に比べて駒の組み合わせの数が少ないので、学習にかかる時間が少なくて済むんじゃないかと思っていました。

しかし、パラメータを調節するステップよりも、探索してPV(最善応手系列≒読み筋)を求める処理のほうが時間がかかるらしいので、
うーん考えが甘かったかな、と思い直しています。
(本将棋より早く学習が進むのは間違いないと思うのですが)

まあやってみないとわからないので早く動かしてみたいですね。

それでは。

「ごーろく将棋 56shogi ブラウザ版」をリニューアルしました

タイトルのとおり、「ごーろく将棋 56shogi ブラウザ版」をリニューアルしました。

ごーろく将棋 56shogi

f:id:tetsuzuki1115:20151028092524p:plain


リニューアルに伴いレンタルサーバを移転、URLを変更しました。

追加した主な機能としては、

1.COMレベル3、4、5
2.棋譜ツイート機能

です。

COMのレベル3、4、5は、以前に公開したプチボナ 56shogiJavaScriptに移植したものです。

反復深化のiterationを制限して強さを調節しました。

レベル4とレベル3で先後入れかえて100局連続対局した結果は96-4、
レベル5とレベル4の結果は80-20でした。

レベル5も(時間ではなく)探索ノード数を制限しているので、PCのスペックによらず一定の棋力になっているはずです。
スペックによっては思考時間が少しかかってしまうかもしれませんが、できるだけ棋力が一定になる方法を採用しました。

プチボナ 56shogi はBonanzaの指し手生成と探索部を改変したものなので、
それを移植したブラウザ版のCOMレベル3、4、5のベースはBonanzaということになります。

ただどうしてもJavaScriptだと速度が出ず、(わたしの技術力不足もありますが)
探索速度はプチボナ 56shogiの10分の1程度になっているはずです。
(一度ちゃんと測ったのですがPCが故障した時に紛失してしまいました)

なので、試していないのですが、同じ時間で対局するとプチボナ 56shogi (ダウンロード版)のほうが強いはずです。

ブラウザ版は面倒な設定をしなくて済むのが良いところなので、ある程度棋力は落ちてもしょうがないかな、というところです。


棋譜ツイート機能はColamoneのアイデアを真似させていただきました。
colamone

ツイートに埋め込まれたリンク先のページで、URLを解析して棋譜を再生する仕組みになっています。

 
細かい変更点としては、千日手とトライルールに対応したのと、デザイン・レイアウトを変更しました。

COMのレベル、手合、先後の選択画面は先日公開された「ねずみ将棋」を参考にさせていただきました。
「ねずみ将棋」には目隠し将棋、初形ランダム将棋といった楽しいモードがあるのでおすすめです。
ねずみ将棋 - SoupSeed


トライルールを含めた将棋のルールについては詳しい説明を用意するつもりです。

あとは英語版もつくりたいと思っています。(自分の英語力が心配ですが)


自分はスマートフォンを持っておらず、とりあえずPCで動作するものをつくるという方針でやってきたので、申し訳ないのですが、スマートフォンへの対応は何もしていません。

googleモバイルフレンドリーテストをやってみたところ、
盤面がものすごく小さく表示されてしまい、他にもいろいろ怒られてしまいました。

f:id:tetsuzuki1115:20151028141245p:plain

今後はスマートフォンに対応したレイアウトを考えたいと思っています。
まずは自分がスマートフォンを買うところからなのですが。


それでは。


【2015/10/28 19:05 追記】
ごーろく将棋 56shogi ブラウザ版のCOMレベル3、4、5のベースであるBonanzaを開発された保木邦仁様には本当に感謝しております。
改めて御礼申し上げます。

近況

5ヶ月も放ったらかしてしまいましたが、心機一転、ブログタイトルを変えてみました。

現在は、ブラウザ版ごーろく将棋 56shogi のリニューアルに向けて開発を進めています。

追加する主な機能としては、

1.COMのレベル3、4、5
2.棋譜ツイート機能
3.トライルールの実装
4.千日手への対応

です。

COMのレベル3、4、5については、5ヶ月前に公開した「プチボナ 56shogi」 をJavaScriptに移植したものをつかって、
探索深さやノード数を制限して強さを調節する予定です。

棋譜ツイート機能は、colamoneのアイデアをそのまま56shogiに対応させました。
colamoneを開発したkurehajimeさまには感謝申し上げます。
colamoneもとても素晴らしいボードゲームですので、是非遊んでみてください。

トライルールとは、玉が敵陣の特定のマスまで進むと勝ちになるルールです。
(相手に玉をとられないことが条件ですが)
ごーろく将棋 56shogi は盤面の広さのわりに駒が多いので、
詰むや詰まざるや、トライできるかできないかのような、
複雑な局面になっておもしろいです。

千日手は今まで実装していなかったのが怠慢でした。
これでルール上の不備はなくなったと思います。バグが怖いですが。


JavaScriptに移植する上で工夫した点としては、

1.Cのマクロをつかっている部分をSweet.jsのマクロ機能で代用
2.RequireJSで分割したファイルを管理、統合

ぐらいです。

コンピュータ将棋の技術的な話としては、
飛び利きの算出をrotated bitboardからkindergarten bitboardに変更しました。
こちらのブログを参考にさせていただきました。

Kindergarten Bitboardsの将棋への応用 - コンピュータ将棋開発中


少し前にEmscriptenBonanzaのコードをJavaScriptに変換したembonaというものが公開されましたが、
プチボナのブラウザ版への移植は人力でやりました。

かなり時間がかかりましたが、Bonanzaの指し手生成と探索部分の理解が深まった感じがしているので、まあいいかなと思っています。


とりあえず現在は、移植したプチボナの思考エンジンがブラウザ上で動くようにはなっています。
今のブラウザ版のレベル2との棋力差が大きすぎるので、移植したプチボナをレベル5として、探索深さやノード数を制限して強さを調整したものをレベル3、4とする予定です。

あとはルール説明のページをきちんと用意して、それができれば公開しようかなと思っています。

最後に開発中の画面を貼っておきます。
(トライされてプチボナに負けた局面です。くやしい)

f:id:tetsuzuki1115:20151007205923p:plain


それでは。

プチボナ 56shogi を公開しました

【2015/10/28 追記】
ごーろく将棋 56shogi のページをリニューアル、移転したためリンク先を変更しました


プチボナ 56shogiを公開しました。

プチボナ 56shogi は、Bonanzaをベースにした5×6マス将棋盤で動作する
思考エンジンです。

ミニ将棋GUIプチ将棋」に思考エンジンとして登録することで
対局することができます。
プチ将棋」で対局するときの設定などはこちらをご覧ください。

Bonanzaをベースにしてはいますが、評価関数は簡単なものに変更しています。
(指し手生成、探索、1手詰みルーチンはほぼBonanzaそのまま、5×6マスに対応させました)
そのあたりの詳しいことはこちらをご覧ください。

プチ将棋」の添付エンジンで「ssp」という、
任意の大きさの盤面と開始局面、USIプロトコルに対応している素晴らしい思考エンジンがあります。
プチボナ 56shogi はそのsspに、勝率約95%程度です。

プチボナ 56shogiは評価関数がBonanzaのものではないのと、序盤が粗いので、将棋倶楽部24で上級くらいの棋力の方なら勝てるのではないかと思ってます。

将棋初心者、初級者の方には、以前から公開している
ごーろく将棋 56shogi
がおすすめです。
(こちらはダウンロードしなくてもブラウザで対局できます)

【2015/10/28 追記】
ブラウザ版にプチボナ 56shogi を移植したので、上級者の方でも楽しめると思います。


5×6マスのおすすめの初期配置は、これです。
f:id:tetsuzuki1115:20150430100733p:plain

これまで「ごーろく将棋 56shogi」と(勝手に)呼んでいた初期配置です。
居飛車のような戦いになり、面白いです。

また、プチボナ 56shogi は5×6将棋盤、成れる最大段は「2」という条件で動作します。
初期配置での最大数は、歩は10枚、金銀桂香は4枚ずつ、飛角は2枚ずつです。

なので、桂馬や香車をつかって、
f:id:tetsuzuki1115:20150430101139p:plain
このような初期配置にしても面白いと思います。

わたしが考えた勝手な定義としては、「ごーろく将棋 56shogi」は、
・5×6マス
・成れる最大段は2
(2段目までがお互いの陣地で、移動元か移動先が敵陣の場合、成ることができる)
・トライルール
(先手なら3一、後手なら3六に自玉が移動した時点で、敵駒の利きがそのマスになければトライ勝ち)
・その他のルールは本将棋と同様
(二歩、行きどころのない駒を打つor不成、打ち歩詰め、連続王手の千日手、王手放置は反則)
・初期配置
 1.二段目に一列に歩を並べる
 2.お互いの玉は一段目におく
 3.残りの一段目のマスは、玉と歩以外の任意の駒を並べる

というルールです。

初期配置の3.残りの一段目のマスは、玉と歩以外の任意の駒を並べる
というルールは、先手と後手で非対称な初期配置でも面白いかな、
と思って幅をもたせたものです。
初心者のためのハンデとしても良いかもしれません。


プチボナ 56shogi 、できればたくさんの方に遊んでいただけると嬉しいです。
バグ、不具合のご報告、ご意見ご感想などは、このブログにコメントしていただくか、
以下のメールアドレスまでご連絡ください。
tetsuzuki1115@gmail.com

それでは。