Python中Gurobi添加多维度变量触发AssertionError问题咨询
问题核心原因
你遇到的AssertionError是因为目标系数矩阵penalty_matrix的维度与addVars生成的变量索引维度不匹配:
addVars(range(num_s), range(num_p), range(num_d))生成的是三维变量组,维度为(num_s, num_p, num_d),当num_s=2时,共有2×2×2=8个变量;- 但你定义的
penalty_matrix是二维数组,维度为(num_p, num_d)即2×2,只有4个系数值,无法为每个变量分配对应的目标系数,因此触发断言错误; - 当
num_s=1时,变量组维度变为1×2×2,共4个变量,刚好和penalty_matrix的元素数量一致,Gurobi可以按顺序匹配系数,所以错误消失。
解决方案
需要将penalty_matrix调整为与变量维度一致的三维数组。比如如果所有s对应的惩罚系数相同,可以用np.repeat或np.expand_dims扩展维度:
# 扩展为三维:(num_s, num_p, num_d) penalty_matrix = np.repeat(np.expand_dims(penalty_matrix, axis=0), num_s, axis=0)
或者根据实际业务逻辑,生成每个s对应的专属惩罚系数矩阵,确保最终penalty_matrix的形状为(num_s, num_p, num_d)。
修改后的完整代码示例:
import numpy as np import gurobipy as gp from gurobipy import GRB num_p = 2 num_s = 2 num_d = 2 # 生成二维惩罚矩阵后扩展为三维 penalty_matrix_2d = np.array([[1 / num_s * abs(0 - t) for t in range(num_d)] for _ in range(num_p)]) penalty_matrix = np.repeat(np.expand_dims(penalty_matrix_2d, axis=0), num_s, axis=0) model = gp.Model('fixed-example') # 现在变量维度和目标系数维度匹配 error_variable = model.addVars(range(num_s), range(num_p), range(num_d), obj=penalty_matrix, vtype=GRB.BINARY) model.optimize()
内容的提问来源于stack exchange,提问作者TOm_99
相关产品推荐
相关产品推荐

