Gurobiの使い方メモ
最終更新日
公開日
Gurobi (gurobipy) の使い方のメモ
目次
ある先生が書いたコードが読めなかったので,その時に調べた使い方のメモ. 似たようなことを色々なやり方で出来るのがややこしい…
変数の追加
Model.addVar
Model.addVars
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
制約の追加
Model.addConstr
Model.addConstrs
tupledict.sum
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
参考文献
- addVars: https://www.gurobi.com/documentation/11.0/refman/py_model_addvars.html
- tupledict: https://www.gurobi.com/documentation/11.0/refman/py_tupledict.html#pythonclass:tupledict
- addConstrs: https://www.gurobi.com/documentation/11.0/refman/py_model_addconstrs.html
- sum: https://www.gurobi.com/documentation/11.0/refman/py_tupledict_sum.html