MIP example-1 에서 풀었던 문제를 다른 방법으로 풀어보자
Maximize
x + y + 2z
Subject to
x + 2y + 3z <= 4
x + y >= 1
x, y, z binary
import gurobipy as gp
from gurobipy import GRB
import numpy as np
import scipy.sparse as sp
# 모델 선언
model = gp.Model("MIP")
# 변수 선언
# 제약식에 binary 조건이 있으므로 type을 binary로 설정
x = model.addMVar(shape=3, vtype=GRB.BINARY, name="x")
# 목적식 세팅
obj = np.array([1.0, 1.0, 2.0])
model.setObjective(obj @ x, GRB.MAXIMIZE)
# 제약식 세팅
data = np.array([1.0, 2.0, 3.0, -1.0, -1.0])
row = np.array([0, 0, 0, 1, 1])
col = np.array([0, 1, 2, 0, 1])
# csr_matrix를 이용한 matrix 생성
A = sp.csr_matrix((data, (row, col)), shape=(2, 3))
# 우변 세팅
rhs = np.array([4.0, -1.0])
# matrix를 이용한 모델 세팅
model.addConstr(A @ x <= rhs, "c")
# 최적화
model.optimize()
문제는 동일하지만 이번에는 numpy array를 이용한다
이전 포스팅 에서 제약식을 하나씩 세팅해 줬다면 이번에는 matrix를 만들어서 한번에 세팅해 줌.
이를 위해서 scipy.sparse의 csr_matrix가 사용되었는데
data
와 각 값에 해당하는 인덱스인 row
, col
을 이용해서 matrix를 표현함.
위 수리모델을 표현할때 유의할 점은 >=
를 <=
로 바꾸기 위해 좌변과 우변 모두에 -1
을 곱해줘서 처리한다는 점임.