【问题标题】:Add constraint in GurobiPy using conditional decision variable使用条件决策变量在 GurobiPy 中添加约束
【发布时间】:2021-01-23 16:31:08
【问题描述】:

我是优化新手,并且有一个相当基本的查询。

我有一个模型,其中包含两个随时间变化的决策变量 xy。我想根据x[t-1]t 时为y 添加一个条件约束,这样我就实现了以下代码:

for t in model.timesteps:
        if t>1:
            if model.x[t-1] <= 1:
                model.addConstr(model.y[t] >= 100)
            elif model.x[t-1] <= 0.5:
                model.addConstr(model.y[t] >= 50)
            elif model.x[t-1] <= 0.3:
                model.addConstr(model.y[t] >= 20)

但是,上面的代码会产生错误:

文件“tempconstr.pxi”,第 44 行,在 gurobipy.TempConstr.bool gurobipy.GurobiError: Constraint has no bool value(你在尝试“lb

在阅读了本页之前的相关查询后,我相信我可能需要使用二进制指标变量来实现上述内容。但是,我不确定这是否会解决上述问题。

谁能给我指出正确的方向吗?

提前非常感谢!

【问题讨论】:

  • x[t-1] 是否曾经 > 1?您是否担心像 x[t-1] = 0.50001 这样的边缘情况?
  • 您好,感谢您的回复!不,x[t-1] 在 [0,1] 之间,边缘情况不是问题。

标签: python optimization linear-programming gurobi


【解决方案1】:

首先,我假设您的操作顺序不正确;你打算右边是 20 代表 0 ≤ x[t-1] ≤ 0.3,50 代表 0.3

更大的问题是您将 Python 编程与 MIP 建模混合在一起。您需要将该逻辑转换为 MIP 模型。有几种方法可以做到这一点。一种是使用分段线性约束来表示 y[t] 约束的右侧值。但是,我更喜欢明确地对此进行建模。有几个类似的选项;这里有一个我认为很容易理解的:添加二进制变量 z[0]、z[1] 和 z[2] 来表示 x[t-1] 的 3 个范围;这给出了以下代码:

for t in model.timesteps:
  if t>1:
    z = model.addVars(3, vtype='B', name="z_%s" % str(t))
    model.addConstr(x[t-1] <= z.prod([0.3, 0.5, 1.0]))
    model.addConstr(y[t] >= z.prod([20, 50, 100]))
    model.addConstr(z.sum() == 1)

【讨论】:

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