ネルダー–ミード法

提供: testwiki
ナビゲーションに移動 検索に移動

ネルダー–ミード法(ネルダー–ミードほう、テンプレート:Lang-en-short)や滑降シンプレックス法テンプレート:Lang-en-short)やアメーバ法テンプレート:Lang-en-short)は、最適化問題アルゴリズム。導関数は不要。1965年に John A. Nelder と Roger Mead が発表した[1]

概要

n + 1 個の頂点からなる n 次元の単体(シンプレックス)をアメーバのように動かしながら関数の最小値を探索する。反射、膨張、収縮の3種類を使い分けながら探索する。

Rの汎用的最適化の optim() のデフォルトのアルゴリズムとしても使われている。

線形計画法の1つであるシンプレックス法と名前はまぎらわしいが、基本的に無関係である。

擬似コード

f(𝐱) の最小化を行う。𝐱 は n 次元のベクトル。関数の引数は探索開始点。定数は一般的には α=1,γ=2,ρ=1/2,σ=1/2 を使用する。𝐞i は単位ベクトル。

function nelderMead(𝐱1) {
    𝐱i+1=𝐱1+λ𝐞i for all i {1,,n}
    while (所定のループ回数 や 値の改善が小さくなった) {
        f(𝐱1)f(𝐱2)f(𝐱n+1) となるようにソートする。
    
        // 重心(𝐱n+1は除外)
        𝐱0=1ni=1n𝐱i 
    
        𝐱r=𝐱o+α(𝐱o𝐱n+1)
        if (f(𝐱1)f(𝐱r)<f(𝐱n)) {
            // 反射
            𝐱n+1=𝐱r
        } else if (f(𝐱r)<f(𝐱1)) {
            // 膨張
            𝐱e=𝐱o+γ(𝐱r𝐱o)
            if (f(𝐱e)<f(𝐱r)) {
                𝐱n+1=𝐱e
            } else {
                𝐱n+1=𝐱r
            }
        } else {
            // 収縮
            𝐱c=𝐱o+ρ(𝐱n+1𝐱o)
            if (f(𝐱c)<f(𝐱n+1)) {
                𝐱n+1=𝐱c
            } else {
                𝐱i=𝐱1+σ(𝐱i𝐱1) for all i {2,,n+1}
            }
        }
    }
}

脚注

テンプレート:Reflist

テンプレート:最適化アルゴリズム

テンプレート:Computer-stub