Main Content

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

多くの局所最小値を持つ関数を最小化する

この例では、シミュレーテッド アニーリングを使用して関数の局所最小値を見つける方法を示します。この例では、コマンド ラインで作業する方法と、最適化 ライブ エディター タスクを使用する方法という 2 つの最小化方法を示します。

デ・ヨングの第5関数は、多くの(25)局所最小値を持つ2次元関数です。この例を実行すると、関数が使用可能になります。次のグラフでは、どの局所最小値が全体最小値であるかは不明です。

dejong5fcn

多くの標準的な最適化アルゴリズムは、局所的最小値に陥ってしまいます。シミュレーテッド アニーリング アルゴリズムは広範囲のランダム検索を実行するため、局所的最小値に陥る可能性が減少します。

注意: シミュレーテッド アニーリングでは乱数ジェネレーターが使用されるため、このアルゴリズムを実行するたびに異なる結果が得られる可能性があります。詳細については、結果を再現するを参照してください。

コマンドラインで最小化する

シミュレーテッド アニーリング アルゴリズムを制約なしで実行するには、次のコードで匿名関数 @dejong5fcn によって参照される dejong5fcn.m 内の目的関数を使用して、コマンド ラインで simulannealbnd を呼び出します。

rng(10,'twister') % for reproducibility
fun = @dejong5fcn;
[x,fval] = simulannealbnd(fun,[0 0])
simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.
x = 1×2

  -16.1292  -15.8214

fval = 6.9034

結果は次のとおりです。

  • x はアルゴリズムによって返される最終ポイントです。

  • fval は最終点における目的関数の値です。

Optimize ライブエディタータスクを使用して最小化する

視覚的なアプローチを提供する 最適化 ライブ エディター タスクを使用して最小化を実行することもできます。

  • [ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] ボタンをクリックして、新しいライブ スクリプトを作成します。

new_live_script.png

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

optimizelet_insert.png

optimizelet_choose.png

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

optimizelet_initial.png

  • 問題データの入力に使用するには、[挿入] タブの [セクション区切り] ボタンをクリックして新しいセクションを挿入します。新しいセクションがタスクの上と下に表示されます。

  • タスクの上の新しいセクションで、次のコードを入力して、初期ポイントと目的関数を定義します。

x0 = [0 0];
fun = @dejong5fcn;
rng default % For reproducibility
  • これらの変数をワークスペースに配置するには、Ctrl+Enter を押してセクションを実行します。

  • タスクの 問題タイプの指定 セクションで、 目的 > 非線形 ボタンをクリックします。

  • [ソルバー] > [simulannealbnd - シミュレーテッド アニーリング アルゴリズム] を選択します。

  • タスクの 問題データの選択 セクションで、 目的関数 > 関数ハンドル を選択し、次に fun を選択します。

  • [初期点 (x0)]、[x0] を選択します。

optimizelet_simulannealbnd_setup.png

  • タスクの 進行状況の表示 セクションで、 最適値 プロットを選択します。

  • ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。別の Figure ウィンドウとタスク出力領域にプロットが表示されます。simulannealbnd は確率的アルゴリズムであるため、プロットは表示されているものと異なる場合があることに注意してください。

optimizelet_simulannealbnd_plot.png

  • 解決策と最適な目的関数の値を確認するには、タスクの上部を確認します。

optimizelet_simulannealbnd_solution.png

  • Optimize ライブ エディター タスクは、solution および objectiveValue という名前の変数をワークスペースに返します。

  • これらの変数の値を表示するには、タスクの下のセクションに次のコードを入力します。

disp(solution)
disp(objectiveValue)
  • Ctrl+Enter を押してセクションを実行します。

この例の最後では、Optimize タスクが最終状態になっています。

Live Task

simulannealbnd stopped because the change in best function value is less than options.FunctionTolerance.

Optimize ライブ エディター タスクとコマンド ラインの両方を使用して問題を定式化して解決することができ、結果は同一になります。コマンドラインはより合理化されていますが、ソルバーの選択、問題の設定、プロット関数などのオプションの選択に関するヘルプは少なくなっています。Optimize を使用して問題を開始し、次に [最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題 のようにコマンドラインで使用するためのコードを生成することもできます。

参考

関連するトピック