Main Content

問題ベースの最適化ライブ エディター タスクの概要

このサンプル スクリプトは、問題ベースの "最適化" ライブ エディター タスクを使用した最適化や方程式解法を示しています。独自の問題に合わせてスクリプトを修正してください。

このスクリプトは、次のような、非線形制約を伴う非線形最適化問題を解きます。

x2+y21 という制約の下で、rosenbrock(x,y,a)=log(1+a(y-x2)2+(1-x)2) を最小化します。ここで、a=100、初期点 x0x=-2,y=2 です。また、範囲 -3x3-2y9 を設定します。

目的関数のコードは、このスクリプトの終わりに掲載しています。

パラメーターまたはデータの挿入

通常は、データや値をソルバーに渡します。これらの値を入力セクション (x0xx0y が表示されている) に入力し、[セクション]、[セクションの実行] を選択するか、Control+Enter を押すことによってセクションを実行します。

初期点成分 x0yx0x を設定し、最適化するために a をスケールします。

x0x = -2;
x0y = 2;
a = 100;

先に進む前にこのセクションを実行することによって、これらの値と他の問題データをワークスペースに配置します

最適化ライブ エディター タスク

通常は、[ライブ エディター] タブで [タスク] > [最適化] を選択するか、または [挿入] タブで [タスク] > [最適化] を選択して、最適化ライブ エディター タスクをスクリプトに配置します。このとき、次の選択肢が表示されます。(これは単なるイメージで、実際のタスクではありません。)

optimizelet_choose.png

問題ベースのタスクを選択するには、[問題ベース (推奨)] をクリックします。

以下の問題ベースのタスクには、変数、目的関数、および制約が入力されています。各自の問題に合わせてタスクを修正するか、そのまま実行してタスクの動作を確認します。問題を修正するには、タスクの一番下で [問題の定義] ボタンをクリックします。タスクを実行するには、タスクの一番下で [問題の求解] ボタンをクリックします。

Live Task
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       log(((1 + (100 .* (y - x.^2).^2)) + (1 - x).^2))


	subject to :
       (x.^2 + y.^2) <= 1

	variable bounds:
       -3 <= x <= 3

       -2 <= y <= 9
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
solution = struct with fields:
    x: 0.7864
    y: 0.6177

reasonSolverStopped = 
    OptimalSolution

objectiveValue = 0.0447

結果の解釈

タスクが solve を呼び出し、そこで fmincon を呼び出してこの問題を解きます。タスクの一番上には、解が solution 構造体で返されることが示されています。報告された解 x = 0.7864y = 0.6177 は、次の計算のように x2+y21 という制約を満たします。

solution.x^2 + solution.y^2                                     
ans = 1.0000

ソルバーは、停止時に終了条件 OptimalSolution を報告します。この条件を解釈するには、fmincon ソルバーの exitflag 出力引数を確認します。その説明には、「1 次の最適性の尺度が options.OptimalityTolerance より小さく、最大制約違反が options.ConstraintTolerance より小さいことを示します」と記載されています。つまり、この解は実行可能な局所的最小値です。

解での目的関数値は 0.0457 です。これは、実行可能点の中で最も小さい目的関数値です。

補助関数

次のコードは、補助関数 rosenbrock を作成します。

function objective = rosenbrock(x,y,a)
% This function should return a scalar representing an optimization objective.

% Example: Concession stand profit
% revenue = 3*soda + 5*popcorn + 2*candy;
% cost = 1*soda + 2*popcorn + 0.75*candy;
% objective = revenue - cost; % profit

% Edit the lines below with your calculations.
objective = log(1 + a*(y - x^2)^2 + (1 - x)^2);
end

参考