このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
シミュレーテッド アニーリング法を用いた最小化
この例では、Global Optimization Toolbox のシミュレーテッド アニーリング法 (simulannealbnd 関数) を使用して目的関数を作成し、最小化する方法を示します。アルゴリズムの詳細については、シミュレーテッド アニーリングの仕組み を参照してください。
単純な目的関数
最小化する目的関数は、次の 2 つの変数の単純な関数です。
min f(x) = (4 - 2.1*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-4 + 4*x2^2)*x2^2;
x
この機能は、L.C.W. DixonとG.P. Szego [1]によって説明されているように、「カム」として知られています。
目的関数の計算を実装するために、MATLAB ® ファイル simple_objective.m には次のコードが含まれています。
type simple_objectivefunction y = simple_objective(x) %SIMPLE_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (4-2.1.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-4+4.*x2.^2).*x2.^2;
すべての Global Optimization Toolbox ソルバーは、目的関数に 1 つの入力 x があり、x には問題内の変数の数と同じ数の要素があると想定します。目的関数は目的関数のスカラー値を計算し、それを単一の出力引数 y で返します。
simulannealbndを使用して最小化
simulannealbnd を使用して目的関数を最小化するには、目的関数への関数ハンドルと、開始点 x0 を 2 番目の引数として渡します。再現性のために乱数ストリームを設定します。
ObjectiveFunction = @simple_objective; x0 = [0.5 0.5]; % Starting point rng default % For reproducibility [x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0)
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
-0.0896 0.7130
fval = -1.0316
exitFlag = 1
output = struct with fields:
iterations: 2948
funccount: 2971
message: 'simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.'
rngstate: [1×1 struct]
problemtype: 'unconstrained'
temperature: [2×1 double]
totaltime: 0.5150
simulannealbnd は 4 つの出力引数を返します。
x— ベストポイントが見つかりましたfval— 最適点における関数値exitFlag— 関数が停止した理由に対応する整数output— 最適化手順に関する情報
境界制約付き最小化
simulannealbnd を使用して、境界制約のある問題を解決できます。下限と上限をベクトルとして渡します。各座標 i に対して、ソルバーは lb(i) <= x(i) <= ub(i) を保証します。境界 –64 <= x(i) <= 64 を課します。
lb = [-64 -64]; ub = [64 64];
下限と上限の引数を指定してソルバーを実行します。
[x,fval,exitFlag,output] = simulannealbnd(ObjectiveFunction,x0,lb,ub);
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
fprintf('The number of iterations was : %d\n', output.iterations);The number of iterations was : 2428
fprintf('The number of function evaluations was : %d\n', output.funccount);The number of function evaluations was : 2447
fprintf('The best function value found was : %g\n', fval);The best function value found was : -1.03163
ソルバーは基本的に以前と同じ解決策を見つけます。
追加引数の使用を最小限に抑える
場合によっては、最適化中に定数として機能する追加の引数によって目的関数をパラメーター化する必要があります。たとえば、前の目的関数では、定数 4、2.1、および 4 を、変更可能なパラメーターに置き換えて、目的関数のファミリーを作成することができます。詳細については、追加パラメーターの受け渡しを参照してください。
新しい最小化問題で 3 つの追加パラメーターを取るように目的関数を書き直します。
min f(x) = (a - b*x1^2 + x1^4/3)*x1^2 + x1*x2 + (-c + c*x2^2)*x2^2;
x
a、b、および c は、最適化中に定数として機能する目的関数のパラメーターです (最小化の一部として変更されることはありません)。目的関数の計算を実装するために、MATLAB ファイル parameterized_objective.m には次のコードが含まれています。
type parameterized_objectivefunction y = parameterized_objective(x,p1,p2,p3) %PARAMETERIZED_OBJECTIVE Objective function for PATTERNSEARCH solver % Copyright 2004 The MathWorks, Inc. x1 = x(1); x2 = x(2); y = (p1-p2.*x1.^2+x1.^4./3).*x1.^2+x1.*x2+(-p3+p3.*x2.^2).*x2.^2;
ここでも、目的関数への関数ハンドルと、2 番目の引数として開始点を渡す必要があります。
simulannealbnd は、1 つの引数 x のみを使用して目的関数を呼び出しますが、目的関数には 4 つの引数 (x、a、b、c) があります。どの変数が引数であるかを示すには、匿名関数を使用して追加の引数 (定数 a、b、および c) の値を取得します。1 つの入力 x を受け取り、x、a、b、および c を使用して parameterized_objective を呼び出す匿名関数への関数ハンドル ObjectiveFunction を作成します。関数ハンドル ObjectiveFunction を作成すると、変数 a、b、および c には匿名関数に格納される値が設定されます。
a = 4; b = 2.1; c = 4; % Define constant values
ObjectiveFunction = @(x) parameterized_objective(x,a,b,c);
x0 = [0.5 0.5];
[x,fval] = simulannealbnd(ObjectiveFunction,x0)simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2
0.0898 -0.7127
fval = -1.0316
ソルバーは基本的に以前と同じ解決策を見つけます。
参考文献
[1] Dixon, L. C. W., and G .P. Szego (eds.).Towards Global Optimisation 2.North-Holland:Elsevier Science Ltd., Amsterdam, 1978.