HoneyWaffle アピール文書 2016/3/27 開発者 渡辺 光彦 2016/5/7追記(☆部分参照) ■コンセプト  貧弱なH/Wでも、必ずしも最善手を目指さない等の割り切りでまあまあ強くできないか? (目指すは純粋な最高棋力ではなく、ワットあたりの最高棋力)  低コスト・低消費電力なデバイスで動かす、AIに満たない思考ルーチンのモデル ☆コンピュータ将棋を人工知能と拡大解釈した時に、 強豪チームが採用するクラスタを、近未来SFのマザーコンピュータ的な存在として捉えました。 世の中をITで良くしていくには、そういう方向だけではなく、小さなロボット側の進歩も不可欠だと思います。 そのため、Atom(1.33GHz,4コア)、メモリ1GBという比較的非力なタブレットで参戦しました。 ※強豪ソフトをタブレット向けにデチューンしたものより強くするのが目標でしたが、 そんなレベルには全然達していません。 個人的にはワイヤレス(充電なし、無線LANを使用)で全対局を戦えた点はよしとしています。 ■技術的な特徴  主流のC++ではなくGoで新規に開発したオリジナル  CPUアーキテクチャに依存した実装は無し(☆Goでビルドできる環境ならどこでも動かせるようにしたいので)  駒の位置(7六等)を、複素数型変数で管理しており、将棋盤が複素数平面上にあることに ☆Goを新しく覚えるために何か趣味プログラミングしたいという想いと、 電王トーナメント楽しそうだなあという想いが合わさった結果、参加に至りました。 2015年末から着手して、2016年の電王トーナメントでデビューのつもりでしたが、 こちらの選手権をスルーしたら、永久にデビューを先送りし続けるだろうなと思い、 全然形になってない段階でエントリーしました。 ☆複素数平面 サンプルコード kaku.position = complex(7, 7) // 7+7i角 gyoku.position = complex(2, 2) // 2+2i玉 // 相手玉が角のラインに入っていることは確認した前提 move := complex(-1, -1) // -1-i for i := kaku.position; i != gyoku.position; i+= move { // 角と相手玉の間に別の駒があるか探す、合い駒するマスを選ぶ とか } 駒の移動や位置関係を複素数の足し算で表せて、ソースが読み書きしやすかったです(個人の感想です)。 パフォーマンス的に他の方法と比較してはいません。 ☆評価関数については、駒の価値の合計や利きの数等に、 手動で設定した係数をそれぞれ乗算し、合計したものを使いました。 1手動かすごとに駒の利きやその駒の合法手を生成するのでとても重いです。 ただしそれにより、1手詰めはしっかりできているはずです。 (1手進めてみて、相手玉の手が生成されない=詰み) 今後はここを整理します。 ☆NPSはざっくり見積もって本番タブレットで1万行ったらいい方です。 そのため、持ち時間が多くある時でも3手先までしか読めません。 なんでもない手で3分の長考とかもザラでした。 ☆GoのGoRoutineと呼ばれる仕組みにより、並列での局面評価も導入しています。 上述のとおり、評価1回の速度が遅いために、とても並列でやっているようには見えません。 Goの言語としてのポテンシャルはとても高いと思います。生かしきれなかったのが残念です。 ■HoneyWaffle 名前の由来  ワッフルが将棋盤に似ている  ゆるふわスイーツ的なスナック感覚の軽さを表現 ☆命名してから選手権後まで、ワッフル食べてません。また、無駄な処理が多すぎてタブレットでは重すぎました。 ■開発者について  プログラマー、勤務先にてMDM(モバイルデバイス管理…タブレットにアプリを配信する等)のサーバ開発全般を担当  棋力:将棋ウォーズ3級の振り飛車党