メインコンテンツ

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

シミュレーテッド アニーリング オプション

コマンドラインでシミュレーテッド アニーリングのオプションを設定する

次のように optimoptions 関数を使用して options オブジェクトを作成し、オプションを指定します。

options = optimoptions(@simulannealbnd,...
    'Param1',value1,'Param2',value2, ...);

このセクションの各オプションは、options 内のフィールド名でリストされます。たとえば、InitialTemperatureoptions の対応するフィールドを参照します。

プロット オプション

プロット オプションを使用すると、シミュレーテッド アニーリング ソルバーの実行中にデータをプロットできます。

PlotInterval は、プロット関数の連続呼び出し間の反復回数を指定します。

コマンドラインから simulannealbnd を呼び出すときにプロットを表示するには、optionsPlotFcn フィールドを組み込みプロット関数名またはプロット関数へのハンドルに設定します。次のいずれかのプロットを指定できます。

  • 'saplotbestf' は最適な目的関数の値をプロットします。

  • 'saplotbestx' は現在の最良のポイントをプロットします。

  • 'saplotf' は現在の関数の値をプロットします。

  • 'saplotx' は現在の点をプロットします。

  • 'saplotstopping' は停止基準レベルをプロットします。

  • 'saplottemperature' は各反復で温度をプロットします。

  • @myfun はカスタム プロット関数をプロットします。ここで、myfun は関数の名前です。構文の説明については、プロット関数の構造 を参照してください。

例えば、最良の客観的プロットを表示するには、optionsを次のように設定します。

options = optimoptions(@simulannealbnd,'PlotFcn','saplotbestf');

複数のプロットを表示するには、セル配列構文を使用します。

options = optimoptions(@simulannealbnd,...
    'PlotFcn',{@plotfun1,@plotfun2, ...});

ここで、@plotfun1@plotfun2 などはプロット関数への関数ハンドルです。

複数のプロット関数を指定すると、すべてのプロットが同じウィンドウにサブプロットとして表示されます。任意のサブプロットを右クリックすると、別の図ウィンドウに大きなバージョンが表示されます。

プロット関数の構造

プロット関数の最初の行は次の形式をとる。

function stop = plotfun(options,optimvalues,flag)

関数への入力引数は

  • optionsoptimoptions を使用して作成されたオプション。

  • optimvalues — ソルバーの現在の状態に関する情報を含む構造体。この構造体には、次のフィールドがあります。

    • x — 現在のポイント

    • fval — xにおける目的関数の値

    • bestx — これまでに見つけた最高のポイント

    • bestfval — 最良点における目的関数の値

    • temperature — 現在の気温

    • iteration — 現在のイテレーション

    • funccount — 関数評価の回数

    • t0 — アルゴリズムの開始時刻

    • k — アニーリングパラメーター

  • flag — プロット関数が呼び出される現在の状態。flagの可能な値は

    • 'init' — 初期化状態

    • 'iter' — 反復状態

    • 'done' — 最終状態

出力引数 stop は、現在の反復でアルゴリズムを停止する方法を提供します。stop には次の値を指定できます。

  • false — アルゴリズムは次の反復に進みます。

  • true — アルゴリズムは現在の反復で終了します。

メモ

プロット関数のフレームワークで座標軸が管理されるため、プロット関数は subplot ステートメントをサポートしていません。複数のサブプロットを指定するには、個別のプロット関数を記述し、cell 配列としてソルバーに渡します。

options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});

出力関数は subplot をサポートするため、プロット関数ではなく出力関数を使用すると、1 つの関数に複数のプロットを含めることができます。

温度オプション

温度オプションは、アルゴリズムの実行中に各反復で温度をどのように下げるかを指定します。

  • InitialTemperature — アルゴリズム開始時の初期温度。既定値は 100 です。初期温度は、未知数のベクトルである x と同じ長さのベクトルにすることができます。simulannealbnd は、スカラー初期温度をベクトルに展開します。

  • TemperatureFcn — 温度スケジュールを更新するために使用される関数。k をアニーリングパラメーターとします。(アニーリングパラメーターは再アニーリングまでの反復回数と同じになります。)以下のオプションがあります。

    • 'temperatureexp' — 温度は InitialTemperature * 0.95^k に等しいです。これは既定の設定です。

    • 'temperaturefast' — 温度は InitialTemperature / k に等しいです。

    • 'temperatureboltz' — 温度は InitialTemperature / ln(k) に等しいです。

    • @myfun — カスタム関数 myfun を使用して温度を更新します。構文は、次のようになります。

      temperature = myfun(optimValues,options)

      ここで、optimValuesプロット関数の構造 で記述された構造体です。optionsoptimoptions とともに作成されるか、オプションを作成していない場合はデフォルトのオプションで構成されます。アニーリングパラメーターoptimValues.k と温度 optimValues.temperature はどちらも、現在のポイント x の要素数に等しい長さのベクトルです。たとえば、関数 temperaturefast は次のようになります。

      temperature = options.InitialTemperature./optimValues.k;

