このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
GPSアルゴリズムを使用した最適化
この例では、patternsearch ソルバーのデフォルトである GPS アルゴリズムを使用して最適化問題を解決する方法を示します。この例では、Optimize ライブ エディター タスクを使用して、視覚的なアプローチで最適化を完了します。
目的関数
この例では、この例を実行するときに含まれる目的関数 ps_example を使用します。関数のコードを表示します。
type ps_examplefunction f = ps_example(x)
%PS_EXAMPLE objective function for patternsearch.
% Copyright 2003-2021 The MathWorks, Inc.
f = zeros(1,size(x,1));
for i = 1:size(x,1)
if x(i,1) < -5
f(i) = (x(i,1)+5)^2 + abs(x(i,2));
elseif x(i,1) < -3
f(i) = -2*sin(x(i,1)) + abs(x(i,2));
elseif x(i,1) < 0
f(i) = 0.5*x(i,1) + 2 + abs(x(i,2));
elseif x(i,1) >= 0
f(i) = .3*sqrt(x(i,1)) + 5/2 +abs(x(i,2));
end
end
関数をプロットします。
fsurf(@(x,y)reshape(ps_example([x(:),y(:)]),size(x)),... [-6 2 -4 4],'LineStyle','none','MeshDensity',300) colormap 'jet' view(-26,43) xlabel('x(1)') ylabel('x(2)') title('ps\_example(x)')

関数の最小値を求める
Optimize ライブ エディター タスクを使用して ps_example の最小値を見つけるには、次の手順を実行します。
[ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] ボタンをクリックして、新しいライブ スクリプトを作成します。

Optimizeライブ エディター タスクを挿入します。[挿入] タブをクリックしてから、[コード] セクションで、[タスク]、[最適化] を選択します。


ソルバーベースタスクをクリックします。

問題データの入力に使用するには、[挿入] タブの [セクション区切り] ボタンをクリックして新しいセクションを挿入します。新しいセクションがタスクの上と下に表示されます。
タスクの上の新しいセクションで、次のコードを入力して初期点と目的関数を定義します。
x0 = [2.1 1.7]; fun = @ps_example;
これらの変数をワークスペースに配置するには、Ctrl + Enter を押してセクションを実行します。
タスクの 問題の種類の指定 セクションで、 目的 > 非平滑 ボタンをクリックします。
選択したソルバーが
patternsearchであることを確認します。タスクの 問題データの選択 セクションで、 [目的関数] > [関数ハンドル] を選択し、次に
funを選択します。[Initial point (x0) > x0] を選択します。
タスクの 進行状況の表示 セクションで、 最適値 および メッシュ サイズ プロットを選択します。

ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。プロットは別の図ウィンドウとタスク出力領域に表示されます。

上のグラフは、各反復における最良点の目的関数値を示しています。通常、目的関数の値は初期の反復で急速に改善され、最適値に近づくにつれて安定します。
下のグラフは各反復におけるメッシュ サイズを示しています。メッシュ サイズは、反復が成功するたびに増加し、反復が失敗するたびに減少します。詳細は、パターン探索ポーリングの仕組みを参照してください。
メッシュ サイズが MeshTolerance オプションで定義されたメッシュ サイズ許容値よりも小さくなるため、最適化が停止します。最小関数値はおよそ -2 です。
解決策と目的関数の値を確認するには、タスクの上部を確認します。

Optimize タスクは、変数 solution と objectiveValue をワークスペースに配置します。これらの値を表示するには、タスクの下に新しいセクションを配置し、このコードを含めます。
disp(solution) disp(objectiveValue)
Ctrl+Enter を押してセクションを実行します。
次に、ライブ エディターの最適化タスクが最終状態で表示されます。
patternsearch stopped because the mesh size was less than options.MeshTolerance.

disp(solution)
-4.7124 -0.0000
disp(objectiveValue)
-2.0000
