如何在 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)
。
这里有一些问题:
- u 必须是长度为 m
的向量
- delta 应该是长度为 n
的 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)
我正在尝试将 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)
。
这里有一些问题:
- u 必须是长度为 m 的向量
- delta 应该是长度为 n 的 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)