IPOPTを使った最適化
IPOPT (Interior Point OPTimizer)は,数理最適化問題の局所解を求めるために設計された,大規模非線形最適化のためのソフトウェアパッケージである.
IPOPTLink はWolfram LibraryLink を使ってIPOPT関数にリンクする,Wolframシステムのアプリケーションである.IPOPTLink はIPOPTMinimizeやParametricIPOPTMinimize等,さまざまな関数を提供する.これらの関数はパラメータを使って,または使わないで極小値を求めるのに使用できる.これらはWolfram言語のFindMinimum等の最適化関数で自動的に使用される.
FindMinimum[{x Cos[x], 10 ≤ x ≤ 20}, {x, 11}, Method -> "IPOPT"]しかし,IPOPTLink の関数を直接呼び出して,IPOPTに実装された機能をより柔軟に使用することもできる.
| IPOPTMinimize | IPOPTを使って極小値を計算する |
| IPOPTData | IPOPTMinimizeが返したデータ式 |
| IPOPTMinValue | IPOPTData式から目的関数の極小値を取得する |
| IPOPTArgMin | IPOPTData式から極小値の位置を取得する |
| ParametricIPOPTMinimize | IPOPTを使ってパラメータを伴う極小値を計算する |
IPOPTはの約条件付きの数学的な
次元制最適化問題の解を求めるように設計されている.条件付き最適化問題は,目的関数と呼ばれる,複数の変数の実数値の関数
を制約条件の下で極小化する問題である.制約条件として,変数を制約する条件か,関数で定義される制約条件の2種類を指定することができる.変数を制約する条件は,
(ただし x=(x1,…,xn))という形である.関数の制約条件は,
という形である.
IPOPTMinimizeは,制約条件の種類によって,次の3つの方法で使用できる:
| IPOPTMinimize[f(x),x,x0] | 制約条件のない極小化 |
| IPOPTMinimize[f(x),x,x0,xbounds] | 境界の制約条件付き極小化 |
| IPOPTMinimize[f(x),x,x0,xbounds,g(x),gbounds] | 関数の制約条件と変数の境界による,制約条件付き極小化 |
制約条件なしの極小化
| IPOPTMinimize[f,{x1,…},{x1i0,…}] | 制約条件のない極小化 |
IPOPTLink を使用するためには,パッケージをロードする必要がある.
Needs["IPOPTLink`"]Plot[x Cos[x], {x, 0, 20}]IPOPTMinimizeを使ってIPOPTソルバを呼び出す.目的関数を
,引数変数を{
},初期値を{
}とする.
sol = IPOPTMinimize[x Cos[x], {x}, {10}]IPOPTMinimizeはIPOPTDataオブジェクトを返す.オブジェクトには極小値が含まれる.
fmin = IPOPTMinValue[sol]IPOPTDataオブジェクトは,極小値が見付かった座標点も含んでいる.
minpt = IPOPTArgMin[sol]Plot[x Cos[x], {x, 0, 20}, Epilog -> {Red, PointSize[Large], Point[{First[minpt], fmin}]}]境界の制約付き極小化
| IPOPTMinimize[f,{x1,…},{x1i0,…},{{x1min,x1max},…}] | 境界の制約付き極小化 |
x が区間
に制限された
の極小値を,
から始めて求める.ここでもIPOPTMinimizeを使い,目的関数を
,引数変数を
,初期値を
とする.変数の境界
も指定する必要がある:
sol = IPOPTMinimize[x Cos[x], {x}, {11}, {{10, 20}}]IPOPTMinimizeはIPOPTDataオブジェクトを返す.オブジェクトには極小値と極小化点が含まれる.
{IPOPTMinValue[sol], IPOPTArgMin[sol]}Plot[x Cos[x], {x, 10, 20}, Epilog -> {Red, PointSize[Large], Point[{First[minpt], fmin}]}]sol = IPOPTMinimize[x Cos[x], {x}, {11}, {}, {x}, {{10, 20}}]{fmin, minpt} = {IPOPTMinValue[sol], IPOPTArgMin[sol]}制約条件付き関数の極小化
| IPOPTMinimize[f,{x1,…},{x1i0,…},{{x1min,x1max},…},{g1,…},{{g1min,g1max},…}] | 関数の制約条件と変数の境界による,制約条件付き極小化 |
関数の制約条件と変数の境界による制約条件付き極小化IPOPTMinimize
を円
上で極小化する.制約関数は
であり,上下制約境界は1に等しい.
f[{x_, y_}] = x y Cos[x y];
sol = IPOPTMinimize[f[{x, y}], {x, y}, {1, 0}, {{-1, 1}, {-1, 1}}, {x ^ 2 + y ^ 2}, {{1, 1}}]{fmin, minpt} = {IPOPTMinValue[sol], IPOPTArgMin[sol]}Show[Plot3D[f[{x, y}], {x, -1.5, 1.5}, {y, -1.5, 1.5}, MeshFunctions -> {#1 ^ 2 + #2 ^ 2&}, Mesh -> {{1}}], Graphics3D[{Red, PointSize[.05], Point[Append[minpt, fmin]]}]]ParametricIPOPTMinimize
ParametricIPOPTMinimizeは問題設定において任意の場所にパラメータが存在する極小化問題を設定する際に使用できる.最適化問題はその後,異なるパラメータ値で繰り返し解くことができる.ParametricIPOPTMinimizeはIPOPTMinimizeの引数すべてに加え,最後にパラメータ変数引数{p1,…}を取る.
| ParametricIPOPTMinimize[f,{x1,…},{x1i0,…},{{x1min,x1max},…},{g1,…},{{g1min,g1max},…},{p1,…}] | 制約条件付きのパラメトリックな極小化 |
制約条件付きのパラメトリックな極小化ParametricIPOPTMinimize
pfun = ParametricIPOPTMinimize[x y Cos[x y], {x, y}, {0, -r}, {{-r, r}, {-r, r}}, {x ^ 2 + y ^ 2}, {{r ^ 2, r ^ 2}}, {r}]このステップは関数の前処理とすべての必要な微分を行い,ParametricFunctionを返してパラメータ値を待機する.
実際の極小化はパラメータ値を与えた後に始まり,解はIPOPTData式に保存される.
sol = pfun[1]{fmin, minpt} = {IPOPTMinValue[sol], IPOPTArgMin[sol]}pvals = Range[.1, 2, .1];sols = Map[pfun, pvals];minvals = Map[IPOPTMinValue, sols];ListPlot[Transpose[{pvals, minvals}], PlotStyle -> PointSize[0.02]]Manipulate[sol = pfun[r];{fmin, minpt} = {IPOPTMinValue[sol], IPOPTArgMin[sol]};
Show[Plot3D[x y Cos[x y], {x, -2, 2}, {y, -2, 2}, MeshFunctions -> {#1 ^ 2 + #2 ^ 2&}, Mesh -> {{r ^ 2}}, PlotRange -> {-4, 4}, PlotLabel -> StringJoin["ArgMin: ", ToString[minpt], "
MinValue: ", ToString[fmin]]], Graphics3D[{Red, PointSize[0.05], Point[Append[minpt, fmin]]}]], {{r, 1}, 0.2, 2}]複数のパラメータ値についてIPOPTMinimizeの代りにParametricIPOPTMinimizeを使うと,目的関数と制約関数の処理,および必要なすべての微分を繰り返すことによるオーバーヘッドを削減する.これは複雑さによっては大幅な削減となり得る.
pvals = Range[.1, 10, .1];AbsoluteTiming[Map[IPOPTMinimize[Sum[x * Cos[x + n y], {n, 1, 100}], {x, y},
{#, 0}, {}, {x ^ 2 + y ^ 2}, {{#, #}}] &, pvals];]AbsoluteTiming[pf = ParametricIPOPTMinimize[Sum[x * Cos[x + n y], {n, 1, 100}], {x, y}, {r, 0}, {}, {x ^ 2 + y ^ 2}, {{r, r}}, {r}];Map[pf, pvals];]IPOPTMinimizeを使った極大化
sol = IPOPTMinimize[-Cos[x + y], {x, y}, {1, 0}, {}, {x ^ 2 + y ^ 2}, {{1, 1}}]{fmax, maxpt} = {-IPOPTMinValue[sol], IPOPTArgMin[sol]}工学における例
カムの曲率と半径に制約条件があるとき,凸面カムが1回転する際に,弁の開口面積を最大化するカムを設計する.問題設定はCOPSテストスイートからのものであり,以下にまとめる.
カムの形状は角度6π/5においては半径 rmin の円周であり,設計変数 ri,i=1,…,n は,角度2π/5に均等に配分された角度 θ におけるカムの半径を表す.残りの角度2π/5は,これと対象となる.
以下の制約条件を指定する.各半径 ri は区間{rmin, rmax}において制約される.また,A(ri-1,ri+1)≤A(ri-1,ri)+ A(ri,ri+1)で表される凸面の制約条件もある.ここでA(ri,rj)は原点とカム面の点 ri, rj で定義される三角形の面積である.さらにパラメータ α に依存する曲率についての条件-α ≤(ri+1-ri)/θ ≤α もある.
目的関数を定義するために,弁の開口面積と設計変数 ri には π rv 2(r1+…+rn)/n という単純な線形関係があると仮定する.ここで rv は弁の形状に関連する定数である.
これは,パラメータ rmin,rmax, α のパラメトリックな問題として設定することができる.設計変数には n=20 を選び,
と仮定する.
Needs["IPOPTLink`"]n = 20;
theta = 2 Pi / (5 (n + 1));
vars = Array[r, n];
objfun = -Pi Sum[r[i], {i, 1, n}] / n;
convexconstr = Table[-Infinity ≤ 2. r[i - 1] r[i + 1] Cos[theta] - r[i] (r[i - 1] + r[i + 1]) ≤ 0, {i, 0, n + 1}] /. {r[-1] -> rmin, r[0] -> rmin, r[n + 1] -> rmax, r[n + 2] -> r[n]};
curvatureconstr = Table[-a ≤ (r[i + 1] - r[i]) / theta ≤ a, {i, 0, n}] /. {r[0] -> rmin, r[n + 1] -> rmax};
vars0 = Table[.5 (rmin + rmax), {i, 1, n}];
constr = Map[#[[2]]&, Join[convexconstr, curvatureconstr]];
constrbounds = Map[{First[#], Last[#]}&, Join[convexconstr, curvatureconstr]];
varbounds = Table[{rmin, rmax}, n];pf = ParametricIPOPTMinimize[objfun, vars, vars0, varbounds, constr, constrbounds, {rmin, rmax, a}]sol = pf[1, 2, 1.5]maxarea = -IPOPTMinValue[sol]rsol = MapThread[Rule, {vars, IPOPTArgMin[sol]}]solpts1 = Table[{r[i] Cos[-2. Pi / 5 + theta i], r[i] Sin[-2. Pi / 5. + theta i]}, {i, 1, n}] /. rsol;solpts2 = Map[{#[[1]], -#[[2]]}&, Reverse@solpts1];solpts = Join[solpts1, solpts2];Show[ListLinePlot[solpts, PlotRange -> {{-2.1, 2.1}, {-2.1, 2.1}}, AspectRatio -> 1, Axes -> False, Frame -> True, PlotLabel -> "Cam shape"], Graphics[{Circle[{0., 0.}, 1.]}], Graphics[Map[Point, solpts]]]sol = pf[1, 2, 2]maxarea = -IPOPTMinValue[sol]参考文献
IPOPTはAndreas Wächter氏,Carl Laird氏他によってCOIN-OR Initiativeの一環として書かれたものである.これは以下の論文に基づいている.A. Wächter and L. T. Biegler, 「On the Implementation of a Primal-Dual Interior Point Filter Line Search Algorithm for Large-Scale Nonlinear Programming」,Mathematical Programming 106(1),2006,pp. 25-57.