如何解决在优化变量中使用“加到 1”约束进行优化
我正在尝试使用 scipy minimize
函数制定优化问题。但是,我遇到了以下无法解决的问题:
我想要使成本函数 F(X) 最小化的 X = [x1,x2,x3,x4,x5]
。然而,这个 X 向量是必须加到 1 的百分比值,即 np.sum(X) = 1
。
问题是:例如,如果我使用具有一些初始值(例如 X0 = [0.2,0.2,0.2]
)的“SLSQP”方法,它将尝试增加每个值以找到某个收敛方向。例如,该算法将使 X0 -> [0.21,0.2]
。但这不可能发生,因为 np.sum(X) = 1
是我计算目标函数的要求。
使用约束也无济于事!我可以用 np.sum(X) = 1
做一个约束。然而,最小化算法只会在计算目标函数后检查约束。
有人知道如何处理这样的问题吗?
非常感谢!
解决方法
当 X 超出其边界时,我通常使用的 NLP 求解器不会要求进行函数和梯度评估。这意味着我们可以通过添加适当的下限来保护 sqrt(x)
和 log(x)
之类的东西。
当我们评估函数和梯度时,不能假设约束成立。
如果您的函数假定 sum(X)=1
,您可以调用 F(X/sum(X))
。唯一的复杂之处在于 X=0
时。在这种情况下,为 F 返回一个较大的值,以便求解器远离它。
must sum to 1 约束有效地减少了您需要优化的变量数量。如果您知道除一个变量之外的所有变量的值,则其余值由约束隐含。它必须正好是 1 - sum(other_vars)
您可以优化四个变量并计算第五个变量,而不是优化五个变量 X = [x1,x2,x3,x4,x5]
。
优化问题的这种表述避免了在所有 X 都非常低时可能出现的不精确性。
如果变量是百分比,您需要分别指定 0 和 1 的下限和上限。
此外,您需要约束 X = [x1,1 - (x1 + x2 + x3 + x4)]
以避免负 x1+x2+x3+x4 <= 1
。 (这个
x5
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。