我在用scipy.optimize.minimize.最小化“SLSQP”方法,根据文件:
bounds : sequence, optional
Bounds for variables (only for L-BFGS-B, TNC and SLSQP). (min, max) pairs for >each element in x, defining the bounds on that parameter. Use None for one of min >or max when there is no bound in that direction.
我想知道,对于变量x(0,15)&;(30,50);(x在0到15之间,在30到50之间)是否可以定义一个不连续的边界
或者有其他更好的方法来实现这个目标吗?在
提前谢谢你们!在
这将使模型不可行。没有这样的
x
。你可能是说:x在0和15之间或在30和50之间
这是非凸的,因此标准局部解算器对此有困难。它通常使用额外的二进制变量建模:
当然,这假设您可以处理二进制变量(SLSQP不能)。具有二元变量和非线性约束(或目标函数)的模型称为MINLP模型(混合整数非线性规划)。这类模型的求解器是现成的。在
其他一些可行的方法:
0 ≤ x ≤ 15
,一次使用30 ≤ x ≤ 50
。然后选择最好的解决方案。在scipy.optimize.basinhopping
全局解算器帮助您摆脱局部最优。这不是一个严格的算法(没有保证),但它可以帮助。在一些通常不起作用的方法:
δ ∈ [0,1]
并添加约束δ(1-δ)=0
,而不是二进制变量δ ∈ {0,1}
。通常这会让你陷入困境。在x ∈ [15,30]
,则向目标添加惩罚。局部解算器也不适用。在下面是一个实现basinhopping方法的尝试described by Erwin Kalvelagen。在
首先,构造一个根在0、15、30和50的多项式 在所需区域为正:
现在可以使用该多项式作为约束:
^{pr2}$收益率
注意,最初的猜测是在}设法在
40
处,但是{x = 15
处找到另一个非连续区间的最小值。 使用与两个间隔之间的距离顺序相同的步长对于让basinhopping
有机会从两个间隔进行采样非常重要。在如果没有basinhopping,
optimize.minimize
使用带有非凸约束的SLSQP可能无法从所有允许的区间进行采样。例如显示您必须运行
optimize.minimize
两次,并在每个间隔内进行猜测 为了找到真正的最小值。在相关问题 更多 >
编程相关推荐