Как определить целевую функцию с умножением 2-d матриц в Гуробипи

#python #gurobi

Вопрос:

Я пытаюсь установить в качестве целевой функции произведение 4 матриц.

В математических терминах моя целевая функция выглядит следующим образом:

где u-единичный вектор длины n, D — матрица mxn, C — матрица nxn, а дельта-переменная длины 3.

Я определил это как:

 D = np.array([[50, 50, 0, 0, 0, 0], [0, 0, 100, 10, 0, 0], [0, 0, 0, 0, 80, 100]])
c = np.array([10, 4, 9, 5, 6, 8])
C = np.diag(c)

m = gp.Model("relaxation")
delta = m.addMVar(shape=(6,1), lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name='delta')
m.setObjective(u@(D @ C @ delta))
 

Но я получаю эту ошибку , в которой говорится gurobipy.GurobiError: Variable is not a 1D MVar object , что мой вопрос в том, как мне правильно ее определить, а также место, где я могу найти подходящий пример, будет весьма признателен.

Ответ №1:

Здесь есть некоторые проблемы:

  1. u должен быть вектором длины m
  2. дельта должна быть вектором длины n

Вот несколько исправленных кодов:

 import numpy as np
import gurobipy as gp
from gurobipy import GRB

D = np.array([[50, 50, 0, 0, 0, 0], [0, 0, 100, 10, 0, 0], [0, 0, 0, 0, 80, 100]])
c = np.array([10, 4, 9, 5, 6, 8])
C = np.diag(c)
u = np.ones(3)

m = gp.Model("relaxation")
delta = m.addMVar(6, lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name='delta')
m.setObjective(u @ D @ C @ delta)
 

Ответ №2:

m.setObjective() Метод может использоваться только для Var объектов. Поскольку вы используете MVar s, вы можете задать цель, используя матричную семантику m.setMObjective() , следующим образом:

 import numpy as np
import gurobipy as gp

u = np.ones(3)
D = np.array([[50, 50, 0, 0, 0, 0], [0, 0, 100, 10, 0, 0], [0, 0, 0, 0, 80, 100]])
c = np.array([10, 4, 9, 5, 6, 8])
C = np.diag(c)

m = gp.Model("relaxation")
delta = m.addMVar(shape=(6,), lb=0.0, ub=1.0, vtype="C", name='delta')
m.setMObjective(None, u @ D @ C, 0.0, xc=delta)
 

Обратите также внимание , что delta должно иметь форму (6,) , а не (6,1) .