Gurobi: переменная MVar с целочисленным типом Vtype только для некоторых индексов - PullRequest
0 голосов
/ 20 января 2020

В настоящее время я могу добавить массив 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)

Это на самом деле работает, но есть ли лучший способ справиться с такой проблемой?

Заранее спасибо.

...