如何在 Gurobipy 中定义具有二维矩阵乘法的 objective 函数

How to define an objective function with multiplication of 2-d matrices in Gurobipy

我正在尝试将 4 个矩阵的乘积设置为 objective 函数。

用数学术语来说,我的 objective 函数如下所示:

其中 u 是长度为 n 的单位向量,D 是矩阵 mxn,C 是矩阵 nxn,delta 是长度为 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,我的问题是如何正确定义它,以及我能找到合适示例的地方将不胜感激。

m.setObjective() 方法只能用于 Var 个对象。 由于您使用的是 MVar,您可以设置objective 通过 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)

这里有一些问题:

  1. u 必须是长度为 m
  2. 的向量
  3. delta 应该是长度为 n
  4. vector

这是一些更正后的代码:

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)