このページは機械翻訳を使用して翻訳されました。元の英語を参照するには、ここをクリックします。
2つの目的のためのパレートフロント
2つの目的を持つ多目的最適化
この例では、2 つの変数の 2 つの目的関数のパレート集合を見つける方法を示します。この例では、最小化のための 2 つのアプローチ、つまり、最適化 ライブ エディター タスクを使用する方法と、コマンド ラインで作業する方法を示します。
2目的関数f(x)(xも2次元)は、
最適化ライブエディタータスクを使用してパレートセットを見つける
[ホーム] タブの [ファイル] セクションで [新規ライブ スクリプト] ボタンをクリックして、新しいライブ スクリプトを作成します。
[最適化] ライブ エディター タスクを挿入します。[挿入] タブをクリックしてから、[コード] セクションで、[タスク]、[最適化] を選択します。
Solver-based タスクをクリックします。
問題データの入力に使用するには、[Insert] タブの [Section Break] ボタンをクリックして新しいセクションを挿入します。新しいセクションがタスクの上と下に表示されます。
タスクの上の新しいセクションで、次のコードを入力して、変数の数と下限と上限を定義します。
nvar = 2; lb = [0 -5]; ub = [5 0];
これらの変数をワークスペースに配置するには、Ctrl+Enter を押してセクションを実行します。
問題の種類を指定
タスクの Specify problem type セクションで、Objective > Nonlinear ボタンをクリックします。
Constraints > Lower bounds ボタンと Upper bounds ボタンをクリックします。
Solver > gamultiobj - Multiobjective optimization using genetic algorithmを選択します。
問題データの選択
Select problem data セクションで Objective function > Local function を選択し、New ボタンをクリックします。タスクの下側の新しいセクションに関数が表示されます。
結果の関数定義を編集して、次のコードを含めます。
function f = mymulti1(x) f(2) = x(1)^4 + x(2)^4 + x(1)*x(2) - (x(1)*x(2))^2; f(1) = f(2) - 10*x(1)^2; end
Select problem data セクションで、Local function > mymulti1 関数を選択します。
Number of variables > nvarを選択します。
Lower bounds > From workspace > lb と Upper bounds > From workspace > ub を選択します。
ソルバーオプションを指定する
タスクの Specify solver options セクションを展開し、 Add ボタンをクリックします。より密度が高く、より連結されたパレートフロントを作成するには、Population settings > Population size > 60 を選択して、デフォルトよりも大きい母集団を指定します。
デフォルト設定よりも多くの人口をパレートフロントに配置するには、+ ボタンをクリックします。表示されたオプションから、Algorithm > Pareto set fraction > 0.7 を選択します。
表示オプションを設定する
タスクの Display progress セクションで、Pareto front プロット関数を選択します。
ソルバーの実行と結果の検証
ソルバーを実行するには、タスク ウィンドウの右上にあるオプション ボタン [⁝] をクリックして、[セクションの実行] を選択します。別の Figure ウィンドウとタスク出力領域にプロットが表示されます。
このプロットは、目的関数空間にプロットされた f の 2 つのコンポーネント間のトレードオフを示しています。詳細については、図図 14-2、非劣性ソリューションのセットを参照してください。
コマンドラインでパレート集合を見つける
同じ最適化をコマンド ラインで実行するには、次の手順を実行します。
MATLAB® パスに
mymulti1
目的関数ファイルを作成します。function f = mymulti1(x) f(2) = x(1)^4 + x(2)^4 + x(1)*x(2) - (x(1)*x(2))^2; f(1) = f(2) - 10*x(1)^2; end
オプションと境界を設定します。
options = optimoptions('gamultiobj','PopulationSize',60,... 'ParetoFraction',0.7,'PlotFcn',@gaplotpareto); lb = [0 -5]; ub = [5 0];
オプションを使用して最適化を実行します。
[solution,ObjectiveValue] = gamultiobj(@mymulti1,2,... [],[],[],[],lb,ub,options);
最適化 ライブ エディター タスクとコマンド ラインの両方を使用して問題を定式化して解決することができ、同じ結果が得られます。コマンドラインはより合理化されていますが、ソルバーの選択、問題の設定、プロット関数などのオプションの選択に関するヘルプは少なくなっています。また、Optimize を使用して問題を開始し、[最適化] ライブ エディター タスクまたはソルバーを使用した制約付き非線形問題 のように、コマンド ラインで使用するためのコードを生成することもできます。
別の見方
この問題は他の方法でも考えられます。次の図には、2 つの目的関数のレベル曲線、gamultiobj
によって計算されたパレート フロンティア (ボックス)、および真のパレート フロンティアの x 値 (ほぼ直線で接続されたダイヤモンド) のプロットが含まれています。真のパレート境界点は、目的関数のレベル曲線が平行になる場所です。アルゴリズムは、目的関数の勾配が平行になる場所を見つけることによってこれらのポイントを計算します。この図はパラメータ空間にプロットされています。図 14-1、パラメータ空間から目的関数空間へのマッピング を参照してください。
目的関数の等高線とパレート境界
gamultiobj
は線分の端点を見つけます。つまり、パレート限界の全範囲を見つけます。