Eigenを使って実数型遺伝的アルゴリズムのBLX_αを実装する

 

六花です。

遺伝的アルゴリズムにおいて、遺伝子型として一般的なバイナリ型のほかに、実数の配列型のものが存在します。

当然交叉の方法もバイナリ型とは異なっていて、BLX_αのほかにもシンプレックス法などがあるようです。
今回は、BLX_αをEigenで実装してみることにしました。

 

■BLX_αについて

詳しい説明はこちら→(http://www.sist.ac.jp/~kanakubo/research/evolutionary_computing/lbx_spx.html)

要するに親の二点に近い空間から新しい点を選びます。

 

■実装

元々そこまで実装が難しいものではありませんが、Eigenを使うとfor文でたくさん回す部分がすっきりするので
今回紹介しようと思いました。



#include <random>
#include "Eigen/Core"

const float alpha = 0.3f; // 子の値域の拡張率を定義する

// 二つの遺伝子
Eigen::VectorXf g0 = Eigen::VectorXf::Random(10);
Eigen::VectorXf g1 = Eigen::VectorXf::Random(10);

auto d = (g0 - g1).cwiseAbs(); // 2ベクトルの間の空間を子の発生範囲とする
auto new_min = g0.cwiseMin(g1) - alpha * d; // a_d をac_αによって拡張した空間の小さい方の座標
auto new_max = g0.cwiseMax(g1) + alpha * d; // a_d をac_αによって拡張した空間の大きい方の座標

// 子の遺伝子の作成
for(int i = 0; i < 10; ++i)
{
    auto dist = uniform_real_distribution<float>(new_min.coeff(i), new_max.coeff(i));
}

Eigenにおいて、ベクトルは行列の特殊な状態として定義されています。
そのため、行列用の関数も使えます。

A.cwiseAbs() : Aの各要素を絶対値にした行列を戻します。
A.cwizeMin(B) : AとBの各要素の小さい方を集めた行列を戻します。
A.cwizeMax(B) : AとBの各要素の大きい方を集めた行列を戻します。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です