続・三駒関係可視化

bonanza6.0が有利/不利とする3駒関係トップ150が出力できるようにしました(9九玉固定)
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/p150/
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/n150/

大駒の利きを止めるケースが点数が高いのだろうか。

現局面にこれらのパターンがあると点数が高いわけではなく、
そこから探索を進めた末端局面でこのこれらのパターンがあると
点数が高くなります。
点数が高いパターンはプロの手をルートに探索を進めていくと
これらのパターンが多く残っていたということなんでしょう。

あと、いくつかバグを修正しました。コードと実行ファイルです。
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/fva0.1.zip

主成分分析

先手の得点に寄与する駒で主成分分析をかけました。

http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/pca/report.html

これも僕の棋力では理解不能です。
数値から分かるのは、
上位30個のパターン程度で累積寄与率90%が得られて、
第一主成分が11%と突出していることです。

追記

バグがあったので修正版とコードも上記リンクにあります。
将棋所の局面コピーでtest.csaに張り付けると便利だと思います。

解析例

上のreportは
先手:クマ、後手:sakurapyon (bona6.0の評価関数)の30手目の解析結果です。
http://wdoor.c.u-tokyo.ac.jp/shogi/view/index.cgi?csa=http%3A%2F%2Fwdoor.c.u-tokyo.ac.jp%2Fshogi%2FLATEST%2F2013%2F09%2F04%2Fwdoor%2Bfloodgate-900-0%2Bkuma_trial%2Bsakurapyon_dti%2B20130904153004.csa&go_last=on&move_to=30

互いに自分が有利と評価をしているので解析したところ、確かにbona6.0だと
後手の評価値が高い組み合わせが多いようでした。


一例。これはいかにも角がつまって先手が悪そう。
まだ、クマ将棋(KPしか使っていない)では
正しく評価できていない模様。

bona6.0の3駒評価の可視化

入力した局面をbona6.0で探索して、求まった末端局面で
どのような評価値が利いているかを解析するツールを作りました。
例)
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/report.html


実行ファイル)
http://navi.cs.kumamoto-u.ac.jp/~koutaki/shogi/fva.zip

fv.binは各自で用意してください。

iPadでopencv

iPad上で動画をキャプチャしてOpenCVの処理をかけるさいのメモです。
OpenCVの動画キャプチャ関数がそのまま使えないので注意が必要です。
iOS開発やxcodeがよく分かっていないので苦労しました。

コード1式(xcode用): http://navi.cs.kumamoto-u.ac.jp/~koutaki/VideoCamera-opencv.zip


以下を参考(というかほとんど同じ)にしています:
実践! iPhoneアプリ開発 http://news.mynavi.jp/column/iphone/041/index.html


上記と差分・注意点です。

  • 公式ページよりiOS用のopencv2.frameworkをDL
  • Build phaseのLink Binary Librariesに追加
  • Build settingsでCompiler for C/C++Apple LLVM compiler 4.2
  • Apple LLVM compiler 4.2-Language
    • GNU++11 [-std=gnu++11]
    • C++ Standard Library libc++(LLVM C++ standard library with C++11 support)
  • VideoCameraViewController.mをVideoCameraViewController.mmにする(C++対応にする)


opencvのヘッダはVideoCameraPrefix.pchファイルに以下を追加します。

#ifdef __cplusplus
#import <opencv2/opencv.hpp>        // opencv
#import <Accelerate/Accelerate.h>   // lapackを使うなら
#endif

captureOutputに以下のようにopencv関数を使っています。

    //*******************************************************************
    //  OpenCV画像処理ルーチン
    
    // キャプチャ画像から画像バッファを取得
    unsigned char* img = (unsigned char*)CVPixelBufferGetBaseAddress(buffer);
    // OpenCV形式の画像に変換
    cv::Mat *cimg      = cvMatFrombufGray(img,width,height);
    //--------------------------
    // ここに画像処理部分を書く
    cv::Canny(*cimg, *cimg, 20, 20);
    //--------------------------
    //  結果出力:imgを書き換える
    for(int ptr = 0;ptr < width * height;ptr++){
        img[ptr*4]=img[ptr*4+1]=img[ptr*4+2] = cimg->data[ptr];
    }
    //*******************************************************************

クマ将棋の学習結果

クマ将棋の学習結果と比べていると上記のようにはならず、
自玉周りの▲金はよく評価するが、△金の評価値が低かった。
終盤弱いのはこのためだと思う。
原因を調べているけど、オンライン化もあるけど、
やはりバグがあったり、静止探索をstockfish流(成+玉移動)に
しているので多少結果が異なるようだった。
損失関数をL2ノルムにするかL1ノルムにするのは、
大まかな傾向でそれほど差がでるとは思えない。

考察:どうすると上記のようになるのか

(A)の場合の▲金の価値

最善手を進めると玉の周りに▲金がいることが多く、
それ以外を指すと▲金と玉が離れているとこうなる。
でも大体、序盤中盤の駒組の段階で玉の周りに金が
いることが多いので、そこまで差がつかない。

(A)の場合の△金の価値

最善手を進めると玉の周りに△金がいない(侵入を阻止)
それ以外を指すと△金に侵入されるとこのようになる。
△金が来るのは終盤から。
終盤ではちょっとした一手でこのような事態が生じることが多いため
これだけ評価値に差をつけないと、侵入を許してしまう。