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

コンピュータ将棋実装の話

「コンピュータ将棋 Advent Calendar 2016」の二番手の熊谷です。よろしくお願いします!
「コンピュータ将棋 Advent Calendar 2016へのリンクはこちら。
http://www.adventar.org/calendars/1457

何を書こうか未だに悩んでいるのですが、昨日カツ丼将棋さんからリクエストされたNoviceが動くまでの話とコンピュータ将棋の実装周りの話を少し書こうかなと思います。


・Noviceが動くまで

僕はコンピュータ将棋のためだけにプログラミングを始めたのですが、それが去年の3月のこと。

最初は1手先だけ読んで動かせるプログラムを作ろうと思ったのですが、それすらもままならず。

ネットで最初に読むべきソースコードはれさぴょんという話を見て、れさぴょんを読もうとするも全く理解できずに挫折。

まあ今考えればプログラミングを始めたばかりの素人がれさぴょんのソースコードを読めるはずもないわけですがw

結局、全て我流で2ヶ月作ったらなんとか動くものが出来ました。

このときの実装は本当にひどいもので、当時の僕は関数の再帰呼び出しができることを知らず読む深さ分だけ関数を増やすという実装でしたw

まあでも、初めて動いたときの喜びは未だに忘れられないものになっています。

この喜びがNoviceを作り続けることへのきっかけになったと思います。

・コンピュータ将棋実装周りの話

コンピュータ将棋の実装って大変じゃないかと色んなひとに聞かれるのですが、

動かすまでならそんなに難しくないというのが僕の考えです。

段階を踏んで少しずつ実装を行っていけばいいんじゃないかなと思います。

ここでは、その段階の話を書きます。

STEP1 将棋盤で初期局面を表示する
 
 ボードゲームは配列を使って表現するのに非常に分かりやすいものです。

 例えば将棋なら9✕9の計81マスの盤を Board[9][9] などで表現すればいいわけです。

 マスにある駒の表現は数字を使います。

 空きマスなら0、先手の歩なら1、後手の歩なら16みたいなかんじです。

 初期局面を表示するならBoard[0][0] = 17(後手の香) みたいに一つずつ配列に入れていき、

 for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("[%d]",Board[i][j]);
}
printf("\n");
}

 のように表示すれば良いわけです。

 ただし、このままだと数字でしか表示されないです。

 これを文字で表示するところは考えてみてください。

STEP2 手の入力を可能にする。
 
 STEP1のままだと、初期局面を表示するだけになってしまいます。
 
 これを、駒をうごかせる将棋盤にしてみます。

 実装は簡単で、scanfでfromの段、筋、toの段、筋を入力してもらい

Board[to段][to筋] = Board[from段][from筋];
Board[from段][from筋] = 0;

として、局面を再度表示すれば将棋盤が出来ます。

 ただし、これだけでは成りの処理などが出来ないので別途その処理も追加する必要があります。

 ここではヒントだけ示しておきます。

 先手の歩の番号は1、先手のとの番号は9であることを考えてみてください。

STEP3 内部の思考エンジンをつくる

 いよいよ思考エンジンを作る所ですが、ここについての記事を以前書いたのでそれを共有し説明とさせて頂きます(ごめんなさい)

 novice.hatenadiary.jp


STEP4 様々なサイトを参考に作りこんでいく

 いくつかお世話になったサイトを紹介させて頂きます。

 うさぴょん作者の池さんのサイトです。
  非常にシンプルな実装になっている解説です。(一番のおすすめです)
  将棋プログラムの作り方

  れさぴょんの解説が載っています。
  コンピュータ将棋のアルゴリズム

 YSSの山下さんのサイトです。
  YSS 7.0‚Ì‹Zp‰ðà

 クマ将棋さんのサイトです。主にソースコードが参考になります。
  http://suzumer.web.fc2.com/simk.htm


STEP5 大会に出る

 世界コンピュータ将棋選手権
 コンピュータ将棋協会

 電王トーナメント
 denou.jp

 以前、強くならないと大会に出ても.....みたいなお話をされている方にお会いしましたが、

 コンピュータ将棋界にはネタ勢という概念があります。弱いからこそ面白い将棋を指すソフトたちです。

 実は現在最強の呼び声高いPonanzaも元々はBonanzaを文字ったネタ勢だったのです。

 なので、ソフトが少しでも動くなら積極的に大会に出るといいと思います。

 コンピュータ将棋界の人たちは非常に良い人、面白い人が多いです。絶対、良い経験になると思います。

STEP6 時には休む

 休憩しましょう。

いかがだったでしょうか?
この記事がコンピュータ将棋を始められる方々のきっかけになれば幸いです。
では、wcsc27でお会いいたしましょう。

第4回電王トーナメント ソフト紹介

第4回電王トーナメントの開催まで1ヶ月切りましたね......
denou.jp

今回もNoviceは参加します。(全然強くなってないですが....)

