所以这里有一个问题,我想最小化一个有多个参数的函数。出于这个原因,我在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]?
1条答案
按热度按时间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
是一个向量函数,它一次计算所有约束: