Scipy最小化:如何用TNC方法对有界目标的参数进行约束

pgx2nnw8  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(138)

所以这里有一个问题,我想最小化一个有多个参数的函数。出于这个原因,我在TNC方法中使用scipy。问题是我想将这些参数绑定在0和某个值之间t以升序排列,以便args[i]〉args[i-1]。
我试过了

def constraint(args):
    for i in range(len(args)-1):
        if args[i] > args[i+1]:
            return -1
    return 1

然后,我使用以下函数最小化函数PrecomputeTime

def filtration_p_cost (t,alpha,minFiltre,maxFiltre, nh, vh, a, gamma, N, nf, vf):
    mtmax = (2*N)/(t+2)
    if alpha==1.:
        m0 = N
    else:
        r = alpha/(1-alpha)
        m0 = r * mtmax
        mincost = (m0 * t) / (nh * vh) 
        for nfilters in range(minFiltre,maxFiltre+1):
            x_init = [t * float(i) / nfilters for i in range(nfilters)]
            bnds = [(0, t-1)]*nfilters
            cons=({'type':'ineq','fun': con, 'args':x_init})
            res = optimize.minimize(PrecomputeTime, x_init,(nh, vh, nfilters-1, gamma, N, nf, vf), method='TNC', options={'disp':False, 'maxiter':1000, 'eps':0.1, 'ftol':0.0001}, bounds=bnds, constraints = cons)
            if res.fun < mincost:
                mincost = res.fun
                minFilter = nfilters
    return mincost

问题是我的args(x_init)被限制在0和t-1之间,这是正确的,但不是在它们之间,所以我有
出局

success: True
  status: 0
     fun: 52.643118913771495
       x: [ 9.999e+03  5.000e+03]
     nit: 3
     jac: [-5.014e-03  0.000e+00]
    nfev: 33

x:[9999,5000]因为9999〉5000,所以不应该发生什么。我可以做什么来将它们绑定在[0,t-1]之间,以便args[i]〉args[i-1]?

b4lqfgs4

b4lqfgs41#

您的约束函数对约束g(x) = 1 >= 0 if x_i >= x_(i-1)进行建模,这没有意义,可能也不是您想要做的。如果您真的想强制执行严格的不等式x_i > x_(i-1),则必须对所有i使用不等式约束x_i + eps - x_(i-1) >= 0,其中eps〉0是数值公差的一个小的给定常数。
下面的代码片段说明了这种方法。注意,con_fun是一个向量函数,它一次计算所有约束:

def con_fun(args):
    eps = 1e-8
    return np.array([args[i] + eps - args[i-1] for i in range(1, len(args))])

# define the constraint con_fun(args) >= 0 
con = {'type': 'ineq', 'fun': con_fun}

# ... pass the constraint dict to minimize ...

相关问题