使用非线性函数从决策变量和一些附加输入计算出的不等式约束求解非凸优化。可以将约束(示意性地,仅作为示例)放入一个返回向量输出的函数中,例如,使用一些任意不等式:
extras = 0.25
kwdsbas = dict(extras = extras)
@with_penalty(quadratic_inequality, kwds = kwdsbas)
def cc(x, extras): # <= 0
# some code to evaluate a number of inequalities -> vector
temp = np.array([np.sum(x)**2-extras/2, np.sum(x)**0.5-extras])
return temp
现在,当我尝试评估某些 x = [1,2,3,4,5] 的惩罚时,我收到如下错误
x = [1,2,3,4,5]
cc(x)
Traceback (most recent call last):
File "<ipython-input-17-0b59507ea199>", line 1, in <module>
cc(x)
File "/Users/vilkov/anaconda3/lib/python3.7/site-packages/mystic/penalty.py", line 352, in func
return float(2*_k)*max(0., pf)**2 + f(x, *argz, **kwdz) #XXX: use 2*k or k=200?
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
因为我有数千个不等式要放入惩罚中,所以我不能将它们中的每一个放入单独的函数中。此外,所有不等式都是使用一些有效的算法联合计算的,并且使用一个函数很有意义。当我尝试使用符号求解器时,它基本上会由于太多的不等式和变量(> 500 个不等式和> 1000 个决策变量)而崩溃。
因此,问题是:如何使用向量值函数输出来指定神秘惩罚?