DIRECT法によるブラックボックス最適化

# はじめに

次の最小化問題を考えます．
```math
f(\boldsymbol{x})\rightarrow\mbox{min.}\quad\mbox{subject to}\quad \boldsymbol{x}\in\left\{
\boldsymbol{x}\left|
x_{\mathrm{min}j}\leq x_{j}\leq x_{\mathrm{max}j}\quad\mbox{for}~\forall j=1,\cdots,n
\right.\right\}
```
ただし，$f$は目的関数，$\boldsymbol{x}=[x\_{1}~\cdots~x\_{n}]^{\mathrm{T}}$は設計変数，$x\_{\mathrm{min}j}$および$x\_{\mathrm{max}j}$は$x\_{j}$の下限値および上限値です．$f$はこの探索空間においてLipschitz連続である（つまり勾配が無限大となる尖った点を持たない）ものと仮定します．

$x\_{j}$（$j=1,\cdots,n$）を$x\_{\mathrm{max}j}-x\_{\mathrm{min}j}$で正規化し，適当な変数変換を用いて$f$を置き換えれば，探索空間は単位超正方形となります．すなわち$x\_{\mathrm{min}j}=0$，$x\_{\mathrm{max}j}=1$としても一般性を失いません．以降はこれを前提とします．

**DIRECT法（DIviding RECTangle method）** は，

 1. 探索空間の超長方形群への分割
 1. 超長方形領域群からの探索空間の選択（潜在的最適領域の抽出）

の二つのプロセスを反復することで最小点が存在する領域を絞り込んでいく，ブラックボックス最適化の一種で，次の文献が出典です．

 - D. R. Jones, C. D. Perttunen and B. E. Stuckman, Lipschizian Optimization Without the Lipschitz Constant, Journal of Optimization Theory and Application, Vol. 79, No. 1, pp. 157--181, 1993.

考え方も実装も比較的分かりやすいのですが，日本語の解説が見当たらないので書いてみました．次の文献も参考にしました．

 - J. Gablonsky, An Implementation of the DIRECT algorithm, Technial report of North Carolina State University, 1998.

