【问题标题】:Optimization with "add to 1" constraint in optimization variable在优化变量中使用“添加到 1”约束进行优化
【发布时间】:2021-05-03 17:30:36
【问题描述】:

我正在尝试使用scipy minimize 函数来制定优化问题。但是,我遇到了以下无法解决的问题:

我想要X = [x1, x2, x3, x4, x5] 最小化成本函数 F(X)。然而,这个 X 向量是必须加到 1 的百分比值,即np.sum(X) = 1

问题是:例如,如果我使用带有一些初始值的“SLSQP”方法(例如X0 = [0.2, 0.2, 0.2, 0.2, 0.2]),它会尝试增加每个值以找到一些收敛方向。例如,算法将生成X0 -> [0.21, 0.2, 0.2, 0.2, 0.2]。但这不可能发生,因为np.sum(X) = 1 是我计算目标函数的要求。

使用约束也无济于事!我可以用np.sum(X) = 1 做一个约束。而最小化算法只会在计算出目标函数后才检查约束。

有人知道如何处理这样的问题吗?

非常感谢!

【问题讨论】:

  • 请提供MWE
  • 使用F(X/sum(X)) 作为目标。剩下的一个问题:所有x=0。为这种情况返回一个大的 obj。
  • 了不起的欧文,就是这样!您能否将其作为答案发布,以便我接受?
  • 你遇到过增广拉格朗日乘数吗?它可以通过将约束优化转换为无约束优化来为您省去麻烦:D

标签: python optimization scipy


【解决方案1】:

当 X 超出其界限时,我通常使用的 NLP 求解器不会要求函数和梯度评估。这意味着我们可以通过添加适当的下限来保护sqrt(x)log(x) 之类的内容。

当我们评估函数和梯度时,不能假设约束是成立的。

如果你的函数假定sum(X)=1,你可以调用F(X/sum(X))。唯一的并发症是X=0。在这种情况下,为 F 返回一个较大的值,以便求解器远离它。

【讨论】:

  • 顺便说一句,在我的情况下,我不能有任何 Xi = 0,所以 X=0 不是问题。但这确实可能是个问题。
【解决方案2】:

must sum to 1 约束有效地减少了需要优化的变量数量。如果您知道除一个变量之外的所有变量的值,则剩余值由约束隐含。一定是1 - sum(other_vars)

您可以优化四个变量并计算第五个变量,而不是优化五个变量X = [x1, x2, x3, x4, x5]X = [x1, x2, x3, x4, 1 - (x1 + x2 + x3 + x4)]

优化问题的这种表述避免了如果所有 X 都非常低时可能出现的不精确性。

如果变量是百分比,您需要分别指定 0 和 1 的下限和上限。 此外,您将需要约束 x1+x2+x3+x4 <= 1 以避免负面的 x5。 (对于优化器来说,这个 inequality 约束比原来的 equality 约束要容易得多。)

def cost_function(X):
    x1, x2, x3, x4 = X
    x5 = 1.0 - (x1, x2, x3, x4)    
    return F((x1, x2, x3, x4, x5))

x0 = [0.2, 0.2, 0.2, 0.2]  # initial guess: all values equal
minimize(cost_function, x0, 
         bounds=[(0.0, 1.0)]*4, 
         constraints=dict(type='ineq', fun=lambda X: 1.0 - X.sum()))

【讨论】:

  • 对一个非常不同的问题的类似回答:stackoverflow.com/a/45712241/3005167
  • 非常感谢您的回答@kazemakase。做1 - sum(other_vars) 的问题是,如果我们有,例如,x1 = 0.7 和 z2 = 0.8,这将导致 x5 为负数。
  • 我认为这种方法具有与原始帖子相同(或相似)的缺陷。求解器不服从所有迭代的约束。虽然,在这种情况下,总和到 1 总是被遵守,但现在 x5 上的界限没有得到遵守(直到运行结束时问题是最优的 - 并且可行)。所以我们只是将一种不可行性换成了另一种。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2015-06-09
  • 1970-01-01
  • 2020-04-12
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多