【问题标题】:How to multiply variable matrix by coefficient matrix in Python, using Gurobi如何使用 Gurobi 在 Python 中将变量矩阵乘以系数矩阵
【发布时间】:2021-09-17 14:43:29
【问题描述】:

我想将下面的两个矩阵相乘并设置为我的模型的目标:

m = gp.Model("matrix")
x = m.addMVar((9, 9), vtype=GRB.BINARY, name="x")
c = np.random.rand(9,9)

m.setObjective(x @ c, GRB.MINIMIZE)

这是我想要达到的目标

这给了我以下错误:

错误代码 -1:变量不是一维 MVar 对象

我该如何解决?我想 Gurobi 不接受 2D Mvar 对象乘法

【问题讨论】:

  • 您确定要将表达式x @ matriz_de_coeficients 设置为目标而不是约束吗?即使 Gurobi 会接受它,将结果矩阵设置为目标也没有意义,因为评估的目标总是必须返回一个标量。
  • 既然你提到它,是的,这有点奇怪。我不太确定,但更新了我的问题。你介意看看吗?

标签: python matrix multidimensional-array linear-programming gurobi


【解决方案1】:

正如 cmets 中已经提到的,请注意,两个矩阵的乘积又是一个矩阵,并且评估的目标需要是一个标量,所以这可能不是您想要做的。根据您的图片,您的目标是简单的线性表达式,而不是矩阵乘积。因此,使用 Gurobi 的代数建模接口要容易得多,即Vars 而不是MVars

import gurobipy as gp
from gurobipy import GRB, quicksum as qsum
import numpy as np

M, N = 9, 9
m = gp.Model("matrix")
x = m.addVars(M, N, vtype="B", name="x")
c = np.random.rand(M, N)

m.setObjective(qsum(c[i,j]*x[i,j] for i in range(M) for j in range(N)), GRB.MINIMIZE)

【讨论】:

  • 它解决了这个问题。非常感谢。我现在需要添加约束,每行的总和必须是 == 1,每列的总和必须是
  • 你可以这样做for i in range(M): m.addConstr(qsum(c[i,j]*x[i,j] for j in range(N)) == 1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
相关资源
最近更新 更多