読者です 読者をやめる 読者になる 読者になる

第26回 世界コンピュータ将棋選手権 参戦記 ~大会前日~

遅くなりましたが、第26回世界コンピュータ将棋選手権に出場してきたときの話などを…

大会前日は、大学の授業を2限まで受けた後に自宅で少し開発をしてから会場へ移動。

当初の予定ではデスクトップのPC(i7 4790K 8GB)を持って行くつもりだったのですが、まさかのスーツケースに入らない問題が浮上。
諦めてi5 1.3GHzのMac book airで参戦することに。

電車で移動し会場に到着。

指定場所は読み太さんの前でClaireさんの隣でした。

当日は読み太さんがいらっしゃっており色々と技術的なお話を聞かせて頂きました。

その後、とりあえずlanの設定を行い、lib将棋さんとテスト対局。上手い指し回しで勝ち。
千田先生もいらっしゃっており「この手順も正解なんですかね」とのお言葉を頂きました(褒められているわけではない)

テスト対局を終えた後は電王トーナメントの時にお世話になった方に挨拶をしてまわり会場を後にしました。

このときは、最後まで動いて3回くらい勝ちたいなぁと思っていました。

電王トーナメントver.のRは1300程度で、今回のver.のRは直前に放流していたRで2000程度。電王トーナメント直後にはR1000伸ばすことを目標にしていたので目標には届かない状況での参戦でした。

個人的には評価関数をBonanzaのものにすればR2000くらいになるものだと思っていたのですが単純に入れ替えたver.のRは1500程度で大して変化なし。色々と探索部を弄ることでなんとかR2000にしたというかんじです。
(選手権の時に頂いたアドバイスをもとに修正  したver.で一時的にR2400を達成しました。)

そんなこんなで、大会当日を迎えることになりました。

f:id:novice_kuma:20160514143053j:image

第26回 世界コンピュータ選手権大会 バイナリ公開

Wcsc26参加してきました!

結果は......

13位/36チーム!!!!

ということで、少し弱めにしたりminGWの都合で制限がついたりしているWindows用のバイナリ公開します。

www.dropbox.com

Bonanza6.0のfv.binを同フォルダに放り込んでください。

例によってreadme.txtを読んでください。

動作未確認なので挙動がおかしかったりしたらTwitter @naonza0 までおねがいします。

CODE VS 5.0 Ubuntuで参加

いろいろ見ていたらCODE VS 5.0 が面白そうだと思い、

エンジョイ勢で参加しようと思い立ってからの環境つくりのメモ。

参加するのに必要なのはコンパイラ環境と.jnlpが動かせる環境。

Ubuntu(14.04LTS)で動くかなーと思い色々調べていると、なんとなく動くっぽい。

とりあえずJava7突っ込んで起動.....と思ったら、起動しないorz

どうやらJava8が必要らしい....


UbuntuにJava8環境構築 - Qiita

こちらのサイトを参考にJava8を入れる。

そんで、codevs5.jnlpが有るフォルダで

javaws codevs5.jnlp

f:id:novice_kuma:20160305174533p:plain

と打ち込むと起動するはず.....

この画面が表示されれば起動成功です。

f:id:novice_kuma:20160305174655p:plain

とりあえずサンプルコードを動かしてみたい場合は、
サンプルコードをコンパイルgccだと通りません g++だと通ります)して、コマンドの所に起動用のコマンドを書いておけば実行出来ます。

f:id:novice_kuma:20160305175318p:plain

動いてますね......(Core2Duo 2.8GHz)だともっさりしてますけど...汗

Novice_mini_ver.2.0 用指し手生成部分公開

おそらくあまり需要などは無いとは思いますが、指し手生成部が出来たので公開します。

局面は配列で持っており、指し手などをbitで実装してみました。

指し手生成部のみなのでver.は1.2としてあります。

DL>>
www.dropbox.com

例によってreadme.txtはしっかり読んで下さい。
開発にあたり、simk、YSS7.0、れさぴょん、なのはmini 等を参考にしています。

バグ等多々有るかと思いますが、その場合はTwitter @naonza0 等に連絡頂ければ幸いです。


<注意>

このソフトウェアを使用したことによって生じたすべての損害・
不具合等に関しては、私および私の所属するいかなる団体・組織とも、一切の責任を負いません。
このソースコードを改良して世界コンピュータ将棋選手権大会、電王トーナメント、
その他の大会に出場することは構いませんが、その際には上記連絡先にご一報下さい。

第三回電王トーナメント 振り返り 〜大会前日〜

今更ですが、第三回電王トーナメントの振り返りを行っていきます。
(主に自戦記)

〜前日〜
僕が会場に到着したのは夕方4時頃。

お隣さんはカツ丼将棋とPonanza。Ponanzaチームは前日は来ていなかった模様でした。

到着した時は隣でカツ丼さんが缶コーヒー飲みながら恐ろしい数のファイルを展開してました。
(当日の高スペックマシンでも所要時間6時間とか表示されていた......)

で、Noviceのセットアップのためにboot用のUSBを挿すも、エラーメッセージが出て起動しない.......

絶望に浸っていたら、ちょうど後ろの席のD将棋さんが、Ubuntu15.10じゃないと起動しませんよ!と教えて下さり、

tanuki-さんがUbuntu15.10を貸して下さいました。
(本当にありがとうございました。来年からは複数のver持っていきます。)

15.10はすんなりインストールでき、Noviceのコンパイルも通り起動しました。
(make cleanをずっとmakeのみで叩いていて少し手間取ったくらい←)

