1

我试图最小化(全局)3个使用公共变量的函数,我试图将它们组合成一个函数并最小化使用L-BFGS-B(我需要为变量设置边界),但事实证明很难平衡每个参数具有权重,即当一个被最小化时,另一个不会。我还尝试使用SLSQP方法来最小化其中一个,同时将其他约束设置为约束,但约束通常被忽略/不满足。以下是需要最小化的内容,所有数学运算都在meritscalculation, meritoflength,中完成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 应该向您展示为什么其中一个a b c接近 0 - 也许其中一个amerit() bmerit() cmerit()比其他的要大? Plots 而不是prints 也很容易。

总结:
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 回答