アルゴリズムの設定

アルゴリズム設定は、各反復で新しいポイントを生成する際に使用されるアルゴリズム固有のパラメーターを定義します。

simulannealbnd に指定できるパラメーターは次のとおりです。

  • DataType — 目的関数で使用するデータのタイプ。選択肢:

    • 'double' (デフォルト) — double 型のベクトル。

    • 'custom' — その他のデータ型。'custom' アニーリング関数を指定する必要があります。ハイブリッド関数は使用できません。

  • AnnealingFcn — 次の反復のための新しいポイントを生成するために使用される関数。選択肢は以下になります。

    • 'annealingfast' — ステップの長さは温度で、方向は均一にランダムです。これは既定の設定です。

    • 'annealingboltz' — ステップの長さは温度の平方根で、方向は均一にランダムです。

    • @myfun — カスタム アニーリング アルゴリズム myfun を使用します。構文は、次のようになります。

      newx = myfun(optimValues,problem)
      ここで、optimValues出力関数の構造 で説明されている構造体であり、problem は次の情報を含む構造体です。

      • objective: 目的関数への関数ハンドル

      • x0: スタート地点

      • nvar: 決定変数の数

      • lb: 決定変数の下限

      • ub: 決定変数の上限

      たとえば、現在の位置は optimValues.x で、現在の目的関数の値は problem.objective(optimValues.x) です。

      saannealingfcntemplate.m ファイルを変更することで、カスタム目的関数を記述できます。すべての反復を境界内に維持するには、カスタム アニーリング関数で最終コマンドとして sahonorbounds を呼び出します。

  • ReannealInterval — 再アニーリング前に受け入れられるポイントの数。既定値は 100 です。

  • AcceptanceFcn — 新しいポイントが受け入れられるかどうかを判断するために使用される関数。選択肢は以下になります。

    • 'acceptancesa' — シミュレーテッド アニーリングの受け入れ関数(デフォルト)。新しい目的関数の値が古い値より小さい場合、新しいポイントは常に受け入れられます。それ以外の場合、新しいポイントは、目的関数の値の差と現在の温度に応じた確率でランダムに受け入れられます。受理確率は

      11+exp(Δmax(T)),

      ここで、Δ = 新しい目的 - 古い目的、T は現在の温度です。Δ と T は両方とも正なので、受理確率は 0 から 1/2 の間になります。温度が低いほど、合格確率は低くなります。また、Δ が大きいほど、受け入れ確率は小さくなります。

    • @myfun — カスタム受け入れ関数、myfun。構文は、次のようになります。

      acceptpoint = myfun(optimValues,newx,newfval);
      ここで、optimValues出力関数の構造 で記述された構造、newx は受け入れが評価されるポイント、newfvalnewx における目的関数です。acceptpoint はブール値で、値 truenewx を受け入れ、falsenewx を拒否します。

ハイブリッド関数オプション

ハイブリッド関数は、ソルバーの反復中または反復の最後に実行される別の最小化関数です。HybridInterval は、ハイブリッド関数が呼び出される間隔を指定します (never または end でない場合)。HybridFcn オプションを使用してハイブリッド関数を指定できます。選択肢は以下になります。

  • [] —ハイブリッド関数はありません。

  • 'fminsearch' — MATLAB® 関数 fminsearch を使用して制約のない最小化を実行します。

  • 'patternsearch'patternsearch を使用して、制約付きまたは制約なしの最小化を実行します。

  • 'fminunc' — Optimization Toolbox™ 関数 fminunc を使用して制約のない最小化を実行します。

  • 'fmincon' — Optimization Toolbox 関数 fmincon を使用して制約付き最小化を実行します。

メモ

ハイブリッド関数が問題の制約を受け入れることを確認します。そうでない場合、simulannealbnd はエラーをスローします。

ハイブリッド関数には個別のオプションを設定できます。fminsearch の場合は optimset を使用し、fminconpatternsearchfminunc の場合は optimoptions を使用します。以下に例を示します。

hybridopts = optimoptions('fminunc',...
    'Display','iter','Algorithm','quasi-newton');
次のようにハイブリッド オプションを simulannealbnd options に含めます。
options = optimoptions(@simulannealbnd,options,...
    'HybridFcn',{@fminunc,hybridopts}); 
