在Gurobi中添加二进制变量

问题描述 投票:0回答:1

因此,当zz[i, j] = 1之间的距离小于或等于150时,我想添加二进制变量i,其中j,否则z[i, j] = 0。我有一个列表c,其中每个c[i][j]代表ij之间的距离。我当然不能将z设置为下面的普通二进制变量:

y = m.addVars(I, J, vtype=GRB.BINARY, name="assign")

我想添加约束:

# One day mailing
m.addConstrs(
    z[i,j] <= y[i,j] for i in I for j in J,
    "Serve")

# Coverage Constraint
m.addConstr(
   quicksum(h[i] * z[i, j] for i in I for j in J) <= 
        0.9 * quicksum(h[i] * y[i, j] for i in I for j in J),
        "Cover")

其中h是一个整数列表。我如何设置z

python linear-programming gurobi integer-programming
1个回答
0
投票

首先,您需要将z添加为二进制变量:

z = m.addVars(I, J, vtype=GRB.BINARY, name="z")

然后你需要约束来确保z[i, j] = 1当且仅当c[i, j] <= 150。一种方法是使用指标约束:

z = 1 -> c <= 150
z = 0 -> c >= 150

这相当于

c > 150 -> z = 0
c < 150 -> z = 1

您添加如下:

m.addConstrs((z[i, j] == 1) >> (c[i][j] <= 150) for i in I for j in J)
m.addConstrs((z[i, j] == 0) >> (c[i][j] >= 150) for i in I for j in J)

您也可以自己明确地对此进行建模:如果M的值有上限和下限mc[i][j] - 150(即所有M >= c[i][j] - 150 >= mi, j),则可以使用以下约束:

M * (1-z) >= c - 150
m * z <= c - 150

如果c > 150,两个不平等的右边将是积极的。第一个然后迫使1 - z = 1z = 0。第二个不平等将得到满足。

如果c < 150,右侧是负面的。第一个不平等变得微不足道,而第二个不平等迫使z = 1

对于Mc的最大进入将会这样做,对于m,如果所有-150都是非负的,你可以选择c[i][j]

您添加这些约束如下:

m.addConstrs( M * (1 - z[i, j]) >= c[i][j] - 150 for i in I for j in J )
m.addConstrs( m * z[i,j] <= c[i][j] - 150 for i in I for j in J )

请注意,我忽略了c = 150的情况。这是因为对于浮点数,在公差范围内始终只考虑等式,因此没有简单的方法来区分严格和非严格的不等式。你可以用epsilon来估算它,例如:

z = 0 -> c >= 150 + epsilon
© www.soinside.com 2019 - 2024. All rights reserved.