【问题标题】:Can I send arguments to a constraint function using scipy.optimize.NonlinearConstraint?我可以使用 scipy.optimize.NonlinearConstraint 将参数发送到约束函数吗?
【发布时间】:2021-01-20 03:04:11
【问题描述】:

我有一个非线性约束的有界优化问题,我正在尝试解决。非线性约束函数需要参数,这是我无法使其工作的地方。下面是我遵循的结构。如何将参数arg3, arg4, arg5 发送到约束函数cons

from scipy.optimize import (BFGS, SR1, Bounds, NonlinearConstraint, minimize)

def objfcn(x, arg1, arg2):
    ...
    return out1

def cons(x, arg3, arg4, arg5):
    ...
    return out2


bounds = Bounds([-d, -d, -d, -d], [d, d, d, d])
nonlinear_constraint = NonlinearConstraint(cons, 0.0, 0.0, jac='2-point', hess=BFGS())
res = minimize(objfcn,
                x0,
                args=(arg1, arg2),
                method='trust-constr',
                jac="2-point",
                hess=SR1(),
                constraints=[nonlinear_constraint]
                options={'verbose': 1},
                bounds=bounds)

编辑:目前不太好的解决方案是我通过全局变量将参数传递给约束函数 cons()。

【问题讨论】:

  • 只需将x,arg1,arg2,arg3,arg4,arg5 传递给两者。
  • 您好欧文,感谢您的建议。我无法让它工作,我收到错误“TypeError: cons() missing 3 required positional arguments: ...”。
  • 对不起,那是错误的。提供第二次尝试作为答案。

标签: python optimization scipy-optimize-minimize


【解决方案1】:

trust-constr 与其他受约束的求解器有一些不同的方法。我没有看到将参数传递给约束的直接方法。当然,我们总是可以尝试将东西打包到一个类中。

from scipy.optimize import (BFGS, SR1, Bounds, NonlinearConstraint, minimize)

class problem:
  arg1 = 1
  arg2 = 2
  arg3 = 3

  def f(self,x):
    return -x[0]*self.arg1-x[1]*self.arg2

  def g(self,x):
    return x[0]-self.arg3*x[1]

p = problem()


bounds = Bounds([0,0], [2,3])
nonlinear_constraint = NonlinearConstraint(p.g, 0.0, 0.0, jac='2-point', hess=BFGS())
res = minimize(p.f,
                x0=[0,0],
                method='trust-constr',
                jac="2-point",
                hess=SR1(),
                constraints=[nonlinear_constraint],
                options={'verbose': 1},
                bounds=bounds)
res 

【讨论】:

  • 嗨 Erwin,谢谢,这看起来是一个不错的解决方案,也是我思考这个问题的新方法。我会试试这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多