使用条件决策变量

时间:2020-10-08 15:21:08

标签: python optimization linear-programming gurobi

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

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

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:约束没有bool值(您要尝试“ lb <= expr <= ub”吗?)

我已经阅读了此页面上的先前相关查询,我相信我可能需要使用一个二进制指标变量才能实现上述目的。但是,我不确定这是否可以解决上述问题。

请问有人在正确的方向给我吗?

非常感谢!

1 个答案:

答案 0 :(得分:0)

首先,我假设您的操作顺序不正确;您打算在0≤x [t-1]≤0.3时右侧为20,在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)