Main Content

optimvalues

最適化問題の値の作成

説明

val = optimvalues(prob,dataname1,dataval1,...) は、問題 probOptimizationValues オブジェクトを作成します。すべての変数名およびそれらに関連付けられた値を指定し、名前と値の引数を使用して、オプションで目的値または制約値を指定します。たとえば、x が 1 ~ 99 の奇数値を取るように指定するには、次のようにします。

val = optimvalues(prob,x=1:2:99);

valprob の初期点または初期集団として使用します。

すべて折りたたむ

問題ベースのアプローチで ga (遺伝的アルゴリズム ソルバー) の初期点を作成するには、optimvalues を使用して OptimizationValues オブジェクトを作成します。

適応度 (目的) 関数として Rosenbrock 関数をもつ 2 次元問題の最適化変数を作成します。

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
rosenbrock = (10*(y - x.^2)).^2 + (1-x).^2;
prob = optimproblem(Objective=rosenbrock);

範囲内に 100 個のランダムな 2-D 点を作成します。これらの点は行ベクトルでなければなりません。

rng default % For reproducibility
xval = -5 + 10*rand(1,100);
yval = -5 + 10*rand(1,100);

初期点値オブジェクトを作成します。適応度の値は計算しないため、表示には値が NaN と表示されます。

vals = optimvalues(prob,x=xval,y=yval)
vals = 
  1x100 OptimizationValues vector with properties:

   Variables properties:
            x: [3.1472 4.0579 -3.7301 4.1338 1.3236 -4.0246 -2.2150 ... ]
            y: [-3.3782 2.9428 -1.8878 0.2853 -3.3435 1.0198 -2.3703 ... ]

   Objective properties:
    Objective: [NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... ]

ga を使用して問題を解きます。初期点 vals から始めます。ga オプションを設定して 100 個の集団になるようにします。

opts = optimoptions("ga",PopulationSize=100);
[sol,fv] = solve(prob,vals,Solver="ga",Options=opts)
Solving problem using ga.
Optimization terminated: average change in the fitness value less than options.FunctionTolerance.
sol = struct with fields:
    x: 1.0000
    y: 1.0000

fv = 4.1061e-09

ga は、0 付近に適応度値をもつ真の解 x = 1, y = 1 に極めて近い解を返します。

問題ベースのアプローチで surrogateopt の初期点を作成するには、optimvalues を使用して OptimizationValues オブジェクトを作成します。

目的関数として Rosenbrock 関数をもつ 2 次元問題の最適化変数を作成します。

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
rosenbrock = (10*(y - x.^2)).^2 + (1 - x).^2;
prob = optimproblem(Objective=rosenbrock);

解は原点に関して半径 2 の円内で、直線 y = 1 + x より下にあるという制約を作成します。

disc = x^2 + y^2 <= 2^2;
prob.Constraints.disc = disc;
line = y <= 1 + x;
prob.Constraints.line = line;

範囲内に 40 個のランダムな 2-D 点を作成します。これらの点は行ベクトルでなければなりません。

rng default % For reproducibility
N = 40;
xval = -5 + 10*rand(1,N);
yval = -5 + 10*rand(1,N);

ランダムな点上で Rosenbrock 関数を評価します。関数値は行ベクトルでなければなりません。この手順はオプションです。関数値を指定しない場合、surrogateopt は点 (xval,yval) における目的関数を評価します。関数値がある場合は、その値をデータとして指定することによってソルバーの時間を短縮できます。

fval = zeros(1,N);
for i = 1:N
    p0 = struct('x',xval(i),'y',yval(i));
    fval(i) = evaluate(rosenbrock,p0);
end

点について制約を評価します。制約値は行ベクトルでなければなりません。この手順はオプションです。制約値を指定しない場合、surrogateopt は点 (xval,yval) における制約関数を評価します。

discval = zeros(1,N);
lineval = zeros(1,N);
for i = 1:N
    p0 = struct('x',xval(i),'y',yval(i));
    discval(i) = infeasibility(disc,p0);
    lineval(i) = infeasibility(line,p0);
end

初期点値オブジェクトを作成します。

vals = optimvalues(prob,x=xval,y=yval,Objective=fval,disc=discval,line=lineval)
vals = 
  1x40 OptimizationValues vector with properties:

   Variables properties:
            x: [3.1472 4.0579 -3.7301 4.1338 1.3236 -4.0246 -2.2150 ... ]
            y: [-0.6126 -1.1844 2.6552 2.9520 -3.1313 -0.1024 -0.5441 ... ]

   Objective properties:
    Objective: [1.1067e+04 3.1166e+04 1.2698e+04 1.9992e+04 2.3846e+03 ... ]

   Constraints properties:
         disc: [6.2803 13.8695 16.9638 21.8023 7.5568 12.2078 1.2024 0 ... ]
         line: [0 0 5.3853 0 0 2.9222 0.6709 0 0 0 0.1841 0 0 0 0 2.5648 ... ]

