【问题标题】:Is it possible to use a product expression as a constraint in an Ompr optimisation?是否可以在 Ompr 优化中使用乘积表达式作为约束?
【发布时间】:2018-07-18 23:56:50
【问题描述】:

我知道ompr 包中的sum_expr 函数是一种创建具有动态总和的约束的方法。但是,我想知道是否有一种方法可以创建使用乘积而不是总和的约束。或者这在 linear 优化中是不可能的吗?

例如:

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())

如果无法进行线性优化,我应该去哪里寻找?

【问题讨论】:

  • nloptr package 是要走的路
  • @StéphaneLaurent nloptr 不支持二进制变量 AFAIK
  • @ErwinKalvelagen 抱歉,我确实错过了这个假设。

标签: r optimization linear-programming glpk


【解决方案1】:

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

假设我们要建模

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】:

    我设法找到了原始问题的答案。如果对任何人使用,我需要的约束是:

    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。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2019-01-14
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多