Gurobiの使い方メモ

最終更新日
公開日

Gurobi (gurobipy) の使い方のメモ

目次

ある先生が書いたコードが読めなかったので,その時に調べた使い方のメモ. 似たようなことを色々なやり方で出来るのがややこしい…

変数の追加

m = Model()

# addVar
x: dict[tuple[int,int], Var] = {
    (i, j): m.addVar(vtype=GRB.BINARY, name=f"x({i},{j})")
    for i in range(2)
    for j in range(3)
}
# addVars
y: tupledict[tuple[int,int], Var] = m.addVars(
    [(a, b)
     for a in range(2)
     for b in range(3)],
    vtype=GRB.BINARY, name="y"
)

x[0, 1]y[1, 2]のようにアクセスする.

LPファイルを出力して確認してみると,以下のようになっている.

\ Model GurobiTest
\ LP format - for model browsing. Use MPS format to capture full model detail.
.
.
.
Binaries
 x(0,0) x(0,1) x(0,2) x(1,0) x(1,1) x(1,2)
 y[0,0] y[0,1] y[0,2] y[1,0] y[1,1] y[1,2]
End

制約の追加

m = Model()

# 以下,LPファイルで見分けるために,右辺の定数だけ変えている

# x_{i,0} + y_{i,0} <= 1, forall i
# を表現する場合
# 方法1
for i in range(2):
    m.addConstr(x[i, 0] + y[i, 0] <= 1)
# 方法2
m.addConstrs(x[i, 1] + y[i, 1] <= 2
             for i in range(2))
# これは違う意味(方法2と見た目が似ているので注意)
# \sum_{i=0}^{1} x_{i,2} + y_{i,2} <= 1
# という制約になる
m.addConstr(quicksum(x[i, 2] + y[i, 2]
                     for i in range(2)) <= 3)

# ややこしいばーじょん
# \sum_{i=0}^{1} x_{i,j} + y_{i,j} <= 1, forall j
m.addConstrs(quicksum(x[i, j] + y[i, j]
                      for i in range(2)) <= 4
             for j in range(3))
# 以下と同じ制約
for j in range(3):
    m.addConstr(quicksum(x[i, j] + y[i, j]
                         for i in range(2)) <= 5)

# tupledict.sum() を使ってみる
# \sum_{j=0}^{2} y_{i,j} <= 1, forall i
m.addConstrs(y.sum(i, "*") <= 6
             for i in range(2))

LPファイルを出力して確認してみると,以下のようになっている.

\ Model GurobiTest
\ LP format - for model browsing. Use MPS format to capture full model detail.
.
.
.
Subject To
 R0: x(0,0) + y[0,0] <= 1
 R1: x(1,0) + y[1,0] <= 1
 R2: x(0,1) + y[0,1] <= 2
 R3: x(1,1) + y[1,1] <= 2
 R4: x(0,2) + x(1,2) + y[0,2] + y[1,2] <= 3
 R5: x(0,0) + x(1,0) + y[0,0] + y[1,0] <= 4
 R6: x(0,1) + x(1,1) + y[0,1] + y[1,1] <= 4
 R7: x(0,2) + x(1,2) + y[0,2] + y[1,2] <= 4
 R8: x(0,0) + x(1,0) + y[0,0] + y[1,0] <= 5
 R9: x(0,1) + x(1,1) + y[0,1] + y[1,1] <= 5
 R10: x(0,2) + x(1,2) + y[0,2] + y[1,2] <= 5
 R11: y[0,0] + y[0,1] + y[0,2] <= 6
 R12: y[1,0] + y[1,1] + y[1,2] <= 6
Bounds
.
.
.
End

参考文献