Scipy.optimize:我应该如何正确编写约束?

问题描述

我想使用 scipy.optimize.minimize 求解 (2+x_1)/(1+x_2)-3x_1+4x_3 的最小值,x_1、x_2 和 x_3 的约束范围在 0.1 到0.9.我的代码如下:

rest = [[0.1,0.9],[0.1,0.9]]
cons = [{'type': 'ineq','fun': lambda x: x[i]-0.1 if j == 0 else lambda x: 0.9-x[i]} for i in range(3) for j in range(2)]
# cons = [{'type': 'ineq','fun': lambda x: x[0]-0.1},#        {'type': 'ineq','fun': lambda x: 0.9-x[0]},'fun': lambda x: x[1]-0.1},'fun': lambda x: 0.9-x[1]},'fun': lambda x: x[2]-0.1},'fun': lambda x: 0.9-x[2]}]
res2 = minimize(lambda x: (2 + x[0]) / (1 + x[1]) - 3 * x[0] + 4 * x[2],np.array((0.5,0.5,0.5)),method='SLSQP',constraints=cons)
res2.fun,res2.success,res2.x

运行它并报告类型错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-3caab45922c2> in <module>
      7 #        {'type': 'ineq',8 #        {'type': 'ineq','fun': lambda x: 0.9-x[2]}]
----> 9 res2 = minimize(lambda x: (2 + x[0]) / (1 + x[1]) - 3 * x[0] + 4 * x[2],constraints=cons)
     10 res2.fun,res2.x

~\anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun,x0,args,method,jac,hess,hessp,bounds,constraints,tol,callback,options)
    623         return _minimize_cobyla(fun,**options)
    624     elif meth == 'slsqp':
--> 625         return _minimize_slsqp(fun,626                                constraints,callback=callback,**options)
    627     elif meth == 'trust-constr':

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _minimize_slsqp(func,maxiter,ftol,iprint,disp,eps,finite_diff_rel_step,**unkNown_options)
    410     g = append(sf.grad(x),0.0)
    411     c = _eval_constraint(x,cons)
--> 412     a = _eval_con_normals(x,cons,la,n,m,meq,mieq)
    413 
    414     while 1:

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in _eval_con_normals(x,mieq)
    484 
    485     if cons['ineq']:
--> 486         a_ieq = vstack([con['jac'](x,*con['args'])
    487                         for con in cons['ineq']])
    488     else:  # no inequality constraint

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in <listcomp>(.0)
    484 
    485     if cons['ineq']:
--> 486         a_ieq = vstack([con['jac'](x,*con['args'])
    487                         for con in cons['ineq']])
    488     else:  # no inequality constraint

~\anaconda3\lib\site-packages\scipy\optimize\slsqp.py in cjac(x,*args)
    282                                                  rel_step=finite_diff_rel_step)
    283                     else:
--> 284                         return approx_derivative(fun,x,method='2-point',285                                                  abs_step=epsilon,args=args)
    286 

~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in approx_derivative(fun,rel_step,abs_step,f0,sparsity,as_linear_operator,kwargs)
    424 
    425         if sparsity is None:
--> 426             return _dense_difference(fun_wrapped,h,427                                      use_one_sided,method)
    428         else:

~\anaconda3\lib\site-packages\scipy\optimize\_numdiff.py in _dense_difference(fun,use_one_sided,method)
    495             x = x0 + h_vecs[i]
    496             dx = x[i] - x0[i]  # Recompute dx as exactly representable number.
--> 497             df = fun(x) - f0
    498         elif method == '3-point' and use_one_sided[i]:
    499             x1 = x0 + h_vecs[i]

TypeError: unsupported operand type(s) for -: 'function' and 'function'

我不知道为什么未注释的 cons 和注释的 cons 是不等价的。谢谢回答!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)