【发布时间】:2014-12-26 16:01:53
【问题描述】:
有没有办法在 scipy.minimize 中自动生成包含多个约束的字典列表?当我使用以下代码时(其中列表约束是同一环上的 sage 多元多项式列表)
cons = [{'type': 'eq', 'fun': lambda s: ((constraint[0])(*s))},
{'type': 'eq', 'fun': lambda s: ((constraint[1])(*s))},
{'type': 'eq', 'fun': lambda s: ((constraint[2])(*s))},
{'type': 'eq', 'fun': lambda s: ((constraint[3])(*s))}]
y0 = [.5 for xx in x]
bnds = tuple([(0.0, 1.0) for xx in x])
ssoln = scipy.optimize.minimize(HH, y0, jac=dHH, method='SLSQP', bounds=bnds, constraints=cons)
print ssoln
我的输出是
status: 0
success: True
njev: 14
nfev: 22
fun: -2.2669026273652237
x: array([ 0.034829615490635, 0.933405952554424, 0.93340765416238 ,
0.093323548109654, 0.335713397575351, 0.413107862378296])
message: 'Optimization terminated successfully.'
jac: array([-3.321836605297572, 2.640225014918886, 2.640252390205999,
-2.273713195767229, -0.682455873949375, -0.351132324172705, 0. ])
nit: 14
但是,如果我尝试通过以下方式创建缺点
cons=[]
for ii in range(len(constraint)):
cons.append({'type': 'eq', 'fun': lambda s: ((constraint[ii])(*s))})
最小化失败
status: 6
success: False
njev: 1
nfev: 1
fun: -4.1588830833596715
x: array([ 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
message: 'Singular matrix C in LSQ subproblem'
jac: array([ 0., 0., 0., 0., 0., 0., 0.])
nit: 1
我的 sage 多项式列表(约束)的长度和多项式的数量可能会因问题而异,我不想像上面首先针对每个问题给出的那样对 cons dict 列表进行硬编码。有没有办法实现自动化?
以下工作,但我知道这不是评估字符串的最佳实践
str1='{\'type\': \'eq\', \'fun\': lambda s: ((constraint['
str2='])(*s))},'
mystr='['
for ii in range(len(constraint)):
mystr=mystr+str1+str(ii)+str2
mystr=mystr+']'
cons = eval(mystr)
【问题讨论】:
-
我自己最近也遇到了这个问题。你有没有找到不涉及评估字符串的解决方案?