【问题标题】:How to pass arguments to non-linear constraints in scipy.optimize?如何将参数传递给 scipy.optimize 中的非线性约束?
【发布时间】:2021-09-27 16:57:10
【问题描述】:

我正在尝试使用 scipy 优化来解决优化问题。我已经在代码中定义了非线性约束和适应度函数,如下所示。我能够将参数传递给适应度函数,但不能传递给非线性约束。有干净的方法吗?传递给适应度函数的参数和非线性约束是一样的。

def func_nlc1(x, a1, a2):
    .
    .
   return val

def func_nlc1(x, a1, a2):
    .
    .
   return val

def fitness_function(x, args):
    .
    .
   return val



if __name__ == '__main__':

   nlc1 = NonlinearConstraint(func_nlc1, -0.01, 0.01))
   nlc2 = NonlinearConstraint(func_nlc1, -0.01, 0.01))

   bounds = Bounds([0.0, 0.0], [1.0, 1.0])

   result = differential_evolution(self.fitness_function, args=(a1,a2), bounds=bounds, strategy='rand1bin', constraints=(nlc1, nlc2))

【问题讨论】:

  • 什么是“我无法将参数传递给非线性约束。”意思是?您是否阅读过文档并提供了示例?确切的问题是什么? How to Ask
  • 是的,我通读了 scipy.optimize 文档。它没有明确提到我们如何将参数传递给非线性约束。
  • @NaseefUmmer 如果我的回答有帮助,请考虑accepting or upvoting it
  • @joni 谢谢你的解决方案。我检查了它,它的工作原理!

标签: python optimization scipy scipy-optimize


【解决方案1】:

您可以使用 lambda 函数:

a1, a2 = 1, 2 # example values
nlc1 = NonlinearConstraint(lambda x: func_nlc1(x, a1, a2), -0.01, 0.01))
nlc2 = NonlinearConstraint(lambda x: func_nlc1(x, a1, a2), -0.01, 0.01))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多