Compose-4030:OMLでの最適化アルゴリズム
Tutorial Level: Intermediate
Compose OML言語は、関数値の最小化とゼロ値の検出に使用する最適化ソルバーを提供します。このソルバーには、非制約最小化に使用するfminunc、制約最小化に使用するfminconとga、および連立非線形方程式の解法に使用するfsolveが用意されています。
このチュートリアルでは、次のように定義した2つの交差していない楕円体間の最小距離を探し出す問題で、それぞれのソルバーの機能を紹介します。
(x-1)2/25 + (y-2)2/16 + (z-3)2/9 = 1
(x-12)2/49 +(y-13)2/81 + (z-14)2/36 = 1

最適化問題の定義
(x1,y1,z1)
を1番目の楕円体上にあるポイント、(x2,y2,z2)
を2番目の楕円体上にあるポイントとします。ここでの目標は、これらのポイント間の距離が最短になるようにポイントを選択することにあります。距離の二乗を最小化すると都合がいいので、次のように目的関数fを定義します。
f(x1,y1,z1,x2,y2,z2) = (x1-x2)^2 + (y1-y2)^2 + z1-z2)^2
この最小化問題には、これらのポイントが楕円体上に存在するという制約を適用します。
fsolveで使用する連立方程式の作成
fsolveを使用した最短距離の計算ではラグランジュ乗数法を使用します。この方法は、制約付き最小化問題を連立非線形方程式に変換します。
このチュートリアルでは詳しく説明しませんが、基本的な考え方は、解となるポイントには、それらを結ぶベクトルがそれら各ポイントにおける楕円体の法線ベクトルと平行になるという特性があるということです。この平行条件および解となるポイントが楕円体上に存在するという要件を連立方程式で適用します。その結果は、8 つの方程式から成る連立方程式になります。
- Composeを開始します。
-
ファイルメニューで、開くを選択して、<installation_dir>/tutorials/フォルダでファイルfsolveDemo.omlを探します。このファイルに、連立方程式のコードが記述されています。
この関数をResidualsと呼びます。解の候補となるポイントのペアで構成する系に存在する残余誤差を計算する関数であるからです。
fsolveによる初期値と解の定義
fsolve関数では、解の初期推定値が必要です。この問題の場合は、ほとんどの推定値が適切ですが、便宜上、楕円体の中心に近いポイントを選択します(実際の中心を選択すると、Residualsに過剰な数の0が生成されます)。

各ポイントとそれらの間隔は次のようになります。

fminconで使用する目的関数と制約関数の作成
fsolveで使用するラグランジュ法は、fminconで内部的に実装されるので、fminconでは設定が通常とは異なります。次のように、目的関数と制約関数を明示的に記述します。
- Composeを開始します。
-
ファイルメニューで、開くを選択して、<installation_dir>/tutorials/フォルダでファイルfminconDemo.omlを探します。このファイルに、目的関数と制約関数のコードが記述されています。
fminconは、等式と不等式の両方の非線形制約を扱うことができます。ConFunc()では不等式制約が変数cとして保存されますが、制約が存在しないのでcは空の行列になります。
fminconによる初期値と解の定義
fminconでは、fsolveと同様に初期推定値が必要です。また、この関数では、設計変数に対する限度値も使用できます。コードは次のようになります。

この問題に設定された制約が線形であればConFunc()関数は不要です。その代わり、fminconには、線形不等式制約が3番目と4番目の引数で行列として渡され、線形等式制約が5番目と6番目の引数で行列として渡されます。
各ポイントとそれらの間隔は次のようになります。

gaで使用する目的関数と制約関数の作成
gaは遺伝的アルゴリズムです。この関数は導関数を使用しないので、このデモの問題に関しては、他の方法よりも非効率的です。
- Composeを開始します。
-
ファイルメニューで、開くを選択して、<installation_dir>/tutorials/フォルダでファイルgaDemo.omlを探します。このファイルに、目的関数と制約関数のコードが記述されています。
これはfminconを使用した場合とよく似ています。gaで輪郭をたどることは困難です。代わりに、解が境界線上に存在することから不等式制約を使用します。これにより、gaアルゴリズムで自由な演算経路を使用して解にたどり着くことができます。
gaによる初期値と解の定義

試行錯誤により、この問題では、母集団サイズがデフォルト値を上回ると、より優れた結果が得られることがわかります。

gaには、高精度な結果を期待することはできません。導関数を使用した方法を適用できない問題で使用することをお勧めします。
fminuncで使用する目的関数の作成
fminuncを使用して問題を解くには、その問題を非制約問題に変換する必要があります。その変換を実現するには、制約の記述が別途必要になることがないように、制約に関して目的関数をパラメーター化し直す必要があります。通常は、この処理は不可能です。
- Composeを開始します。
-
ファイルメニューで、開くを選択して、<installation_dir>/tutorials/フォルダでファイルfminuncDemo.omlを探します。このファイルに目的関数のコードが記述されています。
一般的な表記方法を使用すると、次のように楕円体を2つの角度でパラメーター化できます。
x = a*cos(theta) + x0; y = b*sin(theta)*cos(phi) + y0; z = c*sin(theta)*sin(phi) + z0;
次のコードに示すように、楕円体ごとにこれらの角度が2つずつ存在します。
fminuncによる初期値と解の定義
fminuncでは、角度の初期推定値が必要です。この問題の場合は、0以外のほとんどの推定値が適切です。コードは次のようになります。

各ポイントとそれらの間隔は次のようになります。
