【问题标题】:Use of max command inside quicksum - gurobi with python在 quicksum 中使用 max 命令 - gurobi with python
【发布时间】:2017-06-27 16:48:03
【问题描述】:

我正在尝试在使用 gurobi 和 python 的 quicksum 命令中包含一个 python“max”命令。在 LinExpr 限制下,这样做显然会出错,因为它不被接受。

shutdowncost = quicksum(quicksum(shutdown_cost[i] * max((v[hour -1, i] - v[hour, i]),0) for i in num_gen) for hour in hour_range)

V 是模型中的二元变量,其余为固定变量。问题是在 v[hour - 1, i] 为 0 且 v[hour, i] 为 1 的情况下,shutdowncost 为负数。

是否有其他命令可以替代quicksum里面的max命令?

【问题讨论】:

  • 是否允许此操作:list.sort(reverse=True)[0]?
  • 你为什么使用gurobi?用纯 Python 解决怎么样(例如 numpy)?
  • 使用 gurobi 作为优化工具箱。感谢 cmets - 我能够通过为 shutdowncost 引入新变量并将其限制为等于此命令来解决此问题。

标签: python gurobi integer-programming mixed-integer-programming


【解决方案1】:

这是一篇讨论启动和关闭约束的论文:MIPFormulation。他们使用符号:

  • u[t] 1 表示在线,0 表示离线,二进制(状态)
  • v[t] 1 表示开启该时间段,二进制(turn_on)
  • w[t] 1 表示关闭该时段,二进制 (turn_off)

这些 gurobi 二进制变量是使用约束定义的:

  • u[t] - u[t-1] == v[t] - w[t]
  • v[t] + w[t]

那么你的shutdowncost就可以定义了:

  • shutdowncost = quicksum([shutdown_cost[i] * w[hour, i] for i in num_gen for hour in hour_range])

(不需要 2 个快速总和!) 然后可以在您的目标函数或其他约束中使用此关闭成本。而且更容易看到正在发生的事情。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多