将棋ソフト開発
Apreyのソースコードを読み始めた。さっそくcommon.hppの120行目あたりの意味が分からない。
// Binary表記 // Binary<11110>::value とすれば、30 となる。 // 符号なし64bitなので19桁まで表記可能。 template <u64 n> struct Binary { static const u64 value = n % 10 + (Binary<n / 10>::value << 1); }; // template 特殊化 template <> struct Binary<0> { static const u64 value = 0; };
なんでstructで再帰みたいなことができているのか? いやできるものなのか……。というかこれって普通に書けないのかな? わからない。Unrollerも同様。
// N 回ループを展開させる。t は lambda で書くと良い。 // こんな感じ書くと、lambda がテンプレート引数の数値の分だけ繰り返し生成される。 // Unroller<5>()([&](const int i){std::cout << i << std::endl;}); template <int N> struct Unroller { template <typename T> FORCE_INLINE void operator() (T t) { Unroller<N - 1>()(t); t(N - 1); } };
ねね将棋も公開されていた。どう読んでいくのがいいものか。
あとは手番を評価関数に導入することについて考えていた。つまりKPPTとかのこと。なんとなくわかる気はするんだけど、具体的に学習をどうやればいいのか、どんな情報を持てばうまく勾配が求まるかということがわかってこない。じっと心を落ち着けて手計算で微分してみるのが一番速い気がする。こういう時に頭の悪さを強く感じる。
ちゃんといろんなタイプの評価関数を比較してみたい気もするが、そういうのは計算資源富豪に任せたほうが良いのかな。デスクトップ1台しかないし、KPPTとかちゃんと学習させられる気がしないんだけど、どうしましょう。
つらいことは多い。なんとかやっていかなければ。
その他
無を感じた。
無限の時間が欲しい。
カープは負けました。