假設我在間隔[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
- 點到右側和它的左側。如果方向正在增加,請按照正確的時間間隔進行操作,否則繼續向左。每當間隔太小時,只需比較兩端的數字。然而,這個算法仍然不使用我計算的點處的導數的強度。
你可能想看看nelder蜂蜜酒或模擬退火 – iedoc
@iedoc:不,這將是一個可怕的矯枉過正,因爲這個函數被認爲是單峯的。 –
有多少個網格點? –