微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Gurobi python 中的尺寸不兼容

如何解决Gurobi python 中的尺寸不兼容

我正在尝试使用 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,name='v')
u = model.addVars(N,name='u')
tau = model.addVar(name='tau')
lamb_obj = model.addMVar((N + 1,),name='lamb_obj')
lamb_1 = model.addMVar((N,N + 1),ub=0,name='lamb_1')
lamb_2 = model.addMVar((N,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,) 的 (bT@lamb_obj) 部分和 quicksum(t[(i,j) )] 部分应该是标量。

解决方法

这个问题已经在 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,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,),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,name="blambobj")

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。