将棋プログラム「Sunfish」

将棋プログラム「Sunfish」

主に将棋プログラム「Sunfish」の開発について書いています。

Amebaでブログを始めよう!

Yahoo!ジオシティーズのサービス終了に伴い、大学将棋部のサイト内にあったダウンロードページも参照できなくなりました。

現在はGitHubからダウンロードすることができます。

Sunfishは以下のようなUSI対応の将棋盤アプリと組み合わせて使います。

最後にブログを書いてからちょうど 1 年半ですが、
少しだけ気が向いたので最近何をしているのか書こうと思います。

今年 5 月に行われた世界コンピュータ将棋選手権に
参加するつもりで作っていた Sunfish4 ですが、
結局参加をキャンセルし、まだ過去のどのバージョンよりも弱いままです。


先日 CSA のアンケートでエラそうなことをいろいろと書いてしまったので、
来年はそれなりのものを用意して出場したいです。

しかしそう考えながらも下がる一方のモチベーションの中で手は動かず、
気づいたら事実上何も進んでいないまま数カ月が経ちました。
まだ来年の選手権まではまだ 8 ヶ月近くありますが、
来年のことを考える度に何か他のことをして
気をそらしているような日が続いています。

今まだコンピュータ将棋を続けようと思う理由を
与えてくれる外的要因は Twitter しか無いのですが、
それなりの頻度で流れてくるコンピュータ将棋関連のツイートと
少しずつだけ増えている将棋ファンのフォロワーが
コンピュータ将棋のことを思い出させます。

もうしばらく取り組むくらいの元気は残っているので
また選手権の申し込み受付が近づいた今年の暮れ頃に
来年のことは決めようと思います。
 

3月中

・マシン購入
・エントリー情報入力


4月中

・本番環境確認
・(デスクトップの場合)マシン発送
・置換表のサイズ調整


5/2 (前日)

・PC
・LANケーブル
・電源コード
・(念のため)電源タップ
・最新のソース
・梱包用具
・ねじまわし(故障時用)
・コンパイル(make release-pgo)
・誰かと練習対局


5/3 (当日)

なんとかする。

評価関数(3駒関係)の差分計算を実装しました。

2013年のバージョンでもやっていましたが、
変化しない要素と変化した要素の2重ループになっていて
あまり速くなかったと思います。

Bonanza6.0 にお手本になりそうな実装が入っていますが、
Bonanza は何回見ても読むのが大変です。

ブログだとここらへんでわかりやすい説明があります。
d.hatena.ne.jp/suzume_r/20120307

実際にコードを書く場合は次の3つのケースに分けるのが良さそうです。

1. from=駒台, to=盤
変化前: from+1
変化後: from, to

2. from=盤, to=盤, cap=無
変化前: from
変化後: to


3. from=盤, to=盤, cap=有

変化前: from, cap, hand-1
変化後: to, hand

変化後の局面から全要素を列挙(all)して、
value -= all x 変化前
value += all x 変化後
を計算します。

ただ、これだと 変化前 x 変化前 が残っていたり
余計に足し引きしているところがあるので、
それを最後に調整します。

最終的にこのようになりました。
https://github.com/sunfish-shogi/sunfish3/blob/1f9808c652780b96f52914b4f4913ec386933498/searcher/eval/Evaluator.cpp#L756-L863

ユニットテストは全部通って、対局も問題なさそうなので
多分計算結果は合っていると思います。

ボナンザは時間のあるときにちゃんと読みます。
もっとまともな方法でやっているのかもしれないです。
古い lenovo に Ubuntu 14.10 を入れて
Linux のビルド環境を1つ用意しました。

sunfish の初期バージョンに -lpthread の指定がなく、
リンクが通らなかったのでオプションを追加しました。

あとBonanza 6.0は pthread と math にリンクが通らず、Makefile(L62) を
  $(CC) -o bonanza $(OBJS) $(LDFLAG1) $(LDFLAG2)
に書き換えたらなおりました。
https://forums.ubuntulinux.jp/viewtopic.php?id=13673

前方にオプションを書くとうまく行かないようです。
-lpthread に関しては -pthread なら前方でも大丈夫でした。