Main Content

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

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

スピードを上げるためにベクトル化

通常、適応度関数を ベクトル化 すると、遺伝的アルゴリズムの実行速度が速くなります。これは、遺伝的アルゴリズムが適応度関数を 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 に設定します。

  • ライブ エディターの最適化 タスクで、Algorithm settings > Evaluate functions vectorized 設定にチェック マークが付いていることを確認します。

    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 の対応するベクトルは、常に行である人口ベクトルです。

関連するトピック