【问题标题】:Using lambda for a constraint function将 lambda 用于约束函数
【发布时间】:2010-12-03 10:31:53
【问题描述】:
import numpy 
from numpy import asarray

Initial = numpy.asarray [2.0, 4.0, 5.0, 3.0, 5.0, 6.0]       # Initial values to start with


bounds = [(1, 5000), (1, 6000), (2, 100000), (1, 50000), (1.0, 5000), (2, 1000000)] 

# actual passed bounds

b1 = lambda x: numpy.asarray([1.4*x[0] - x[0]])  
b2 = lambda x: numpy.asarray([1.4*x[1] - x[1]])  
b3 = lambda x: numpy.asarray([x[2] - x[3]])     
constraints = numpy.asarray([b1, b2, b3])

opt= optimize.fmin_slsqp(func,Initial,ieqcons=constraints,bounds=bounds, full_output=True,iter=200,iprint=2, acc=0.01)

问题: 我想传递不等式约束。考虑到我有 6 个参数

[ a, b, c, d, e, f]

Initial 值中,我的约束是:

a<=e<=1.4*a   ('e' varies from a to 1.4*a)
b<=f<=1.4*b   ('f' varies from b to 1.4*b)
c>d           ('c' must always be greater than d)

但这不能正常工作。我不知道错误是什么。 有没有更好的方法将我的约束作为函数传递? 请帮帮我。

【问题讨论】:

  • 我不知道numpy,但是a和b是负数吗?否则,我看不出 e 和 f 的任何值如何满足 1.4*a
  • 如果你清楚地说明你正在做什么,你想要发生什么,以及实际发生什么,而不是仅仅粘贴一个代码片段,这将有所帮助。
  • @pear,我试图回答你的问题,但正如 hughdbrown 所说,上面代码中的约束似乎不适用于正数。也许前两个的标志是倒退的?
  • 对不起,都是大于0的正值。我改了,希望是正确的。

标签: python lambda numpy scipy


【解决方案1】:

根据 Robert Kern 的评论,我删除了我之前的回答。以下是作为连续函数的约束:

b1 = lambda x: x[4]-x[0] if x[4]<1.2*x[0] else 1.4*x[0]-x[4]
b2 = lambda x: x[5]-x[1] if x[5]<1.2*x[1] else 1.4*x[1]-x[5]
b3 = lambda x: x[2]-x[3]

注意:此语法需要 Python 2.5 或更高版本。1

要获得约束a&lt;=e&lt;=1.4*a,请注意1.2*aa1.4*a 之间的中点。

在这一点以下,即所有e&lt;1.2*a,我们使用连续函数e-a。因此,当e&lt;a 处理下越界条件时,整体约束函数为负,e==a 下边界为零,然后e&gt;a 直到中点为正。

在中点以上,即全部e&gt;1.2*a,我们用连续函数1.4*a-e代替。这意味着整体约束函数在e&gt;1.4*a 时为负,处理上边界条件,在上边界e==1.4*a 为零,然后在e&lt;1.4*a 时为正,一直到中点。

在中间点,e==1.2*a,两个函数具有相同的值。这意味着整个函数是连续的。

参考:documentation for ieqcons

1 - 这是 Python 2.5 之前的语法:b1 = lambda x: (1.4*x[0]-x[4], x[4]-x[0])[x[4]&lt;1.2*x[0]]

【讨论】:

  • 不,这不起作用。约束函数应尽可能连续,>0表示满足,
  • 系统暂停,正如罗伯特所说,功能必须连续。所以我制作了 lambda x: ([1.4*x[0] - x[0]]),即 lambda x:(max-min)。但我所做的是否正确我不知道。
  • @pear,我不认为这是正确的,因为它在表达式中根本不使用 e (又名x[4])。该表达式等价于1.4*a - a,它的值总是0.4a
  • @system 暂停,谢谢,看来 b1 和 b2 工作得很好,但是 b3 = lambda x: x[2]-x[3] 没有按预期工作。例如有时 func( ) 通过 [150, 192, 1.8487, 2.07364, 194, 216],这里 b1 和 b2 定义明确,但违反了 b3。像这样发生了几次。怎么办?有更好的方式来定义“b2”吗?
  • @pear,对不起,我不知道为什么违反了b3。减去c-d(又名x[2]-x[3])是一个连续函数,当c&gt;d 时为正,c&lt;=d 时为零/负。但显然 1.8487
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-19
  • 2011-09-26
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多