あとは適当にK-shogiの初級と対局させつつ、他の開発者の方に挨拶を.....

前日に居たのは大樹の平岡さんや、tanuki-さん、D将棋さん、カツ丼さん、銀弾さん、メカ女のきむりんさん、きふわらべさん、きのあ将棋さん、技巧さん、おからさん etc.....

何人か帰られたあとに、お土産を持ってきていたことを思い出し、まだ残っていた方や、その後いらっしゃった方(大樹チームの方など)に配り、色々とお話を聞かせて頂きました。
(自虐系やもじり系の名前は強くなるのではないか?や、きのあさんのAIコーディネーターの話など)

その後、きふわらべさんとテスト対局をしてとりあえず勝ちまして、
最後にK-shogiにボコられながらも投了まで指せていることを確認して、会場を後にしました。

気付いたら20時過ぎていたので、焦りましたよね笑

前日は前日で大会当日とは違った雰囲気が味わえるので来年以降も電王トーナメントが開催されるなら、前日から会場入りしようと思います。(もっと早い時間からいたほうが良さそう)

コンピュータ将棋の内部解説 指し手生成部

コンピュータ将棋

Novice_miniの指し手生成部を解説する。

 

Novice_miniはこちらからDLして参考にして頂きたい。

コンピュータ将棋プログラム「Novice」開発室 プログラミング初心者用の将棋ソフトソース公開

 

指し手生成部はsearch.hにある。

 

gen_move() が盤上の駒を動かす手、gen_utu() が持ち駒を打つ手の生成部である。

 

Novice_miniは盤面情報を一次元配列で持っており、持ち駒には二次元配列を使っている。

 

ではソースコードの解説をしていく。

 if(turn==0){
        for(a=0;a<111;a++){
                 if(board[a]>0 && board[a]<16){

        if(board[a]==SHI || board[a]==SRY){

        ・

        ・

        ・

まずここであるが、

turn は、今から指し手を生成する側(先手 or 後手)。

for(a=0;a<111;a++){

は、盤上の状況を一つずつ調べていくためのループである。

if(board[a]>0 && board[a]<16){

は、board[a]にある駒(または空白)が自分のものであるかの確認。

あとはboard[a]の駒に応じて指し手を生成していく。

 

for(b=0;b<12;b++){
          if(CanGo[b][board[a]]==1){

                      int To=a+Direct[b];

                      if(board[To]==WAL || (board[To]>0 && board[To]<16))continue; 

                      if(board[a]==SFU || board[a]==SKY){

        ・

        ・

        ・

飛び駒(香・角・飛・馬・龍)に関しては個々に生成したが、それ以外は一般化することが出来る。

その部分が上のソースである。

これは事前にCanGoに12方向(通常8方向+先手桂馬2方向+後手桂馬2方向)を登録しておき、元の位置からその方向に動けるかを12方向について調べるものである。

 

CanGoはKomaMove.hにて定義してある。

int CanGo[12][31]={//その方向に進めるか否か(進めるなら1、進めないなら0を返す)
// 11
{
0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,
0,0,0,1,1,0,0,1,1,1,1,1,0,0,1
},

        ・

        ・

        ・

たとえば、これは元の位置から11の方向、つまり右斜め下に動けるかについての情報を入れた配列である。

Novice_miniでは

先手の駒はSFU=1、SKY=2、SKE=3・・・SUM=14、SRY=15

後手の駒はEFU=16、EKY=17、・・・・・・・・・・・・・・・ERY=30 と定義されている。

なので、この場合CanGo[0][1]は先手の歩が右斜め下のマスに動けるかを示している。

故にCanGo[0][1]は0を返し(先手歩は右斜め下には動けない)、CanGo[0][4]は1を返す(先手銀は右斜め下に動ける)のである。

 

そして、CanGoを参照した際に、1が返ってきたら(その方向に動けたら)

元の位置座標にDirect[](移動量)を足して動ける可能性のある先の座標をToに保存する。

これが

          if(CanGo[b][board[a]]==1){

                      int To=a+Direct[b];

の部分。

しかし、もしboard[To](移動先)が自分の駒だったり、壁(盤外)ならば進めないので、そこで次の移動先を検討する。

これが

if(board[To]==WAL || (board[To]>0 && board[To]<16)) continue; 

の部分。

移動できるのが分かったら、

構造体に指し手の情報を保持して次の指し手を探す。

teBuf[teNum].From=a; (移動元)
teBuf[teNum].To=To; (移動先)
teBuf[teNum].Koma=board[a]; (移動する駒)
teBuf[teNum].Cap=board[To]; (その移動で取る相手の駒種(取らないなら0))
teBuf[teNum].Utu=0; (その手が駒を打つ手か否か。)
teBuf[teNum].Pro=0;  (成るか否か)
teNum++;

基本的には、これがNovice_miniの指し手生成の大枠である。

あとはこれに成らなければならない場所(例えば先手歩なら1筋など)では成る手のみを生成したりする条件を足したものなどの部分である。

 

ここで示したのは、盤面を配列で管理した場合の一例のものである。そして、その中でも遅いものであると言える。そのため改善点が多く有るため、この記事を読んでいる方には色々と改良して高速化できることを是非体験してもらいたい。

 

※現状のNoviceでは速度向上のために、構造体の数を減らす、最低限のループにする、など

 複数の改良を施している。(初期局面で 約30万/sec→約120万/sec まで向上。)