surrogateopt を使用して問題を解きます。初期点 vals から始めます。

[sol,fv] = solve(prob,vals,Solver="surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0.0217481 contains an object of type line. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 0.8525
    y: 0.7267

fv = 0.0217

surrogateopt は、0 付近に目的関数をもつ真の解 x = 1, y = 1 にある程度近い解を返します。

入力引数

すべて折りたたむ

最適化問題。OptimizationProblem オブジェクトとして指定します。optimproblem を使用して、prob を作成します。

optimvalues から有効な出力を取得するには、名前と値の引数にもデータを含める必要があります。

名前と値の引数

引数の任意のペアを Name1=Value1,...,NameN=ValueN のように指定します。Name は引数名、Value は対応する値です。名前と値の引数は、他の引数より後に指定されている必要があります。ただし、各ペアの順序は任意です。

例: val = optimvalues(x=xvals,y=yvals)

変数、名前付き目的関数、または名前付き制約のデータ。double の実数配列として指定します。変数のすべてのデータ名を指定します。目的関数と制約関数の名前はオプションです。

nval 個の点を指定した場合、各 dataname 引数の値は次のような次元になっている必要があります。

prob.property.namesize(value)
スカラーまたはベクトルnumel(prob.property.name)nval
行列または配列size(prob.property.name)nval

特に、dataname がベクトルの場合、dataname 引数の値は nval 列の行列です。たとえば、変数 'x' が長さ 2 の行ベクトルで、nval が 3 の場合、変数 'x' の指定は次のようになります。

val = optimvalues(prob,'x',[1 2 3; 4 5 -6]);

このように指定すると、'x' は 3 つの値 [1,4][2,5]、および [3,-6] を取るということになります。

例: スカラー 'x' と 2 要素の行ベクトル 'y' (nval = 2: val = optimvalues(prob,x=[5,3],y=[1 2;3 4])) の場合。出力 val の値は x = 5, y = [1 3] および x = 3, y = [2 4] の 2 つとなります。

データ型: double

名前のない目的関数の値。double の実数配列として指定します。値のサイズは dataname 内のものと同じです。

最適化問題の多目的関数の値は、2 通りの方法で指定できます。

  • 最適化問題の Objective プロパティは関数ハンドルで、この場合は関数がベクトルまたは配列を返します。この場合、行列として値を指定します。行列の各行は、さまざまな点における 1 つの目的関数の値を表します。各列は、1 点におけるさまざまな目的関数の値を表します。

  • 最適化問題の Objective プロパティには、複数の名前付き目的関数があります。この場合、各名前付き目的関数の名前を dataname 引数として使用し、その関数の値を指定します。

以下のソルバーは、与えられた任意の目的関数値を使用します。

  • ga

  • gamultiobj

  • paretosearch

  • surrogateopt

例: 1 つの目的関数と 2 つの点 val = optimvalues(prob,x=[3,5],Objective=[exp(3)+1,exp(5)-1]) の場合

データ型: double

名前のない制約関数の値。double の実数配列として指定します。値のサイズは dataname 内のものと同じです。

最適化問題の複数の制約関数の値は、2 通りの方法で指定できます。

  • 最適化問題の Constraints プロパティは関数ハンドルで、この場合は関数が配列を返します。この場合、関数が返すものより 1 つ高い次元の配列として値を指定します。

  • 最適化問題の 'Constraints' プロパティには、複数の名前付き制約があります。この場合、各名前付き目的関数の名前を dataname 引数として使用し、その関数の値を指定します。

以下のソルバーは、与えられた任意の非線形制約関数値を使用します。

  • paretosearch

  • surrogateopt

以下のソルバーは、すべての反復において、またはすべての集団メンバーについて線形制約が満たされているかを確認します。

  • ga

  • gamultiobj

  • paretosearch

  • patternsearch

  • surrogateopt

例: 2 つの点と 3 つの制約 val = optimvalues(prob,x=[3,5],Objective=[exp(3)+1,exp(5)-1],Constraints=[4 5;-7 -2;0.2 12]) の場合

データ型: double

出力引数

すべて折りたたむ

点と関数値。OptimizationValues オブジェクトのベクトルとして返されます。このベクトルには nval 個のエントリがあります。この nvalval 内の点の数です。

バージョン履歴

R2022a で導入