メインコンテンツ

このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。

適応度関数をベクトル化する

スピードを追求するベクトル化

通常、適応度関数を ベクトル化 すると、遺伝的アルゴリズムの実行速度が速くなります。これは、遺伝的アルゴリズムが適応度関数を1 回だけ呼び出しますが、適応度関数が現在の母集団内のすべての個体の適応度を一度に計算することを期待していることを意味します。適応度関数をベクトル化すると、

  • 母集団内の個体に対応する任意の数の行を持つ行列を受け入れるように関数を計算するファイルを作成します。例えば、関数をベクトル化すると

    f(x1,x2)=x122x1x2+6x1+x226x2

    次のコードを使用してファイルを書き込みます。

    z =x(:,1).^2 - 2*x(:,1).*x(:,2) + 6*x(:,1) + x(:,2).^2 - 6*x(:,2);

    x の最初のエントリのコロンは x のすべての行を示すため、x(:, 1) はベクトルになります。.^ 演算子と .* 演算子は、ベクトルに対して要素ごとの演算を実行します。

  • コマンド ラインで、optimoptions を使用して UseVectorized オプションを true に設定します。

  • 最適化ライブ エディター タスクで、[アルゴリズムの設定] > [ベクトル化された関数の評価] 設定にチェック マークが付いていることを確認します。

    Evaluate functions vectorized shows a check mark

メモ

Vectorize オプションを使用するには、適応度関数および任意の非線形制約関数で任意の数の行を受け入れる必要があります。ga は、ベクトル化された計算中でも 1 行のみを評価することがあります。

コマンドラインで実行される次の比較は、ベクトル化による速度の向上を示しています。関数 fun は Rastrigin 関数のベクトル化されたバージョンです。ラストリギンの機能を最小限に抑える を参照してください。

fun = @(pop)10.0 * size(pop,2) + sum(pop .^2 - 10.0*cos(2*pi.*pop),2);
options = optimoptions('ga','PopulationSize',2000);
tic
ga(fun,20,[],[],[],[],[],[],[],options);
toc
Optimization terminated: maximum number of generations exceeded.
Elapsed time is 2.511456 seconds.
options = optimoptions(options,'UseVectorized',true);
tic;
ga(fun,20,[],[],[],[],[],[],[],options);
toc
Optimization terminated: maximum number of generations exceeded.
Elapsed time is 1.451496 seconds.

ベクトル化された制約

非線形制約がある場合、アルゴリズムがベクトル化された方法で計算できるように、目的関数と非線形制約をすべてベクトル化する必要があります。

目的関数と制約関数をベクトル化する には、ソルバー patternsearch の両方をベクトル化する方法の例が含まれています。ga の構文はほぼ同じです。唯一の違いは、patternsearch のパターンは行ベクトルまたは列ベクトルのいずれかとして表示されることです。ga の対応するベクトルは、常に行である母集団ベクトルです。

参考

トピック