きふわらべさんがトーナメントの順位予想していたので僕もやってみます。

ついでに各ソフトに一言ずつ書こうかなと思います。
順位予想は A B1 B2 C1 C2 に分けつついきますね。

電王
・Ponanza
対プロ棋士戦無敗の電王のタイトルを持つプログラム
今年も優勝をするのだろうか。
開発者は山本一成さんと下山晃さん。
※既婚者・彼女持ちを「山本組」と呼ぶ。
A級
・技巧
第26回世界コンピュータ将棋選手権(以下Wcsc26)では唯一Ponanzaに黒星を付けたプログラム。
ソースコードバイナリも公開されている。
開発者の出村洋介さんは法律関係の仕事が忙しいようで参加が危ぶまれていたが、
参加のようでお会いできることをとても楽しみにしている。
・浮かむ瀬(Apery)
Wcsc24で優勝経験ありで、Wcscや電王トーナメントでも何度も入賞しているプログラム。
電王戦FINAL後、ソースコードを公開。ライブラリとしても使用可能で、多くの強豪ソフトのベースとされている。
開発者は平岡拓也さんと大阪市立大学の杉田歩先生、白岩大地さん、加藤 秀介さん。
平岡さんの顔文字は(´・_・`)で有名(?)
※Aperyをベースとした派生ソフトを「Aperyチルドレン」と呼ぶ。
※未婚者・彼女無しの人を「山本組」に対し「平岡組」と呼ぶ。
・真やねうら王
「伝説のプログラマー」の名を持つ「天才」磯崎元洋さん(通称やねさん)が開発したプログラム。
「1年に2週間しかやる気が出ない」状態で過去の電王トーナメントでは複数回入賞し、プロ棋士を撃破している。
今年はオープンソースプロジェクトとして数カ月開発を行っていたので大きく期待できるだろう。
「やねさんならやってくれるやろ」という期待の持ち方が主流(?)
評価関数からソースコードまで余すところなくライブラリとして公開されているので、やねうらおうをベースとする強豪ソフトも多い。
やねうらおうをベースとした派生ソフトを「やねうらおうチルドレン」と呼ぶ。
・大将軍
KPPPの四駒関係を使用していたことで有名な強豪プログラム。
電王トーナメントではメモリの上限により四駒関係は使われていない(はず)
今回は、プログラムのベースに「やねうらおう」を用いるとのこと。
開発者は横内健一さん。会場では横内さんのお父上もよくお見かけします。
・読み太
Wcsc26でノートパソコン1台で決勝リーグへ進出した強豪プログラム。
Wcsc26ではやねうらおうの評価関数を使用していたが、今回からは自力で学習から行っている。
Wcsc26ではハードウェアの差がやはり大きな差へと繋がっていたことは間違いないだろうから、今回ハード統一状態でどこまで上に行けるか注目されているプログラム。
開発者の塚本隆三さんは元奨励会員で定跡などは一部を自身で確認して取捨している模様。
※読み太の定跡戦略を「読み太沼」と呼ぶ。
B1
・うさぴょん2
”れさぴょん””コンピュータ将棋の作り方”などでコンピュータ将棋の新規参入への手助けを長年されてきた池泰弘さんが開発したオープンソースのプログラム。
うさぴょん2からはnanoha miniをベースにStockFish7やAperyの技術を取り入れ開発が行われている。
Wcsc26では決勝リーグに進出。
れさぴょんを使って開発、大会参加を行っていた経歴のある人々を「うさぴょん一門」と呼ぶとか呼ばないとか。
・†白美神†(tanuki-)
第三回電王トーナメントで初参加にも関わらず決勝進出を果たしたプログラム。
開発者は野田久順さん、岡部淳さん、鈴木崇啓さん、日高雅俊さん。開発者代表の野田さんは競技プログラム出身の方で、第三回電王トーナメントではベースとしたAperyを高速化し元の1.5倍もの探索速度に仕上げた。
今回の大会ではベースをやねうらおうにしたようなのでどのように仕上がっているのか楽しみである。
・nozomi
第三回電王トーナメントで決勝まで進みPonanzaと熱戦を繰り広げたプログラム。
Wcscではソルコフに泣かされる結果になってしまったが、今回のトーナメントでは上位に入るだろうと予想される。
去年の電王トーナメントで開発者の大森悠平さんには技術等色々教えて頂きました。
・Qhapaq
Wcsc26で初参加にして二次予選に進出したプログラム。
Aperyをベースに評価関数の学習法に物理学を取り入れ棋力向上を図っている。
Wcsc26では256手ちょうどで詰まされるという劇的な対局を披露した。
今回は、やねさんからPCを購入し調整を行っている模様。
開発者はSawada Ryotoさん。和服が印象的で陽気な方です。

//書き疲れたのでとりあえずここまで

第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時過ぎていたので、焦りましたよね笑

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