В настоящее время я могу добавить массив Numpy ndarray в Gurobi, используя addMVar
следующим образом:
x = model.addMVar(shape=10,vtype=GRB.INTEGER,lb= Lbvector, ub = Ubvector)
Но это делает весь x целочисленным. Я хочу, чтобы x
был непрерывным по некоторым индексам и целочисленным по некоторым индексам, что-то вроде:
x[[0,2,4,5]]: Continuous type and x[[1,3,6,7,8,9]]: Integer type
Я хотел продолжать использовать переменную типа матрицы, поэтому есть ли способ сделать это с помощью матрицы Переменная типа в Gurobi?
РЕДАКТИРОВАТЬ: Одно решение после комментария, разделив переменную.
Исходная проблема:
model = gp.Model()
lb = np.array([-100,100])
ub = np.array([100,100])
x = model.addMVar(shape=2,vtype=GRB.INTEGER,lb=lb,ub=ub)
model.update()
G = 0.5*np.array([[1,-1],[-1 ,2]])
p = np.array([-2, -6])
quadterm = x @ G @ x
linterm = p @ x
model.setObjective( quadterm + linterm, sense= GRB.MINIMIZE)
A = np.array([[1,1], [-1,2], [2, 1]])
b = np.array([2,2,3])
model.addConstr(A @ x <= b, name="c")
model.Params.OutputFlag = 0
model.optimize()
print(x.X)
print('Obj: %g' % model.objVal)
После разделения переменных:
model = gp.Model()
lb1 = np.array([-100,0])
ub1 = np.array([100,0])
lb2= np.array([0,-1000])
ub2 = np.array([0,1000])
x = model.addMVar(shape=2,vtype=GRB.CONTINUOUS,lb=lb1,ub=ub1)
y = model.addMVar(shape=2,vtype=GRB.INTEGER,lb=lb2,ub=ub2)
model.update()
G = 0.5*np.array([[1,-1],[-1 ,2]])
p = np.array([-2, -6])
quadterm = x @ G @ x + y @ G @ y + x @ G @ y + y @ G @ x
linterm = p @ x + p @ y
model.setObjective( quadterm + linterm, sense= GRB.MINIMIZE)
A = np.array([[1,1], [-1,2], [2, 1]])
b = np.array([2,2,3])
model.addConstr(A @ x + A @ y <= b, name="c")
model.Params.OutputFlag = 0
model.optimize()
print(x.X)
print(y.X)
print('Obj: %g' % model.objVal)
Это на самом деле работает, но есть ли лучший способ справиться с такой проблемой?
Заранее спасибо.