【问题标题】:Incompatible dimensions in Gurobi pythonGurobi python中的不兼容尺寸
【发布时间】:2021-01-08 16:15:52
【问题描述】:

我正在尝试使用 Gurobi 解决线性规划问题,尽管我遇到了在我的第一个约束中已经存在不兼容维度的问题。我的向量 b 的形状为 (3, 1),我的决策变量 lamb_obj 的形状为 (3,)。 有人可以帮我解决这个维度不兼容的问题吗?

picture 描述了我的线性规划问题。

第一个约束是向量乘法由两个相乘值之和相加。我的代码如下所示:

import gurobipy as gp
from gurobipy import GRB
from gurobipy import *
import numpy as np
import numpy.random as rd
import matplotlib.pyplot as plt
import pandas as pd
import math

# Parameters of the lot-sizing problem
N = 2
c = [3.901260342, 1.948694185]
t = np.array([[0, 8.40717256], [2.550951155, 0]])
dmax = 20
Gamma = 20*np.sqrt(N)

b = np.array(([20],[20],[Gamma]))
I = np.identity(2)
A = np.vstack((I, [1,1]))

model = gp.Model('RO')      # Define a model

x = model.addVars(N, lb=0, ub=20, vtype=GRB.CONTINUOUS, name='x')
V = model.addVars(N, N, vtype=GRB.CONTINUOUS, name='v')
u = model.addVars(N, N, vtype=GRB.CONTINUOUS, name='u')
tau = model.addVar(name='tau')
lamb_obj = model.addMVar((N + 1,), lb=0, vtype=GRB.CONTINUOUS, name='lamb_obj')
lamb_1 = model.addMVar((N, N + 1), ub=0, vtype=GRB.CONTINUOUS, name='lamb_1')
lamb_2 = model.addMVar((N, N, N + 1), ub=0, vtype=GRB.CONTINUOUS, name='lamb_2')

model.addConstrs(b.T @ lamb_obj + quicksum(t[(i,j)]*u[(i,j)] for i in range(N) for j in range(N)) <= tau, name='blambobj')
model.optimize()

编辑:问题似乎在尺寸为 (1,) 的 (b.T@lamb_obj) 部分和 quicksum(t[(i,j)]*u[(i,j) 之间)] 部分应该是一个标量。

【问题讨论】:

    标签: python numpy linear-algebra linear-programming gurobi


    【解决方案1】:

    Gurobi Community Forum 已经回答了这个问题。为了完整起见,我复制了答案:

    MVar 对象用于构建矩阵表达式。在您的情况下,术语 b^T⋅λ_obj 是一个简单的向量乘以向量,即只是一个 ∑ b_i⋅λ_obj_i for i in 1..N+1

    您可以将第一个约束建模为

    N = 2
    t = np.array([[0, 8.40717256], [2.550951155, 0]])
    Gamma = 20*np.sqrt(N)
    b = [Gamma for i in range(N+1)]
    model = gp.Model('RO')
    u = model.addVars(N, N, vtype=GRB.CONTINUOUS, name='u')
    tau = model.addVar(name='tau')
    lamb_obj = model.addVars(N + 1, lb=0, vtype=GRB.CONTINUOUS, name='lamb_obj')
    model.addConstr( quicksum( b[i]*lamb_obj[i] for i in range(N+1)) + quicksum(t[i,j]*u[i,j] for i in range(N) for j in range(N)) <= tau, name="blambobj")
    model.optimize()
    

    您还可以保留 lamb_obj 变量作为 MVar 并且仍然可以通过使用 tolist() 函数以列表形式访问变量。

    lamb_obj = model.addMVar((N + 1,), lb=0, vtype=GRB.CONTINUOUS, name='lamb_obj')
    lamb_obj_list = lamb_obj.tolist()
    model.addConstr( quicksum( b[i]*lamb_obj_list[i] for i in range(N+1)) + quicksum(t[i,j]*u[i,j] for i in range(N) for j in range(N)) <= tau, name="blambobj")
    

    您可以以类似的方式处理其余的约束。

    附带说明。您可以删除 from gurobipy import GRB 行,因为您使用星号从后续行中的 gurobipy 模块导入所有内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-11
      • 2016-08-26
      • 2021-01-18
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2015-02-18
      • 2013-08-21
      相关资源
      最近更新 更多