代码之家  ›  专栏  ›  技术社区  ›  Will T-E

在OMPR优化中,是否可以使用产品表达式作为约束?

  •  0
  • Will T-E  · 技术社区  · 7 年前

    我知道 sum_expr 中的函数 ompr 包作为创建带有动态和的约束的方法。但是,我想知道是否有一种方法可以创建一个使用乘积而不是求和的约束。或者这在 线性的 优化?

    例如:

    library(dplyr)
    library(ROI)
    library(ROI.plugin.glpk)
    library(ompr)
    library(ompr.roi)
    
    n <- 20
    score <- round(runif(n, 0, 25))
    penalties <- round(runif(n, 0, 25))
    
    model <- MIPModel() %>%
      add_variable(x[i], i = 1:n, type = "binary") %>%
      set_objective(sum_expr(score[i] * x[i], i = 1:n), "max") %>%
      add_constraint(sum_expr(penalties[i] * x[i], i = 1:n) <= 100)
    
    result <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE))
    result$solution
    

    而不是 add_constraint(sum_expr()) 有什么办法吗 add_constraint(product_expr()) ?

    如果线性优化无法实现,我应该在哪里寻找替代方案?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Erwin Kalvelagen    7 年前

    二元变量的乘积可以线性化如下。

    假设我们想做模型

    y = prod(i, x(i))
    x(i), y ∈ {0,1}
    

    我们可以把它写成一组线性不等式:

    y ≤ x(i)   ∀i
    y ≥ sum(i, x(i)) - card(i) + 1
    x(i), y ∈ {0,1}
    

    哪里 card(i) 是i的个数。通常情况下可以进一步简化,但这取决于模型的细节。

    这可以在OMPR中直接实现,并且可以用任何线性MIP解算器求解。

        2
  •  0
  •   Will T-E    7 年前

    我设法找到了我原来问题的答案。对于任何人来说,我需要的约束是:

    add_constraint(sum_expr(x[i] * log(penalties[i]), i = 1:n) >= log(100))
    

    所以换句话说,我要求和对数转换后的惩罚值(对于 x[i] = 1 )针对对数转换的惩罚总数,模拟一个产品约束。

    我最初的问题错误地暗示了一些可能误导读者的东西。我在寻找所有惩罚的产品 x[i]=1 . 不是价值的产物 (penalties[i] * x[i]) 一旦有 x[i] = 0 变为0。

    推荐文章