メインコンテンツ

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

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

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

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

dejong5fcn

Figure contains an axes object. The axes object contains 2 objects of type surface, contour.

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

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

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

制約なしでシミュレーテッド アニーリング法を実行するには、次のコードの匿名関数 @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 を選択します。

  • [Initial point (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

Figure Simulated Annealing contains an axes object. The axes object with title Best Function Value: 10.7632, xlabel Iteration, ylabel Function value contains an object of type scatter.

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

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

参考

トピック