Python中Gurobi求解MIP时固定约束索引i的问题求助
解决Gurobi中固定索引i=1的MIP约束问题
问题根源
你的代码存在几个核心错误:
- 列表定义错误:
sh[1,2,3,4,5]写法无效,正确应为sh = [1,2,3,4,5] - 变量未初始化:Gurobi决策变量
w、x、s必须通过model.addVar()或model.addVars()创建,不能直接用列表下标访问 - 索引逻辑依赖变量结构:固定i=1的思路没问题,但前提是变量
x和s的二维索引包含i=1这个维度
修正后的完整代码
import gurobipy as gp from gurobipy import GRB # 初始化数据 d = [18,7,6,5,10,1,8] sh = [1,2,3,4,5] # 修正列表定义 p = len(d) fixed_i = 1 # 要固定的i值 # 创建模型 model = gp.Model("MIP_FixedIndex") # 创建决策变量 w = model.addVars(p, name="w") # 一维变量,对应每个t x = model.addVars(p, sh, name="x") # 二维变量,t∈0~p-1,i∈sh集合 s = model.addVars(p, sh, name="s") # 添加固定i=1的约束 for t in range(p): model.addConstr(w[t] == x[t, fixed_i] - s[t, fixed_i], name=f"Constr_W_{t}") # 示例目标函数(可根据需求修改) model.setObjective(gp.quicksum(w[t] for t in range(p)), GRB.MINIMIZE) # 求解模型 model.optimize() # 输出最优解(可选) if model.status == GRB.OPTIMAL: for t in range(p): print(f"w[{t}] = {w[t].X:.2f}") print(f"x[{t},{fixed_i}] = {x[t,fixed_i].X:.2f}") print(f"s[{t},{fixed_i}] = {s[t,fixed_i].X:.2f}")
关键说明
- 用
model.addVars(p, sh)创建二维变量时,第二个参数直接传入sh列表,i的索引会自动对应1、2、3、4、5,直接通过x[t,1]即可访问i=1的变量 - 若你的t集合从1开始而非0,可将
range(p)改为range(1, p+1),同时创建变量时同步调整索引范围 - 给约束命名是可选操作,但便于后续调试排查问题
内容的提问来源于stack exchange,提问作者Vida
相关产品推荐
相关产品推荐

