1

共通変数を使用する 3 つの関数を (グローバルに) 最小化しようとしています。それらを 1 つの関数に結合し、それを使用して最小化しようとしましたL-BFGS-B(変数の境界を設定する必要があります) が、各パラメーターのバランスをとるのが非常に難しいことがわかりました。つまり、一方が最小化されると、もう一方は最小化されません。また、メソッドを使用して、他の制約を設定しながらそのうちの 1 つを最小化しようとしましSLSQPたが、制約はしばしば無視されるか、満たされていません。最小化する必要があるものは次のとおりです。すべての計算は で行われ、 、 、meritscalculationmeritoflength計算meritofROCからグローバルとして返されます。meritofproximityheightorderreturned

def lengthmerit(x0):
    meritscalculation(x0)  
    print meritoflength
    return meritoflength

def ROCmerit(x0):
    meritscalculation(x0)
    print meritofROC
    return meritofROC

def proximitymerit(x0):
    meritscalculation(x0)
    print  meritofproximity+heightorder
    return meritofproximity+heightorder

共通の x0 (境界を含む) を独立変数として使用してそれらすべてを最小化したいのですが、これを達成する方法はありますか?

4

2 に答える 2

2

これはあなたがやりたいことですか?

minimize a * amerit(x) + b * bmerit(x) + c * cmerit(x)
over a, b, c, x:
    a + b + c = 1
    a >= 0.1, b >= 0.1, c >= 0.1 (say)
    x in xbounds

が の場合、新しい変数 を設定し、目的関数にペナルティ項を追加して制約し、これを最小化しxます。[x0 x1 .. x9]abcx = [a b c x0 x1 .. x9]a + b + c = 1

define fabc( abcx ):
    """ abcx = a, b, c, x
        -> a * amerit(x) + ... + penalty 100 (a + b + c - 1)^2 
    """ 
    a, b, c, x = abcx[0], abcx[1], abcx[2], abcx[3:]  # split
    fa = a * amerit(x)
    fb = b * bmerit(x)
    fc = c * cmerit(x) 
    penalty = 100 * (a + b + c - 1) ** 2  # 100 ?
    f = fa + fb + fc + penalty
    print "fabc: %6.2g = %6.2g + %6.2g + %6.2g + %6.2g   a b c: %6.2g %6.2g %6.2g" % (
                f, fa, fb, fc, penalty, a, b, c )
    return f

bounds = [[0.1, 0.5]] * 3 + xbounds、つまりそれぞれa b c in 0.1 .. 0.5かそこら。
long prints は、アプローチ 0 の 1 つがなぜ他のものよりも大きい のかを示すはずです。s の代わりにs も簡単です。a b camerit() bmerit() cmerit()Plotprint

要約:
1) 上のように紙の上に問題を明確に定式化し
ます。 2) それを Python に翻訳します。

于 2014-02-16T10:33:32.063 に答える
0

これは、スケーリングと重み付けの結果です

目的関数:

merit_function=wa*meritoflength*1e3+wb*meritofROC+wc*meritofproximity+wd*heightorder*10+1000 * (wa+wb+wc+wd-1) ** 2

入力:

abcdex=np.array(( 0.5, 0.5, 0.1, 0.3, 0.1...))

出力:

fun: array([ 7.79494644])

   x: array([  4.00000000e-01,   2.50000000e-01,   1.00000000e-01,
     2.50000000e-01...])


meritoflength : 0.00465499380753.  #target 1e-5, usually start at 0.1
meritofROC: 23.7317956542          #target ~1,  range <33
Heightorder: 0                     #target :strictly 0, range <28
meritofproximity : 0.0             #target:less than 0.02,   range <0.052

数回実行した後、すべての重み付けが境界の最小値にとどまる傾向があることに気付き、最初に始めたスケーリングの問題を手動で調整することに戻りました。

最適化関数が真のグローバル最小値を見つけられない可能性はありますか?

これが私がそれを最小化する方法です:

minimizer_kwargs = {"method": "L-BFGS-B", "bounds": bnds, "tol":1e0 }

ret = basinhopping(merit_function, abcdex, minimizer_kwargs=minimizer_kwargs, niter=10)
zoom = ret['x']

res = minimize(merit_function, zoom, method = 'L-BFGS-B', bounds=bnds, tol=1e-6)
于 2014-02-17T06:23:24.670 に答える