options を設定する前に hybridopts が存在している必要があります。

例については、遺伝的アルゴリズムにおけるハイブリッド方式 を参照してください。ハイブリッド関数を使用する場合を参照してください。

停止基準オプション

停止基準は、アルゴリズムを終了する原因を決定します。次のオプションを指定できます。

  • FunctionTolerance — アルゴリズムは、StallIterLim 回の反復における目的関数の値の平均変化が FunctionTolerance 未満になるまで実行されます。既定値は 1e-6 です。

  • MaxIterations — 反復回数がこの最大反復回数を超えると、アルゴリズムは停止します。最大反復回数は、正の整数または Inf として指定できます。デフォルトは Inf です。

  • MaxFunctionEvaluations は目的関数の評価の最大数を指定します。関数評価の回数が関数評価の最大回数を超えると、アルゴリズムは停止します。許容される最大値は 3000*numberofvariables です。

  • MaxTime は、アルゴリズムが停止するまでに実行される最大時間を秒単位で指定します。

  • ObjectiveLimit — 実行可能点の最良の目的関数値が ObjectiveLimit より小さい場合、アルゴリズムは停止します。

出力関数のオプション

出力関数は、アルゴリズムが各反復で呼び出す関数です。デフォルト値は出力関数なし([])です。まず、出力関数の構造 で説明されている構文を使用して出力関数を作成する必要があります。

最適化アプリの使用:

  • 出力関数@myfun として指定します。ここで、myfun は関数の名前です。

  • 出力関数で追加のパラメーターを渡すには、無名関数 を使用します。

  • 複数の出力関数の場合は、出力関数ハンドルのセル配列を入力します: {@myfun1,@myfun2,...}

コマンド ラインで、次を指定します。

  • options = optimoptions(@simulannealbnd,'OutputFcn',@myfun);

  • 複数の出力関数の場合は、関数ハンドルのセル配列を入力します。

    options = optimoptions(@simulannealbnd,...
        'OutputFcn',{@myfun1,@myfun2,...});

独自の出力関数を書くために使用できるテンプレートを表示するには、次のように入力します。

edit saoutputfcntemplate

MATLAB コマンドラインで。

出力関数の構造

出力関数の呼び出し構文は次のとおりです。

[stop,options,optchanged] = myfun(options,optimvalues,flag)

この関数には次の入力引数があります。

  • optionsoptimoptions を使用して作成されたオプション。

  • optimvalues — ソルバーの現在の状態に関する情報を含む構造体。この構造体には、次のフィールドがあります。

    • x — 現在のポイント

    • fval — xにおける目的関数の値

    • bestx — これまでに見つけた最高のポイント

    • bestfval — 最良点における目的関数の値

    • temperature — 現在の気温、xと同じ長さのベクトル

    • iteration — 現在のイテレーション

    • funccount — 関数評価の回数

    • t0 — アルゴリズムの開始時刻

    • k — アニーリングパラメーター、xと同じ長さのベクトル

  • flag — 出力関数が呼び出される現在の状態。flagの可能な値は

    • 'init' — 初期化状態

    • 'iter' — 反復状態

    • 'done' — 最終状態

追加パラメーターの受け渡し は、出力関数に追加のパラメーターを提供する方法について説明します。

出力関数は次の引数を返します。

  • stop — 現在の反復でアルゴリズムを停止する方法を提供します。stop には次の値があります。

    • false — アルゴリズムは次の反復に進みます。

    • true — アルゴリズムは現在の反復で終了します。

  • options — 出力関数によって変更されたオプション。

  • optchangedoptions に変更が加えられたことを示すブールフラグ。オプションを変更する場合は、これを true に設定する必要があります。

表示オプション

アルゴリズムの実行中にコマンド ラインに表示される情報の量を指定するには、Display オプションを使用します。利用可能なオプションは次のとおりです

  • off — 出力は表示されません。これは、最適化アプリからエクスポートされた options のデフォルト値です。

  • iter — 反復ごとに情報が表示されます。

  • diagnose — 反復ごとに情報が表示されます。さらに、診断ではいくつかの問題情報とデフォルトから変更されたオプションがリストされます。

  • final — 停止の理由が表示されます。これは、optimoptions を使用して作成されたオプションのデフォルトです。

iterdiagnose はどちらも次の情報を表示します。

  • Iteration — 反復回数

  • f-count — 目的関数評価の累積回数

  • Best f(x) — 最適な目的関数値

  • Current f(x) — 現在の目的関数の値

  • Mean Temperature — 平均温度関数値