なお，[ZM](https://github.com/mi-lib/zm)での実装は[zm\_opt\_direct.c](https://github.com/mi-lib/zm/blob/main/src/zm_opt_direct.c)にあります．

# 探索空間の超長方形群への分割

探索空間の分割は再帰的に行われます．既にある程度反復計算が進み，探索空間（単位超正方形）が幾つかの超長方形領域に分割されている状況から考え始めましょう．$i$番目領域の中心座標を$\boldsymbol{x}\_{\mathrm{C}i}$，各辺の長さを$\{d\_{ij}\}$（$j=1,\cdots,n$）とおき，$d\_{i}=\max\_{j}\\{d\_{ij}\\}$とします．分割は$d\_{ij}=d\_{i}$，つまり長さ最大である辺の方向に行います．そのような辺のインデックスの集合を$\mathcal{I}\_{i}$とおきましょう．例えば下図に示した場合は$d\_{i}=d\_{i1}=d\_{i2}>d\_{i3}$なので，$\mathcal{I}\_{i}=\\{1,2\\}$です．

![DIRECT_divide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/dd3d64f5-416d-92d8-ab67-925f29c991a5.png)

$\mathcal{I}\_{i}$の全ての成分$j$について，$\boldsymbol{x}\_{\mathrm{C}ij+}=\boldsymbol{x}\_{\mathrm{C}i}+(d\_{i}/3)\boldsymbol{e}\_{j}$および$\boldsymbol{x}\_{\mathrm{C}ij-}=\boldsymbol{x}\_{\mathrm{C}i}-(d\_{i}/3)\boldsymbol{e}\_{j}$における目的関数の値$f\_{ij+}=f(\boldsymbol{x}\_{\mathrm{C}ij+})$および$f\_{ij-}=f(\boldsymbol{x}\_{\mathrm{C}ij-})$を求めます．ただし，$\boldsymbol{e}\_{j}$は$j$番目成分のみが1，他は全て$0$の$n$次元ベクトルです．

$w\_{ij}=\min\\{f\_{ij+},f\_{ij-}\\}$とし，領域をまず最小の$w\_{ij}$を与える$j$の方向に3等分割します．次にそれらの中央の領域を，2番目に小さい$w\_{ij}$を与える$j$の方向に3等分割します．残りの$\mathcal{I}\_{i}$の全ての成分$j$についても同様の手続きを行うことで，$i$番目領域の分割が完了します．上図は，$w\_{i1}<w\_{i2}$である場合の分割の様子を示しています．

全探索領域は辺の長さが全て1である超正方形に正規化されているので，上記のように分割された超長方形領域の辺の長さは，ある非負整数$l$を用いて$3^{-l}$と表せます．$l$を辺の**レベル**と呼ぶことにしましょう．

各辺の長さは各辺のレベルで置き換えられます．上図の例では，分割前の超長方形領域の各辺レベルは$\\{l,l,l+1\\}$であり，それが分割によってまず$\\{l+1,l,l+1\\}$に，次に$\\{l+1,l+1,l+1\\}$になっているということです．このように，一つの超長方形領域の辺レベルは$l$か$l+1$のいずれかであり，$j$番目の辺の分割によって$j$番目の辺レベルが1増えることになります．

辺レベルの最大値を，**超長方形領域のレベル**と呼びましょう．レベル$l$の超長方形を分割したとき，最後の分割で生成された領域群のみレベルが1増え，超正方形となります．

上記の$i$番目領域に付随する中心座標$\boldsymbol{x}\_{\mathrm{C}i}$，そこにおける評価値$f\_{i}=f(\boldsymbol{x}\_{\mathrm{C}i})$，そして各辺レベル$\\{l\_{ij}\\}$をまとめて$\boldsymbol{\xi}\_{i}=(\boldsymbol{x}\_{\mathrm{C}i},f\_{i},\\{l\_{ij}\\})$とおきます．また，領域のレベルを$l\_{i}=\max\\{l\_{ij}\\}$とします．次節で説明する潜在的最適領域の抽出における便利のために，これらが同一レベルごとにグルーピングされ，さらに$f\_{i}$に基づいて昇順にソートされているように，全ての超長方形領域群$\mathcal{R}$を作成します．

以上をまとめたアルゴリズムをAlgorithm 1に示します．Algorithm 2は，$\mathcal{I}$を作成するための補助アルゴリズムです．ただし，$w\_{j}$をキーとする挿入ソートを行うために，$\mathcal{I}$は$(j,w\_{j})$を要素に持つものとします．またDIRECT\_AddRect$(\mathcal{R},l,\boldsymbol{\xi})$は，超長方形領域$\boldsymbol{\xi}$を$\mathcal{R}$のレベル$l$のグループに$f\_{i}$が昇順になるよう追加する関数です（アルゴリズムは省略します）．

![algorithm1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/7b7cc84d-a41f-0710-1d61-6dd7c2e18b08.png)
![algorithm2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/54f9a7b9-ec62-042b-db0d-d850695956a9.png)

# 超長方形領域群からの探索空間の選択（潜在的最適領域の抽出）

分割によって得られた超長方形領域群から，次に探索する部分超長方形を選ぶ方法を説明します．前節で述べたように，$\boldsymbol{\xi}\_{i}\in\mathcal{R}$の各辺の長さは$d\_{ij}=3^{-l\_{ij}}$になっています．変数$\tilde{\boldsymbol{x}}\_{ij}=\tilde{x}\_{ij}\boldsymbol{e}\_{j}$（$\tilde{x}\_{ij}\in[-d\_{ij}/2,d\_{ij}/2]$）を定義すると，$f$が探索空間内部でLipschitz連続であることより，次を満たす正の係数$\gamma$が存在するはずです．
```math
\begin{cases}
\,f(\tilde{\boldsymbol{x}}_{ij}+\boldsymbol{x}_{\mathrm{C}i})\geq f_{i}-\gamma\tilde{x}_{ij}
 \qquad\mbox{（$\tilde{x}_{ij}\geq 0$のとき）}
\\
\,f(\tilde{\boldsymbol{x}}_{ij}+\boldsymbol{x}_{\mathrm{C}i})\geq f_{i}+\gamma\tilde{x}_{ij}
 \qquad\mbox{（$\tilde{x}_{ij}< 0$のとき）}
\end{cases}
```
上2式において$\tilde{x}\_{ij}=\pm d\_{ij}/2$とすると，次式を得ます．
```math
\displaylines{
f(d_{ij}\boldsymbol{e}_{i}+\boldsymbol{x}_{\mathrm{C}i})\geq f_{i}-\gamma d_{ij}/2
\\
f(-d_{ij}\boldsymbol{e}_{i}+\boldsymbol{x}_{\mathrm{C}i})\geq f_{i}-\gamma d_{ij}/2
}
```
したがって，$i$番目領域内部では
```math
f(\boldsymbol{x})\geq D_{ij}\overset{\mathrm{def}}{=}f_{i}-\gamma d_{ij}/2
```
が言えます．下の図はこれを説明したものです．

![DIRECT_lipschitz_lowerbound.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/f953365d-c4fd-174b-1a07-5706f087d384.png)

全ての次元成分$j=1,\cdots,n$を合わせて考えれば，
```math
f(\boldsymbol{x})\geq D_{i}\overset{\mathrm{def}}{=}f_{i}-\gamma d_{i}/2
```
（ただし$d\_{i}\overset{\mathrm{def}}{=}\max\_{j}\\{d\_{ij}\\}$）です．

ここで，$x$軸に$d\_{i}/2$，$y$軸に$f\_{i}=f(\boldsymbol{x}\_{\mathrm{C}i})$をプロットした図を考えましょう．

![DIRECT_lowerbound_estimate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/b34f2424-95dd-ef35-60d5-8c65dbc09b0c.png)

点$(d\_{i}/2,f\_{i})$を通る傾き$\gamma$の直線を引くと，その$y$軸切片が$D\_{i}$となります．より小さい$D\_{i}$を持つ領域ほど，潜在的に最小点を含む可能性が高いと言えます．前節で述べた分割方法により，同一の$d\_{i}$すなわち同一のレベルを持つ超長方形領域が複数生成されます．それらのうち$D\_{i}$を最小にするものは，明らかに，それらの中で$f\_{i}$が最小の領域です．

一般的に$\gamma$は未知ですので，上図のような直線を事前に引くことはできません．そこで，「他の全ての領域よりも$D\_{i}$を小さくできる可能性のある領域」を**潜在的最適領域**と呼ぶことにします．すなわち他の任意の$k$番目領域（$k\neq i$）に対して
```math
f_{i}-K d_{i}/2 \leq f_{k}-K d_{k}/2
```
を満たす正の実数$K$が存在するならば，$i$番目領域は潜在的最適領域です．これらは下図における点群の凸包の右下端稜線上頂点に対応する領域（黒丸）に一致します．

![DIRECT_POR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/48acba9d-67ea-2af8-570c-0ef6a76dfede.png)

レベル$l$である領域の数を$n\_{l}$とおきましょう．前節のアルゴリズムによって$\mathcal{r}$がレベル$l$の超長方形領域群$\mathcal{r}\_{l}=\\{\boldsymbol{\xi}^{(l)}\_{1},\cdots,\boldsymbol{\xi}^{(l)}\_{n_{l}}\\}$ごとに分けられ，$f^{(l)}\_{k}$をキーとして昇順にソートされているならば，潜在的最適領域の候補は$\boldsymbol{\xi}^{(0)}\_{1},\cdots,\boldsymbol{\xi}^{(l\_{\mathrm{min}})}\_{1}$に絞られます（ただし$l\_{\mathrm{min}}$は$f\_{\mathrm{min}}$を与える$l$の値）．

なお，出典では
```math
f_{i}-k d_{i}/2 \leq f_{\mathrm{min}}-\varepsilon\left|f_{\mathrm{min}}\right|
```
を満たす$K$が存在することも潜在的最適領域の条件とされています．ただし，$f\_{\mathrm{min}}=\min\_{i}\\{f\_{i}\\}$，$\varepsilon$は設計パラメータです（経験的に$10^{-4}$程度が良いとされています）．これは最小点探索にあまり貢献しない領域の細分割を避ける目的で設けられているものですが，精度を下げる原因になるため本稿では採用しません．

潜在的最適領域群$\mathcal{R}\_{\mathrm{POR}}$を抽出するアルゴリズムをAlgorithm 3にまとめます．Algorithm 4は$\mathcal{R}$から最小値$f\_{\mathrm{min}}$およびそれを与える$l\_{\mathrm{min}}$を求める処理，Algorithm 5は$\mathcal{R}$から潜在的最適領域$\boldsymbol{\xi}$を抽出し$\mathcal{R}\_{\mathrm{POR}}$に移す処理です．$L$は$l$の最大値，すなわち超長方形の辺長さの最小値を決めるレベルです．逆に辺長さの最小値を$\varepsilon$程度に設定するならば，
```math
3^{-L-1}\leq \varepsilon\leq 3^{-L}
\quad\Leftrightarrow\quad
L\leq -\log_{3}\varepsilon\leq L+1
\quad\Rightarrow\quad
L=\lfloor -\log_{3}\varepsilon\rfloor
```
とすれば良いです（ただし，$\lfloor x \rfloor$は$x$を超えない最大の整数を意味します）．

![algorithm3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/a496d0b8-9d84-a2eb-8ccf-585f0d3b5aa7.png)
![algorithm4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/f3b2da78-d453-fb32-276a-81ee8a63e15b.png)
![algorithm5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/fb2f4e45-2d79-2ae0-c507-c60dde6ef64c.png)

# アルゴリズム完成

DIRECT法のアルゴリズムをAlgorithm 6に示します．

![algorithm6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/bea63741-abed-6578-ba94-044252255f60.png)
![algorithm7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706455/759321cc-b9ed-eeb6-c0b0-65bac38a8a62.png)