Main Content

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

varindex を使用した問題ベースアプローチでのオプションの設定

問題ベースのアプローチを使用するときに特定のオプションを設定するには、varindex を呼び出して問題変数をインデックスに変換する必要があります。たとえば、ga ソルバーは、2 行の行列である InitialPopulationRange という名前のオプションを受け入れます。最初の行は問題の変数の下限を表し、2 番目の行は上限を表します。行列の列は、問題の変数である集団内の個体を表します。列インデックスを問題の変数に一致させるには、varindex を使用します。

たとえば、目的関数を、この例の最後に示されているヘルパー関数 mrosenbrock に設定します。この目的関数は、すべてのiに対して点xi=yi=1の近くで0に近くなります。3D 問題変数 xy を行形式で作成します。これは、ga が期待する形式です。

x = optimvar("x",1,3);
y = optimvar("y",1,3);

目的関数 mrosenbrock(x,y) を使用して最適化問題を作成します。

prob = optimproblem("Objective",mrosenbrock(x,y));

x 変数の初期範囲を [-1 2] に設定し、 y 変数の初期範囲を [0 3] に設定します。そのためには、変数のインデックスを見つけます。

xidx = varindex(prob,"x")
xidx = 1×3

     1     2     3

yidx = varindex(prob,"y")
yidx = 1×3

     4     5     6

初期範囲を 2 行の行列として設定します。最初の行には下限が含まれ、2 番目の行には上限が含まれます。

poprange = zeros(2,max([xidx,yidx]));
poprange(1,xidx) = -1;
poprange(2,xidx) = 2;
poprange(1,yidx) = 0;
poprange(2,yidx) = 3;
disp(poprange)
    -1    -1    -1     0     0     0
     2     2     2     3     3     3

乱数ジェネレータを設定し、初期範囲行列を使用して問題を解きます。

rng default % For reproducibility
opts = optimoptions("ga","InitialPopulationRange",poprange);
[sol,fval] = solve(prob,"Solver","ga","Options",opts)
Solving problem using ga.
ga stopped because the average change in the fitness value is less than options.FunctionTolerance.
sol = struct with fields:
    x: [1.2583 0.7522 1.2317]
    y: [1.5830 0.5653 1.5167]

fval = 0.1818

返されるソリューションの目的関数値はかなり小さくなります。

補助関数

次のコードは、補助関数 mrosenbrock を作成します。

function F = mrosenbrock(x,y)
F = [10*(y - x.^2),1 - x];
F = sum(F.^2,2);
end

参考

関連するトピック