このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
シミュレーテッドアニーリングアルゴリズムを使用した最小化
この例では、 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_objective
function 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: [1x1 struct]
problemtype: 'unconstrained'
temperature: [2x1 double]
totaltime: 1.5887
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_objective
function 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
は、 x
という 1 つの引数だけで目的関数を呼び出しますが、目的関数には x
、a
、b
、c
という 4 つの引数があります。どの変数が引数であるかを示すには、匿名関数を使用して追加の引数 (定数 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] ディクソン、L.C.W.、G.P.Szego(編著)。グローバル最適化に向けて 2.北ホラント州:エルゼビアサイエンス社、アムステルダム、1978年。