You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用Gurobi时如何将变量矩阵与系数矩阵相乘设置目标函数

报错原因

你遇到的报错有两个核心诱因:

  1. Gurobi的setObjective方法仅接受标量作为目标函数输入,你直接传入x @ c得到的是一个9×9的二维矩阵,本身就不符合目标函数的格式要求。
  2. 旧版本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 03:00:02