这个是这样的。
出现错误的原因是在截止到目前最新的 Gurobi 版本中,不支持直接将变量的大小与0进行比较的约束。需要使用一些代替方法。
如果需要对 Y[i][j] 进行非零判断,然后基于判断结果确定另一个 0-1 变量 q[i] 的取值,可以使用以下代替方法:
# add variables
Y[i][j] = model.addVar(lb=0.0, vtype=GRB.CONTINUOUS, name=f'Y_{i}_{j}')
q[i] = model.addVar(lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name=f'q_{i}')
# add constraints
M = 1000000 # 设置一个足够大的 M 值,以确保线性规划的正确性
model.addConstr(Y[i][j] - M * q[i] <= 0)
model.addConstr(Y[i][j] >= 0)
# 设置 obj,求解
model.setObjective(...)
model.optimize()
以上代码中,我们将 Y[i][j] 定义为连续型变量(GRB.CONTINUOUS
),并使用 M 值将其与Q[i]相关联。具体来说,如果 Y[i][j] 大于等于 0,则将 q[i] 的上界设为 1;否则将 q[i] 的下界设为 0。通过这种代替方法,可以避免在 Gurobi 中使用非等式约束。