如何在Gurobipy中定义二维矩阵乘积形式的目标函数
问题解决:Gurobi矩阵乘积目标函数定义报错处理
报错原因
- 你定义的
delta是形状为(6,1)的二维MVar对象,Gurobi的矩阵运算接口要求参与线性运算的向量类变量必须是1维结构,因此触发类型校验错误。 - 代码中未显式定义单位向量
u,运行时还会额外触发变量未定义的报错,需补充对应参数。
修正方案
调整delta的形状为1维,同时确保所有参与矩阵乘法的向量均为1维结构即可,修正后的可运行代码如下:
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) # 补充定义长度为3的单位向量u,可根据实际需求调整数值 u = np.array([1/3, 1/3, 1/3]) m = gp.Model("relaxation") # 将delta定义为1维MVar,长度为6 delta = m.addMVar(shape=6, lb=0.0, ub=1.0, vtype=GRB.CONTINUOUS, name='delta') # 此时矩阵乘法运算维度完全匹配:u(3,) @ D(3,6) @ C(6,6) @ delta(6,) 结果为标量,可直接作为目标函数 m.setObjective(u @ D @ C @ delta)
相关示例查询渠道
- Gurobi本地安装路径下的
examples/python文件夹中,包含大量mvar开头的示例代码,覆盖各类矩阵运算、目标函数定义的适配场景。 - Gurobi官方Python API文档中
addMVar、setObjective的参数说明与示例部分,可直接查询不同场景下的语法要求。
内容的提问来源于stack exchange,提问作者ryszard eggink
相关产品推荐
相关产品推荐

