Python使用Gurobi时如何将变量矩阵与系数矩阵相乘设置目标函数
报错原因
你遇到的报错有两个核心诱因:
- Gurobi的
setObjective方法仅接受标量作为目标函数输入,你直接传入x @ c得到的是一个9×9的二维矩阵,本身就不符合目标函数的格式要求。 - 旧版本Gurobi的MVar矩阵乘法仅支持1维变量的运算,直接对二维MVar做矩阵乘就会抛出
Variable is not a 1D MVar object的错误。
解决方法
根据你的实际需求选择对应写法即可:
场景1:需要实现9×9的x矩阵和9×9的c矩阵做标准矩阵乘法,再把最终得到的9×9结果矩阵的所有元素求和作为目标值
新版Gurobi可以直接调用sum方法降维:import gurobipy as gp from gurobipy import GRB import numpy as np m = gp.Model("matrix") x = m.addMVar((9, 9), vtype=GRB.BINARY, name="x") c = np.random.rand(9,9) obj = (x @ c).sum() m.setObjective(obj, GRB.MINIMIZE)全版本兼容写法:
obj = gp.quicksum(x[i,k] * c[k,j] for i in range(9) for j in range(9) for k in range(9)) m.setObjective(obj, GRB.MINIMIZE)场景2:需要实现x和c的对应位置元素相乘再求和(哈达玛积求和,等价于两个矩阵的Frobenius内积)
新版Gurobi可以打平为1维向量做点乘:obj = x.flatten() @ c.flatten() m.setObjective(obj, GRB.MINIMIZE)全版本兼容写法:
obj = gp.quicksum(x[i,j] * c[i,j] for i in range(9) for j in range(9)) m.setObjective(obj, GRB.MINIMIZE)
设置完目标函数后调用m.optimize()即可正常求解。
内容的提问来源于stack exchange,提问作者Piazzi
相关产品推荐
相关产品推荐

