python - 使用 lambda 作为约束函数

标签 python lambda numpy scipy

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]

初始值中,我的约束是:

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)

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

最佳答案

根据 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<=e<=1.4*a ,请注意1.2*aa 之间的中间点和1.4*a .

低于此点,即全部e<1.2*a ,我们使用连续函数e-a 。因此,当 e<a 时,整体约束函数为负。 ,处理较低的越界条件,下边界为零 e==a ,然后 e>a 为正直到一半。

中点以上,即全部e>1.2*a ,我们使用连续函数 1.4*a-e 。这意味着当 e>1.4*a 时,整体约束函数为负。 ,处理上限越界条件,上限为零 e==1.4*a ,然后当 e<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]<1.2*x[0]]

关于python - 使用 lambda 作为约束函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1511354/

相关文章:

python - Numpy:在求和之前计算具有条件的二维数组的点积

python - 为什么 Python 列表的内存使用量小于预期?

Python:从字符串中删除重复字符的最佳方法

python - QListWidget显示更多项目

python - 抓取需要登录的网站

c# - 将 'Set Next Statement' 强制为 'if' block 时出现 CLR System.NullReferenceException

python - 将元素插入到 numpy 数组的开头和结尾

java - 如何为具有泛型方法的功能接口(interface)创建 lambda 表达式

Java 8 | HashMap 的并行流

python - NumPy:有没有更好的方法来构造具有特定值的特定矩阵?