【问题标题】:R: Mixed Integer Linear Programming contains a variable that is not part of the modelR:混合整数线性规划包含不属于模型的变量
【发布时间】:2019-09-09 19:26:37
【问题描述】:

当我尝试运行以下脚本时,出现错误消息:表达式包含不属于模型的变量。

appr <- c(0.15, 0.11, 0.10, 0.13, 0.18, 0.20, 0.18, 0.11, 0.07, 0.06, 0.07, 0.08, 0.12, 0.13, 
          0.06, 0.03, 0.04, 0.06, 0.07, 0.08, 0.09, 0.07, 0.04, 0.04, 0.05, 0.07, 0.07, 0.07)

leng <- c(1:28)


Payment_Model <- MIPModel() %>%
  add_variable(x[i], i = 1:7, type = "binary") %>%
  add_variable(x[j], j = 8:14, type = "binary") %>%
  add_variable(x[k], k = 15:21, type = "binary") %>%
  add_variable(x[l], l = 22:28, type = "binary") %>%
  add_variable(d[t], t = 1:3, type = "binary") %>%

  set_objective(sum_expr(x[i] * appr[i], i = 1:7) + sum_expr(x[j] * appr[j], j = 8:14) 
              + sum_expr(x[k] * appr[k], k = 15:21) + sum_expr(x[l] * appr[l], l = 22:28), "max") %>%
  add_constraint(sum_expr(x[i], i = 1:7) == 1) %>%
  add_constraint(sum_expr(x[j], j = 8:14) == 1) %>%
  add_constraint(sum_expr(x[k], k = 15:21) == 1) %>%
  add_constraint(sum_expr(x[l], l = 22:28) == 1) %>%

  add_constraint(sum_expr(x[j]*leng[j], j=8:14) >= 7 + 0.01 + sum_expr(x[i]*leng[i], i=1:7) - 10000*(1-d[1])) %>%
  add_constraint(sum_expr(x[j]*leng[j], j=8:14) <= 7 + sum_expr(x[i]*leng[i], i=1:7) + 10000*d[1]) %>%

  add_constraint(sum_expr(x[k]*leng[k], k=15:21) >= 7 + 0.01 + sum_expr(x[j]*leng[j], j=8:14) - 10000*(1-d[2])) %>%
  add_constraint(sum_expr(x[k]*leng[k], k=15:21) <= 7 + sum_expr(x[j]*leng[j], j=8:14) + 10000*d[2]) %>%

  add_constraint(sum_expr(x[l]*leng[l], l=22:28) >= 7 + 0.01 + sum_expr(x[k]*leng[k], k=15:21) - 10000*(1-d[3])) %>%
  add_constraint(sum_expr(x[l]*leng[l], l=22:28) <= 7 + sum_expr(x[k]*leng[k], k=15:21) + 10000*d[3]) %>%

  add_constraint(sum_expr(x[l]*leng[l], l = 22:28) - 7*(d[1]+d[2]+d[3]) <= 16)


Payment_Model

我尝试在四个计划中最大化批准率(见目标),参数表在 4 周或 28 天的窗口内。需要四个时间表(分别为1:7、8:14、15:21、22:28,作为前4个约束)

我正在努力解决最后一个约束,即如何计算总长度。在这里,长度表示距离最后一次尝试的天数。 1、8、15、22 表示“星期一”。例如,尝试发生在第 (2, 8) 天,长度 = 8(第一个星期二和第二个星期一);尝试发生在 (2, 10),长度 = 3(第一个星期二和星期三),因为如果安排了第一个星期二,我们可以安排在同一个星期三,尽管 10 最初是指第二个“星期三”。

并且这个约束要求四个时间表的总长度

我的脚本有什么问题?谢谢!

【问题讨论】:

  • 如果您用自然或数学语言描述约束条件会有所帮助。这样用户就不必猜测/推断您需要什么。还要添加正在使用的包,ompr 我相信?
  • @Shree 是的,包 'ompr' 和 'ompr.roi'。刚刚修改了问题以解释约束。谢谢!
  • 感谢您添加详细信息,但仍不清楚。这意味着“尝试发生在第 (2, 8) 天,长度 = 8;尝试发生在 (2, 10),长度 = 3”?我猜x[i] 是尝试,但长度是多少?
  • 是的,第一步,x2= 1,然后长度 = 2(第一个星期二)。第二步,x8 = 1,安排在第二个星期一,总长度等于 8-0 = 8(长度是到第二个星期一的天数)。总长度可以读取为距离最后一个(第四个计划)的天数
  • 对不起,我放弃了。您根本没有为其他人提供任何上下文来理解问题。我建议用自然语言明确定义问题陈述,即输入、目标、约束和决策变量。但是,这是我的建议:您似乎需要对某些特定索引分组应用最后一个约束。只需在模型之外创建该索引集,然后在 sum_expr() 中使用它。

标签: r constraints linear-programming mixed-integer-programming


【解决方案1】:

想通了:

  Payment_Model <- MIPModel() %>%

  add_variable(x[i], i = 1:28, type = "binary") %>%
  add_variable(d[t], t = 1:3, type = "binary") %>%

  set_objective(sum_expr(x[i] * appr[i], i = 1:28), "max") %>%

  add_constraint(sum_expr(x[i], i = 1:7) == 1) %>%
  add_constraint(sum_expr(x[j], j = 8:14) == 1) %>%
  add_constraint(sum_expr(x[k], k = 15:21) == 1) %>%
  add_constraint(sum_expr(x[l], l = 22:28) == 1) %>%

  add_constraint(sum_expr(x[j]*leng[j], j=8:14) >= 7 + 0.01 + sum_expr(x[i]*leng[i], i=1:7) - 10000*(1-d[1])) %>%
  add_constraint(sum_expr(x[j]*leng[j], j=8:14) <= 7 + sum_expr(x[i]*leng[i], i=1:7) + 10000*d[1]) %>%

  add_constraint(sum_expr(x[k]*leng[k], k=15:21) >= 7 + 0.01 + sum_expr(x[j]*leng[j], j=8:14) - 10000*(1-d[2])) %>%
  add_constraint(sum_expr(x[k]*leng[k], k=15:21) <= 7 + sum_expr(x[j]*leng[j], j=8:14) + 10000*d[2]) %>%

  add_constraint(sum_expr(x[l]*leng[l], l=22:28) >= 7 + 0.01 + sum_expr(x[k]*leng[k], k=15:21) - 10000*(1-d[3])) %>%
  add_constraint(sum_expr(x[l]*leng[l], l=22:28) <= 7 + sum_expr(x[k]*leng[k], k=15:21) + 10000*d[3]) %>%

  add_constraint(sum_expr(x[l]*leng[l], l = 22:28) - sum_expr(7*d[t], t=1:3) <= 16)


Payment_Model

solution_Sunday <- solve_model(Payment_Model, 
                        with_ROI(solver = "glpk",
                                 verbose = TRUE))


get_solution(solution_Sunday, x[i])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多