#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:
Здесь есть некоторые проблемы:
- u должен быть вектором длины m
- дельта должна быть вектором длины 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)
.