C++ Package for Elastic Arm Algorithm & Quasi-Newton Method.
Elastic Arm Algorithm 及び Quasi-Newton Method の C++ 用ライブラリ。 Elastic Arm Algorithm は Ref[1,2] を参考に実装した。 Quasi-Newton の方では、 ヘッセ行列の逆行列の update 手法として BFGS 法を使っている。
最小二乗法や
ここで、
ここで、
従って、ヘルムホルツの自由エネルギー
となる。一般的に温度が小さい時の平衡状態
一例として、Himmelblau's function rse::QuasiNewtonBase<nPar> (nPar はパラメータの数。今の場合、x, y の 2 つ) を継承し、double Func(const Eigen::Vector<double, nPar>&) を override する。
#include "QuasiNewton.hh"
class MyFunc : public rse::QuasiNewtonBase<2> {
public:
MyFunc() {};
~MyFunc(){};
// Himmelblau's function
// f(x, y) = (x^2 + y - 11)^2 + (x + y^2 - 11)^2
double Func(const Eigen::Vector<double, 2> &x) override {
auto temp1 = x[0] * x[0] + x[1] - 11;
auto temp2 = x[0] + x[1] * x[1] - 7;
return temp1 * temp1 + temp2 * temp2;
}
};あとは 初期値や直線探索のパラメータを調整してProcMinimization(int nMaxLoop, double epsilon) で走らせる。
直線探索のパラメータは、
に対応し、1回のイタレーションで、
MyFunc *minimizer = new MyFunc(); // 宣言
std::vector<double> init_param = {0, 0}; // 初期値 (x,y)=(0,0)
minimizer->SetInitalVal(init_param);
minimizer->SetLinearSearchParameter(2.0, 0.9, 0.1, 100); // 直線探索のパラメータ
bool is_converged = minimizer->ProcMinimization(100, 1e-4); // ループの上限とfの勾配のスレショールド。[1] R. Frtihwirth, A. Strandlie, Computer Physics Communications 120 (1999) 197-214, https://www.sciencedirect.com/science/article/pii/S0010465599002313
[2] N. Ueda, R. Nakano, “Deterministic Annealing -Another Type of Annealing-”, (7/7/1997), https://www.jstage.jst.go.jp/article/jjsai/12/5/12_689/_pdf