[0,1]
に定義された関数f
は滑らかで、ある時点まで増加し、その後は減少し始めます。a
この区間にはグリッドがx[i]
あります。一定のステップサイズがdx = 0.01
であり、最悪ケースのシナリオで最小評価数f
を実行することによって、これらのポイントのうち最も高い値を持つポイントを探したいと思います。私は勾配のような方法に触発されたものを適用することで網羅的な検索よりもはるかに良いことができると思う。何か案は?私はおそらくバイナリ検索や放物線のようなものを考えていました。計算の最大数でグローバルな最大値を見つけよう
def optimize(f, a, b, fa, fb, dx):
if b - a <= dx:
return a if fa > fb else b
else:
m1 = 0.5*(a + b)
m1 = _round(m1, a, dx)
fm1 = fa if m1 == a else f(m1)
m2 = m1 + dx
fm2 = fb if m2 == b else f(m2)
if fm2 >= fm1:
return optimize(f, m2, b, fm2, fb, dx)
else:
return optimize(f, a, m1, fa, fm1, dx)
def _round(x, a, dx, right = False):
return a + dx*(floor((x - a)/dx) + right)
考え方は次のとおりです: - 右に、それの左にポイント間隔の真ん中を見つけ、m1
とm2
を計算
この
は私がコード化された二分のような方法です。その方向が増加している場合は、適切な間隔で移動して同じ操作を行い、そうでない場合は左に移動します。間隔が小さすぎる場合は、両端の数字を比較するだけです。しかし、このアルゴリズムは計算したポイントで微分の強さを使用しません。
ネルーダー・ミードやシミュレーテッド・アニーリングのようなものを調べたいかもしれません。 – iedoc
@iedoc:いいえ、それは関数が単峰性であることが知られているので、恐ろしい過度のものです。 –
グリッドポイントはいくつありますか? –