scipy.optimize紧凑约束
问题描述:
我有一个长度为9的np.array A,它是目标函数中的变量。scipy.optimize紧凑约束
A = [ a1, a2, a3,
b1, b2, b3,
c1, c2, c3], where a1...c3 are real numbers.
with constraints: a1 > a2, a2 > a3,
b1 > b2, b2 > b3,
c1 > c2, c2 > c3
有没有简单的方法来写约束?目前我有以下代码,但随着数组大小变大,很难将它们全部写入。
cons = (
{'type':'ineq',
'fun': lambda x : np.array([x[0]-x[1]])
}
,
{'type':'ineq',
'fun': lambda x : np.array([x[1]-x[2]])
}
,
{'type':'ineq',
'fun': lambda x : np.array([x[3]-x[4]])
}
,
{'type':'ineq',
'fun': lambda x : np.array([x[4]-x[5]])
}
,
{'type':'ineq',
'fun': lambda x : np.array([x[6]-x[7]])
}
,
{'type':'ineq',
'fun': lambda x : np.array([x[7]-x[8]])
}
)
答
我会想象SciPy的喜欢从每个功能,而不是布尔数字输出,让排除了每个功能的两个以上的投入......(*度和所有isht的),你可以做什么就是写一个列表的理解,使功能你...
cons = ({'type':'ineq', 'fun': lambda x: x[i] - x[i+1]} for i in range(len(A)-1))
我不知道你为什么会需要减法的结果转换为1长数组,所以我离开了出来..很容易放回
答
显然,您的约束是每列A
应该(按元素)大于或等于其右侧的列。
你可以制定一个单一的,矢量outpur约束如下:
def cons_fun(x):
A = x.reshape(3,3) # change "(3,3)" according to the dimensions of A
return np.array([A[:,i]-A[:,i+1] for i in range(3-1)]).ravel() # change "3" accordingly
cons = ({'type':'ineq',
'fun' : cons_fun},)
我与SLSQP
经验,矢量输出的限制导致更快的优化时间比提供多个标量输出限制。
非常感谢!这真的很有帮助! – Meng