このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
確率的目的関数の最適化
この例では、patternsearch
を使用して確率的目的関数の最小値を見つける方法を示します。また、Optimization Toolbox™ ソルバーがこのタイプの問題に適していないことも示しています。この例では、ノイズによって乱される単純な 2 次元の目的関数を使用します。
初期化
X0 = [2.5 -2.5]; % Starting point. LB = [-5 -5]; % Lower bound UB = [5 5]; % Upper bound range = [LB(1) UB(1); LB(2) UB(2)]; Objfcn = @smoothFcn; % Handle to the objective function. % Plot the smooth objective function fig = figure('Color','w'); showSmoothFcn(Objfcn,range); hold on; title('Smooth objective function'); ph = []; ph(1) = plot3(X0(1),X0(2),Objfcn(X0)+30,'or','MarkerSize',10,'MarkerFaceColor','r'); hold off; ax = gca; ax.CameraPosition = [-31.0391 -85.2792 -281.4265]; ax.CameraTarget = [0 0 -50]; ax.CameraViewAngle = 6.7937; % Add legend information legendLabels = {'Start point'}; lh = legend(ph,legendLabels,'Location','SouthEast'); lp = lh.Position; lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)];
滑らかな目的関数でfmincon
を実行する
目的関数は滑らかです(2 回連続微分可能)。Optimization Toolbox fmincon
ソルバーを使用して最適化問題を解きます。fmincon
は、複数の変数の関数の制約付き最小値を見つけます。この関数は、点 x* = [-5,-5]
で一意の最小値を持ち、その値は f(x*) = -250
になります。
反復表示を返すようにオプションを設定します。
options = optimoptions(@fmincon,'Algorithm','interior-point','Display','iter'); [Xop,Fop] = fmincon(Objfcn,X0,[],[],[],[],LB,UB,[],options) figure(fig); hold on;
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 3 -1.062500e+01 0.000e+00 2.004e+01 1 6 -1.578420e+02 0.000e+00 5.478e+01 6.734e+00 2 9 -2.491310e+02 0.000e+00 6.672e+01 1.236e+00 3 12 -2.497554e+02 0.000e+00 2.397e-01 6.310e-03 4 15 -2.499986e+02 0.000e+00 5.065e-02 8.016e-03 5 18 -2.499996e+02 0.000e+00 9.708e-05 3.367e-05 6 21 -2.500000e+02 0.000e+00 1.513e-04 6.867e-06 7 24 -2.500000e+02 0.000e+00 1.161e-06 6.920e-08 Local minimum found that satisfies the constraints. Optimization completed because the objective function is non-decreasing in feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance. Xop = -5.0000 -5.0000 Fop = -250.0000
最終点をプロットする
ph(2) = plot3(Xop(1),Xop(2),Fop,'dm','MarkerSize',10,'MarkerFaceColor','m'); % Add a legend to plot legendLabels = [legendLabels, '|fmincon| solution']; lh = legend(ph,legendLabels,'Location','SouthEast'); lp = lh.Position; lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)]; hold off;
確率的目的関数
ここで、ランダムノイズを追加して目的関数を乱します。
rng(0,'twister') % Reset the global random number generator peaknoise = 4.5; Objfcn = @(x) smoothFcn(x,peaknoise); % Handle to the objective function. % Plot the objective function (non-smooth) fig = figure('Color','w'); showSmoothFcn(Objfcn,range); title('Stochastic objective function') ax = gca; ax.CameraPosition = [-31.0391 -85.2792 -281.4265]; ax.CameraTarget = [0 0 -50]; ax.CameraViewAngle = 6.7937;
確率的目的関数でfmincon
を実行する
摂動された目的関数は確率的であり、滑らかではありません。fmincon
は、目的関数の導関数を使用して局所最小値を見つける一般的な制約付き最適化ソルバーです。目的関数の 1 次導関数を指定しない場合、fmincon
は有限差分を使用して導関数を近似します。この例では、目的関数はランダムであるため、有限差分推定による導関数は信頼できない可能性があります。fmincon
は、最小値ではないポイントで停止する可能性があります。これは、ノイズのために最終時点で最適条件が満たされたように見えるか、fmincon
がそれ以上先に進めなかったために発生する可能性があります。
[Xop,Fop] = fmincon(Objfcn,X0,[],[],[],[],LB,UB,[],options) figure(fig); hold on; ph = []; ph(1) = plot3(X0(1),X0(2),Objfcn(X0)+30,'or','MarkerSize',10,'MarkerFaceColor','r'); ph(2) = plot3(Xop(1),Xop(2),Fop,'dm','MarkerSize',10,'MarkerFaceColor','m'); % Add legend to plot legendLabels = {'Start point','|fmincon| solution'}; lh = legend(ph,legendLabels,'Location','SouthEast'); lp = lh.Position; lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)]; hold off;
First-order Norm of Iter F-count f(x) Feasibility optimality step 0 3 -1.925772e+01 0.000e+00 2.126e+08 1 6 -7.107849e+01 0.000e+00 2.623e+08 8.873e+00 2 11 -8.055890e+01 0.000e+00 2.401e+08 6.715e-01 3 20 -8.325315e+01 0.000e+00 7.348e+07 3.047e-01 4 48 -8.366302e+01 0.000e+00 1.762e+08 1.593e-07 5 64 -8.591081e+01 0.000e+00 1.569e+08 3.111e-10 Local minimum possible. Constraints satisfied. fmincon stopped because the size of the current step is less than the value of the step size tolerance and constraints are satisfied to within the value of the constraint tolerance. Xop = -4.9628 2.6673 Fop = -85.9108
patternsearch
の実行
ここで、Global Optimization Toolbox patternsearch
ソルバーを使用して確率的目的関数を最小化します。パターン検索最適化手法は、最適化のための直接検索方法の一種です。パターン検索アルゴリズムは、最適なポイントを見つけるために目的関数の導関数を使用しません。
PSoptions = optimoptions(@patternsearch,'Display','iter'); [Xps,Fps] = patternsearch(Objfcn,X0,[],[],[],[],LB,UB,PSoptions) figure(fig); hold on; ph(3) = plot3(Xps(1),Xps(2),Fps,'dc','MarkerSize',10,'MarkerFaceColor','c'); % Add legend to plot legendLabels = [legendLabels, 'Pattern Search solution']; lh = legend(ph,legendLabels,'Location','SouthEast'); lp = lh.Position; lh.Position = [1-lp(3)-0.005 0.005 lp(3) lp(4)]; hold off
Iter Func-count f(x) MeshSize Method 0 1 -7.20766 1 1 3 -34.7227 2 Successful Poll 2 3 -34.7227 1 Refine Mesh 3 5 -34.7227 0.5 Refine Mesh 4 8 -96.0847 1 Successful Poll 5 10 -96.0847 0.5 Refine Mesh 6 13 -132.888 1 Successful Poll 7 15 -132.888 0.5 Refine Mesh 8 17 -132.888 0.25 Refine Mesh 9 20 -197.689 0.5 Successful Poll 10 22 -197.689 0.25 Refine Mesh 11 24 -197.689 0.125 Refine Mesh 12 27 -241.344 0.25 Successful Poll 13 29 -241.344 0.125 Refine Mesh 14 31 -254.624 0.25 Successful Poll 15 33 -254.624 0.125 Refine Mesh 16 35 -254.624 0.0625 Refine Mesh 17 37 -254.624 0.03125 Refine Mesh 18 39 -254.624 0.01562 Refine Mesh 19 41 -254.624 0.007812 Refine Mesh 20 42 -256.009 0.01562 Successful Poll 21 44 -256.009 0.007812 Refine Mesh 22 47 -256.009 0.003906 Refine Mesh 23 50 -256.009 0.001953 Refine Mesh 24 53 -256.009 0.0009766 Refine Mesh 25 56 -256.009 0.0004883 Refine Mesh 26 59 -256.009 0.0002441 Refine Mesh 27 62 -256.009 0.0001221 Refine Mesh 28 65 -256.009 6.104e-05 Refine Mesh 29 68 -256.009 3.052e-05 Refine Mesh 30 71 -256.009 1.526e-05 Refine Mesh Iter Func-count f(x) MeshSize Method 31 74 -256.009 7.629e-06 Refine Mesh 32 77 -256.009 3.815e-06 Refine Mesh 33 80 -256.009 1.907e-06 Refine Mesh 34 83 -256.009 9.537e-07 Refine Mesh patternsearch stopped because the mesh size was less than options.MeshTolerance. Xps = -4.9688 -5.0000 Fps = -256.0095
パターン検索は、目的関数内のランダムノイズの影響をそれほど受けません。パターン検索には関数値のみが必要であり、導関数は必要ないため、ノイズ (ある種の均一な種類) はパターン検索に影響を与えない可能性があります。ただし、パターン検索では、導関数ベースのアルゴリズムよりも真の最小値を見つけるために多くの関数評価が必要であり、導関数を使用しないことによるコストがかかります。